Servlet2-request、respone、请求转发、重定向

request对象

作用:request对象中封存了当前请求的所有请求信息
使用:
  获取请求行数据
    req.getMethod();//获取请求方式
    req.getRequestURL();//获取请求URL信息
    req.getRequestURI();//获取请求URI信息
    req.getScheme();//获取协议
  获取请求头数据
    req.getHeader("键名");//返回指定的请求头信息
    req.getHeaderNames();//返回请求头的键名的枚举集合
  获取用户数据
    req.getParameter("键名");//返回指定的用户数据
    req.getParameterValues("键名");//返回同键不同值的请求数据(多选),返回的数组。
    req.getParameterNames()//返回所有用户请求数据的枚举集合
  注意:
    如果要获取的请求数据不存在,不会报错,返回null。
 注意:
  request对象由tomcat服务器创建,并作为实参传递给处理请求的servlet的service方法。
 1 public class RequestServlet extends HttpServlet {
 2     @Override
 3     protected void service(HttpServletRequest req, HttpServletResponse resp)
 4             throws ServletException, IOException {
 5         //获取请求头数据
 6                 //获取请求方式
 7                     String method = req.getMethod();
 8                     System.out.println(method);
 9                 //获取请求URL
10                     StringBuffer url=req.getRequestURL();
11                     System.out.println(url);
12                     //获取URI
13                     String uri=req.getRequestURI();
14                     System.out.println(uri);
15                 //获取协议
16                     String h=req.getScheme();
17                     System.out.println(h);
18         //获取请求行数据
19                     //获取指定的请求行信息
20                     String value=req.getHeader("aaa");
21                     System.out.println(value);
22                     //获取所有的请求行的键的枚举
23                     Enumeration e = req.getHeaderNames();
24                     while(e.hasMoreElements()){
25                         String name=(String) e.nextElement();
26                         String value2=req.getHeader(name);
27                         System.out.println(name+":"+value2);
28                     }
29         //获取用户数据
30                     String name=req.getParameter("uname");
31                     String pwd=req.getParameter("pwd");
32                     System.out.println(name+":"+pwd);
33                     //String fav=req.getParameter("fav");
34                     String[] favs=req.getParameterValues("fav");
35                     if(favs!=null){
36                         for(String fav:favs){
37                             System.out.println(fav);
38                         }
39                     }
40                     //获取所有的用户请求数据的键的枚举集合---req.getParameterNames()    
41     }
42 }

respone对象

作用:  
  用来响应数据到浏览器的一个对象
使用:
  设置响应头
    setHeader(String name,String value);//在响应头中添加响应信息,但是同键会覆盖
    addHeader(String name,String value);//在响应头中添加响应信息,但是不会覆盖。
  设置响应状态
    sendError(int num,String msg);//自定义响应状态码。
  设置响应实体
    resp.getWrite().write(String str);//响应具体的数据给浏览器
  设置响应编码格式:
    resp.setContentType("text/html;charset=utf-8");
 
 1 public class ResponseServlet extends HttpServlet {
 2     @Override
 3     protected void service(HttpServletRequest req, HttpServletResponse resp)
 4             throws ServletException, IOException {
 5         //获取请求信息
 6             //获取请求头
 7             //获取请求行
 8             //获取用户数据
 9         //处理请求
10             
11         //响应处理结果
12             //设置响应头
13             resp.setHeader("mouse", "two fly birds");
14             resp.setHeader("mouse", "bjsxt");
15             resp.addHeader("key", "thinkpad");
16             resp.addHeader("key", "wollo");
17             //设置响应编码格式
18                 //resp.setHeader("content-type", "text/html;charset=utf-8");
19                 //resp.setContentType("text/plain;charset=utf-8");
20                 //resp.setContentType("text/xml;charset=utf-8");
21                 resp.setContentType("text/html;charset=utf-8");
22             //设置响应状态码
23                 //resp.sendError(404, "this Method is not supported");
24             //设置响应实体
25                 resp.getWriter().write("<b>今天天气真好,适合学习</b>");
26             
27             
28     }
29 }

请求中文乱码解决

1、使用String进行数据重新编码
  uname=new String(uname.getBytes("iso8859-1"),"utf-8");
