007 服务器和客户端的交互以及编码问题

===============

既然有客户端,那么应该就有网页了

	<h2>输入帐号密码</h2>
	
	<!-- 这里填写的是Servlet的url-pattern -->
	<form action="_006_">
		帐号: <input type="text" name="username"/><br/>
		密码: <input type="text" name="password"/><br/>
		<input type="submit" value="登录"/>
	</form> 

这是servlet

	static  int num=0;
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
			 //获取数据,这个Parameter是我们提交表单的时候name的数值
			String username=request.getParameter("username");
			String password=request.getParameter("password");	
			System.out.println(username+"   "+password);
			
			//获取输出流
			PrintWriter pw1=response.getWriter();
			
			//校验数据
			if ("admin".equals(username) && "123".equals(password))
			{
//				设置状态码,302代表成功,然后下面的setHeader才有效,重定向不需要设置这个
//				response.setStatus(302);
				
				//获取之前的次数,然后+1
//				Object num=getServletContext().getAttribute("count"); 
//				Integer  oldnum=0;
//				if (num!=null)
//				{
//					oldnum=(Integer)num;
//				}
				
				
				//直接利用static来加也可以
				num++;
				
				//设置一个属性,这个属性是用来计算登录成次数的
				ServletContext sev1=super.getServletContext();
				sev1.setAttribute("count", num);
				
				//设置跳转的页面,这是早期写法
				//response.setHeader("Location","_006_successful.html");
				
				//现在一般直接写重定向
				response.sendRedirect("_006_successful.html");
				
				//或者写转发请求
				//request.getRequestDispatcher("_006_successful.html").forward(request, response);
				
				//这2者的区别,重定向是发送302和location给客户端,然后客户端去跳转到页面去
				//地址栏会是真实的页面地址
				//而转发请求是服务器内部给我们跳转到那个页面去,地址栏还是之前的地址
				
				
			}else 
			{
				//会直接向屏幕输出内容
				pw1.write("login  flase");	
			}
			
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGet(request, response);
	}

这是跳转到的页面

	<h1>登录成功</h1>
	<a href="_006_success">点击此获取登录次数</a>

这是获取结果的servlet

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		//获取计算后的count
		ServletContext sev1=super.getServletContext();
		Integer count=(Integer)sev1.getAttribute("count");
		
		//直接向网页写入内容
		response.setContentType("text/html; charset=UTF-8");
		response.getWriter().write("登录了"+count.intValue()+"次");
	}

下面是编码问题

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// get数据在地址栏输入即可 ?user=huangtiandi&password=123 前面有一个?代表参数和路径的分割
		test01(request);
	}

	// 响应数据乱码问题
	private void test04(HttpServletResponse response) throws IOException
	{
		// 以字符流的方式写数据,只能写文字
		// response.getWriter().write("<h1>hello<h1>");

		// 以字节流的方式写数据
		response.getOutputStream().write("<h1>hello2<h1>".getBytes());

		// 指定输出到客户端的时候,这些文字使用UTF-8编码
//		response.setCharacterEncoding("UTF-8");

		// 但是使用字节流的时候,上面的设置文字编码肯定是不管用了
		// 因为java是utf-8的,所以输出去的字节也是utf-8形式的
		// 所以我们可以设置输出的字节流是什么形式的
		// 当然浏览器那边也需要相应的设置一下
//		response.getOutputStream().write("wwsaf刚".getBytes("GB2312"));

		// 规定浏览器看这份数据的时候,用什么编码来看
		// 这个text/html是固定的
//		response.setHeader("Content-Type", "text/html; charset=GB2312");

		// 但是还有一个终极的方案,这个会把输出的流变成指定的编码
		// 而且还会设置浏览器用什么方式解码 ,一般推荐用这个方法,后面用框架的时候不需要考虑这些
		response.setContentType("text/html; charset=GB2312");

	}

	// get请求(提交)的数据的中文乱码问题
	// 因为tomcat7.x以上get方式好像就不支持中文作为参数,用了就异常,所有这里实验不了
	// 如果是7.x以下就用下面的方法转码,或者用post方式传参数也可以
	private void test03(HttpServletRequest request) throws UnsupportedEncodingException
	{
		Enumeration<String> parmNames1 = request.getParameterNames();
		while (parmNames1.hasMoreElements())
		{
			String name = (String) parmNames1.nextElement();
			String value = request.getParameter(name);

			// get过来的数据,在url已经编码过了,这码和java的不同,所以我们看到的是乱码
			// getParameter里面默认使用iso-8869-1去解码,而我们不应该用这个去解码
			// 所以要让文字先编码回到iso-8869-1对应的字节数组的方式,再按utf-8解码
			name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
			value = new String(value.getBytes("ISO-8859-1"), "UTF-8");

			// 方法2
			// 直接在tomcat的conf里的server.xml配置,
			// <Connector connectionTimeout="20000" port="8080"
			// protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
			// 添加URIEncoding="UTF-8"
			// 以后get请求过来的数据永远是UTF-8

			System.out.println(name + "==" + value);
		}
	}

	// 获取我们提交的参数
	private void test02(HttpServletRequest request)
	{
		// 方法1
		// //获取所有参数的枚举
		// Enumeration<String> parmNames1=request.getParameterNames();
		// while (parmNames1.hasMoreElements())
		// {
		// String name = (String) parmNames1.nextElement();
		// String value=request.getParameter(name);
		// System.out.println(name+"=="+value);
		// }

		// 方法2  一般是用方法2
		// //获取所有参数的map
		// Map<String, String[]> map1=request.getParameterMap();
		// Set<Entry<String,String[]>> set1= map1.entrySet();
		// Iterator<Entry<String,String[]>> iterator1=set1.iterator();
		// for (Entry<String, String[]> entry : set1)
		// {
		// String name=entry.getKey();
		// String value=entry.getValue()[0];
		// System.out.println(name+"=="+value);
		// }

		// 方法3
		// 获取所有参数的map,但用keySet来遍历
		Map<String, String[]> map1 = request.getParameterMap();
		Set<String> set1 = map1.keySet();
		Iterator<String> iterator1 = set1.iterator();
		while (iterator1.hasNext())
		{
			String name = (String) iterator1.next();
			String value = map1.get(name)[0];
			System.out.println(name + "==" + value);
		}

	}

	// 获取提交的头数据,不是我们手动提交的,头数据一般是浏览器发送的
	private void test01(HttpServletRequest request)
	{
		// 获取所有的头数据,浏览器提交的头数据名称
		Enumeration<String> headers1 = request.getHeaderNames();
		while (headers1.hasMoreElements())
		{
			String name = (String) headers1.nextElement();

			// 根据名称获取头数据的数值
			String value = request.getHeader(name);
			System.out.println(name + value);
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGet(request, response);
	}

猜你喜欢

转载自blog.csdn.net/yzj17025693/article/details/82824147
007