JavaEE—— HttpServletRequest

 HttpServletRequest

 

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,

一个为代表请求的request和代表响应response。

service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,

HttpServletRequest是ServletRequest的子接口。

request的运行流程

通过抓包工具抓取Http请求

通过request获得请求行

获得客户端的请求方式:String getMethod()

获得请求的资源:

String getRequestURI()

StringBuffer getRequestURL()

String getContextPath()

---web应用的名称

String getQueryString() ---- get提交url地址后的参数字符串

username=zhangsan&password=123

 

注意:request获得客户机(客户端)的一些信息

request.getRemoteAddr() --- 获得访问的客户端IP地址

 

通过request获得请求头

long getDateHeader(String name)

String getHeader(String name)

Enumeration getHeaderNames()

Enumeration getHeaders(String name)

int getIntHeader(String name)

 

 1 public class HeadServlet extends HttpServlet {
 2 
 3     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 4         //1.获取指定的头
 5         String header=request.getHeader("User-Agent");
 6         System.out.println(header);
 7         //2.获取所有头的名称
 8         Enumeration<String> headerNames=request.getHeaderNames();
 9         while(headerNames.hasMoreElements()){
10             String headerName=headerNames.nextElement();
11             String headerValue=request.getHeader(headerName);
12             System.out.println(headerName+"..."+headerValue);
13         }
14         
15     }

 

referer头的作用:执行该此访问的的来源

做防盗链

 代码演示:

 1         //获取refer的信息
 2         String refer=request.getHeader("referer");
 3         //对referer进行判断
 4         response.setContentType("text/html;charset=utf-8");
 5         if(refer!=null&&refer.startsWith("http://localhost")){
 6             response.getWriter().write("一、京东重创中国网络零售商京东创始人刘强东涉嫌犯罪事态升级。"
 7                     + "明尼拿波里斯警察局发言人埃尔德(John Elder)接受电话采访表示,刘强东涉嫌强暴重罪");
 8         }else{
 9             response.getWriter().write("你是盗链者,可耻");
10         }
11     }

 

通过request获得请求体

String getParameter(String name)

String[] getParameterValues(String name)

Enumeration getParameterNames()

Map<String,String[]> getParameterMap()

代码演示:

 1 package com.oracle.demo01;
 2 
 3 import java.io.IOException;
 4 import java.util.Map;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 public class ContentServlet extends HttpServlet {
12 
13     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
14         //获取单个值
15         String username=request.getParameter("username");
16         System.out.println(username);
17         //获取指定表单元素的value值
18         String[] hobbys=request.getParameterValues("hobby");
19         for(String h:hobbys){
20             System.out.println(h);
21         }
22         //获取所有参数并封装到一个Map<String,String[]>中
23         Map<String,String[]> map=request.getParameterMap();
24         for(Map.Entry<String, String[]> entry:map.entrySet()){
25             //参数name值
26             System.out.println(entry.getKey());
27             //参数value值(String[])
28             for(String str:entry.getValue()){
29                 System.out.println(str);
30             }
31             System.out.println("--------------------------------------");
32         }
33     }
34 
35     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
36         doGet(request, response);
37     }

 

  注意:get请求方式的请求参数 上述的方法一样可以获得

     解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");

     解决get提交的方式的乱码:

          parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

 

request是一个域对象

request对象也是一个存储数据的区域对象,所以也具有如下方法:

setAttribute(String name, Object o)

getAttribute(String name)

removeAttribute(String name)

 

注意:request域的作用范围:一次请求中

request完成请求转发

获得请求转发器----path是转发的地址

RequestDispatcher getRequestDispatcher(String path)通过转发器对象转发requestDispathcer.forward(ServletRequest  request, ServletResponse response)

 代码演示:

 1 public class Servlet01 extends HttpServlet {
 2 
 3     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 4         //往域对象中设置值
 5         request.setAttribute("name","zhangsan");
 6         //请求转发到Servlet02
 7         request.getRequestDispatcher("/Servlet02").forward(request, response);;
 8     }
 9 }
10 
11 
12 public class Servlet02 extends HttpServlet {
13 
14     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
15         String name=(String)request.getAttribute("name");
16         response.getWriter().write(name);
17     }
18 }

 

              

注意:ServletContext域与Request域的生命周期比较?

   ServletContext

     创建:服务器启动

     销毁:服务器关闭

     域的作用范围:整个web应用

   request

     创建:访问时创建request

     销毁:响应结束request销毁

     域的作用范围:一次请求中

 

注意:转发与重定向的区别?

    1)重定向两次请求,转发一次请求---

    2)重定向地址栏的地址变化,转发地址不变

    3)重新定向可以访问外部网站转发只能访问内部资源

    4)转发的性能要优于重定向

 

总结:

request获得行的内容

      request.getMethod()

      request.getRequestURI()

      request.getRequestURL()

      request.getContextPath()

      request.getRemoteAddr()

request获得头的内容

      request.getHeader(name)

request获得体(请求参数)

      String request.getParameter(name)

      Map<String,String[]> request.getParameterMap();

      String[] request.getParameterValues(name);

      注意:客户端发送的参数 到服务器端都是字符串

 

 获得中文乱码的解决:

 1   post:request.setCharacterEncoding(“UTF-8”);
 2 
 3   get:
 4 
 5 parameter = new String(parameter.getBytes(“iso8859-1”),”UTF-8”);
 6 
 7  
 8 
 9 request转发和域
10 
11       request.getRequestDispatcher(转发的地址).forward(req,resp);
12 
13       request.setAttribute(name,value)
14 
15       request.getAttribute(name)

 

posted @ 2018-09-08 11:41  文昭  阅读(279)  评论(0编辑  收藏  举报