2、使用公共配置
  get方式:
    步骤一:在service方法中使用:req.setCharacterEncoding("utf-8");
    步骤二:
      在tomcat的目录下的conf目录中修改server.xml文件:在Connector标签中增加属性useBodyEncodingForURI="true"
  post方式:
    在service方法中使用:req.setCharacterEncoding("utf-8");

Servlet流程总结

浏览器发起请求到服务器(请求)
服务器接受浏览器的请求,进行解析,创建request对象存储请求数据
服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
servlet的方法执行进行请求处理
  设置请求编码格式
    req.setCharacterEncoding("utf-8");
  设置响应编码格式
    resp.setContentType("text/html;charset=utf-8");
  获取请求数据
  处理请求数据
    创建业务层对象
    调用业务层对象的方法
  响应处理结果

请求转发

作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
使用:
  req.getRequestDispatcher("要转发的地址").forward(req, resp);
  地址:相对路径,直接书写servlet的别名即可。
特点:
  一次请求,浏览器地址栏信息不改变。
注意:
  请求转发后直接return结束即可。

reuqest作用域

问题:使用请求转发后,数据怎么从一个servlet流转给另一个servlet?
解决:使用request对象的作用域
使用:
  request.setAttribute(Object name,Object value);
  request.getAttribute(Object obj);
作用:解决了一次请求内不同的servlet的数据(请求数据+其他数据)共享问题。
注意:使用Request对象进行数据流转,数据只在一次请求内有效。
特点:
  服务器创建
  每次请求都会创建
  生命周期一次请求

请求重定向

解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。
使用:
  resp.sendRedirect(String uri);
示例:
  resp.sendRedirect("/login/main");
特点:
  两次请求,两个request对象。
  浏览器地址栏信息改变
时机:
  如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
  如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。 
代码:
 1 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 2     //设置请求编码格式:
 3     req.setCharacterEncoding("utf-8");
 4     //设置响应编码格式
 5     resp.setContentType("text/html;charset=utf-8");
 6     //获取请求信息
 7     String uname=req.getParameter("uname");
 8     //uname=new String(uname.getBytes("iso8859-1"),"utf-8");//使用String进行数据重新编码
 9     String pwd=req.getParameter("pwd");
10     System.out.println(uname+":"+pwd);
11     //处理请求信息
12     //获取业务层对象
13         LoginService ls=new LoginServiceImpl();
14         User u=ls.checkLoginService(uname, pwd);
15         System.out.println(u);
16     //响应处理结果
17     if(u!=null){
18         resp.sendRedirect("/Login/main");
19         return;
20     }else{
21         //使用request对象实现不同Servlet的数据流转
22         req.setAttribute("str", "用户名或密码错误");
23         //使用请求转发
24         req.getRequestDispatcher("page").forward(req, resp);
25         return;
26     }
27 }
 1 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 2     //设置响应编码格式
 3     resp.setContentType("text/html;charset=utf-8");
 4     //获取请求信息
 5     //处理请求
 6     //响应处理结果
 7     //获取request作用域数据
 8         String str=(String) req.getAttribute("str")==null?"":(String) req.getAttribute("str");
 9         resp.getWriter().write("<html>");
10         resp.getWriter().write("<head>");
11         resp.getWriter().write("</head>");
12         resp.getWriter().write("<body>");
13         resp.getWriter().write("<font color='red' size='20px'>"+str+"</font>");
14         resp.getWriter().write("<form action='login' method='get'>");
15         resp.getWriter().write("用户名:<input type='text' name='uname' value=''/><br/>");
16         resp.getWriter().write("密码:<input type='password' name='pwd' value=''/><br/>");
17         resp.getWriter().write("<input type='submit' value='登录'/><br/>");
18         resp.getWriter().write("</form>");
19         resp.getWriter().write("</body>");
20         resp.getWriter().write("</html>");
21 }

请求重定向 vs  请求转发 区别

请求重定向:(浏览器行为)

  1)地址栏改变,改变为重定向到的地址
  2)可以重定向到当前web应用,其他web应用,甚至是其他站点资源。
  3)处于两次不同的请求。不可以使用request域对象来共享数据。
请求转发:(服务器行为)
  1)地址栏不会改变。
  2)只能转发到当前web应用内部资源。
  3)处于同一次请求。可以使用request域对象来共享数据
 
 
 

猜你喜欢

转载自www.cnblogs.com/sunny-sml/p/12514529.html