利用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/p_w_picpath1.jpg");
String filename=path.substring(path.lastIndexOf("\\")+1);//取文件名的小技巧
response.setHeader("content-disposition","p_w_upload;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借钱,这是重定向。


发现错误,谢谢提醒,增强你我实力!