利用3到4天的时间,把servlet中的request和response视频看了一遍。看完之后,自己总结出来了一些知识点。
先来说说response吧。
1、解决用outputStream输出中文的乱码问题。
//1.程序的数据以什么码表输出了,程序就要控制浏览器以什么码表打开 response.setHeader("content-type", "text/html;charset=utf-8"); String data="中国"; OutputStream out=response.getOutputStream(); out.write(data.getBytes("utf-8"));
要注意:
"content-type", "text/html;charset=utf-8"中的分号切不可写成逗号,不然浏览器会提示下载
//2.用HTML技术中的meta标签来模拟http响应头,用于控制浏览器的行为 String data="中国人"; OutputStream out=response.getOutputStream(); out.write("<meta http-equiv='content-type' content='text/html;charset=utf-8'>".getBytes()); out.write(data.getBytes("utf-8"));
2、用write流输出中文
//设置response中的码表 response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); response.getWriter().write("中国");
3、实现文件的下载
String path=this.getServletContext().getRealPath("/download/image1.jpg"); String filename=path.substring(path.lastIndexOf("\\")+1);//取文件名的小技巧 response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(filename,"utf-8")); InputStream in = null; OutputStream out = null; in = new FileInputStream(path); int len=0; byte buffer[]=new byte[1024]; out=response.getOutputStream(); while((len=in.read(buffer))>0){ out.write(buffer,0,len); } out.close(); in.close();
4、控制浏览器定时刷新
response.setHeader("refresh", "3");//3秒后刷新 response.setHeader("refresh","3;url='index.jsp'");//3秒后跳到index.jsp
还有一个请求重定向,这个放在后面跟请求转发放在一起说
接下来说的就是request,先来说说一些常用的方法吧。
System.out.println(request.getRequestURI()); System.out.println(request.getRequestURL()); //URL和URI的区别: //URI:统一资源标识符 exp:/day02/RequestDemo1 //URL:全球资源定位器 exp:http://localhost:8080/day02/RequestDemo1 System.out.println(request.getQueryString());//获取参数信息(返回请求行中的参数)exp: 返回name=zengxiang System.out.println(request.getRemoteAddr());//返回发出请求的客户机IP地址 System.out.println(request.getRemoteHost());//返回发出请求的客户机主机名 System.out.println(request.getMethod());//返回请求方式POST、GET、PUT //客户机带数据给servlet有两种方式:超链接和提交表单,下面是获取请求数据的几种方式 1.String value = (String)request.getParameter("name"); 2.Enumeration e=request.getParameterNames(); while(e.hasMoreElements()){ String name=(String) e.nextElement(); value=request.getParameter(name); System.out.println(name+"="+value); } 3.String[] values=request.getParameterValues("password"); for(int i=0;values.length!=0&&i<values.length;i++){ System.out.println(values[i]); }//切记判断传递过来的参数是否为空 4.Map m=request.getParameterMap(); User user=new User(); try{ BeanUtils.populate(user,m);//用map集合数据填充bean }catch(Exception e1){ e1.printStackTrace(); } System.out.println(user); 5.InputStream in=request.getInputStream();//一般不采用此种方式去获取数据,文件上传需要这种方式 int len=0; byte buffer[]=new byte[1024]; while((len=in.read(buffer))>0){ System.out.println(new String(buffer,0,len)); }
下面就是中文乱码的问题了,先来解释一下乱码的原因吧,在浏览器中接受一个数据(编码取决于在浏览器中的编码),在数据传给request时,按照request域中的码表(iso8859-1)翻译过来,这个“中国”就不是“中国”了,于是到了servlet中就出现乱码了。
通过浏览器带来数据的方式不同,解决方式也不一样。
一、解决get表单,超链接提交的乱码
String value=request.getParameter("username"); String value1=new String(value.getBytes("iso8859-1"),"gbk"); System.out.println(value1);
二、解决post表单提交的乱码
request.setCharacterEncoding("gbk"); String value1=request.getParameter("username"); System.out.println(value1);
区分两种域:
request域:作用于请求范围,每个请求对应一个request域,相互独立 servletContext域:作用于WEB应用,所有请求都在一个context域,数据易覆盖
区分两个方法:
getAttribute():获取域中的数据 getParameter():获取客户机所提交的数据
WEB中各类地址的写法:首先以“/”开头,然后判断该地址是给谁用的,给服务器用,“/”代表当前WEB应用;给客户机浏览器用,“/”代表网站(包含多个web应用)例如:
1.request.getRequestDispatcher("/form1.html").forward(request, response); 2.response.sendRedirect("/day02/form1.html"); 3.this.getServletContext().getRealPath("/form1.html"); 4.this.getServletContext().getResourceAsStream("/form1.html"); 5.<a href="/day06/form1.html">xx</a> 6.<form action="/day06/form1.html"></form>
最后再来说说请求重定向和请求转发的区别
重定向的特点就是:1.浏览器向服务器发出两个请求,意味着有两个response/request
2.浏览器地址栏会变化
转发的特点就是:1.浏览器向服务器发出一个请求,而服务器有多个web资源调用
2.浏览器地址栏不会变化
通俗一点理解就是:A找B借钱,B没钱,1.B找C去借钱,然后再给A,这是转发;2.B叫A自己找C借钱,这是重定向。
发现错误,谢谢提醒,增强你我实力!
本文出自 “java web路上的经历” 博客,谢绝转载!