HttpServletRequest

HttpServletRequest

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。

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

HttpServletRequest是ServletRequest的子接口,功能和方法更加强大。

request运行流程:

因为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)

举例:

获取头部名称:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取指定的头
    String header=request.getHeader("User-Agent");
    System.out.println(header);
    //获取所有头部名称
    Enumeration<String> headNames=request.getHeaderNames();
    while(headNames.hasMoreElements()){
        String headName=headNames.nextElement();
        String headerValue=request.getHeader(headName);
        System.out.println(headName+"...."+headerValue);
    }
}

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

做防盗链

演示:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取refer的信息
    String refer=request.getHeader("referer");
    //对referer进行判断
    response.setContentType("text/html;charset=UTF-8");
    if(refer!=null&&refer.startsWith("http://localhost")){
    response.getWriter().write("站在痛苦之外规劝受苦的人,是件很容易的事。");
    }else{
        response.getWriter().write("盗链可耻");
    }
}

通过request获得请求体

获得请求参数:

  ①String getParameter(String name)(很重要)

  ②String[] getParameterValues(String name)

  ③Enumeration getParameterNames()

  ④Map<String,String[]> getParameterMap()(很重要)

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

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

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

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

演示:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取单个值
    String username=request.getParameter("username");
    System.out.println(username);
    //获取指定元素的value值
    String[] hobbys=request.getParameterValues("hobby");
    for(String h:hobbys){
        System.out.println(h);
    }
    //获取所有参数,并封装到一个Map集合中
    request.setCharacterEncoding("UTF-8");
    Map<String,String[]> map=request.getParameterMap();
    for(Map.Entry<String,String[]> entry:map.entrySet()){
        System.out.println(entry.getKey());
        for(String str:entry.getValue()){
            System.out.println(str);
        }
        System.out.println("----------------");
    }
}

request是一个域对象

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

  ①setAttribute(String name, Object o)

  ②getAttribute(String name)

  ③removeAttribute(String name)

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

请求转发

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

  RequestDispatcher getRequestDispatcher(String path)

通过转发器对象转发

  requestDispathcer.forward(ServletRequest request, ServletResponse response)

演示:

servlet01
public class servlet01 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("name", "张三");
        request.getRequestDispatcher("/serlvet02").forward(request, response);
    }

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

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        String name=(String)request.getAttribute("name");
        response.getWriter().write(name);
    }

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

ServletContext域与Request域的生命周期比较

ServletContext:

创建:服务器启动

销毁:服务器关闭

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

request:

创建:访问时创建request

销毁:响应结束request销毁

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

转发与重定向的区别?

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

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

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

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

原文地址:https://www.cnblogs.com/Ace-suiyuan008/p/9625724.html