我们在创建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)

public class HeadServlet extends HttpServlet {

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

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

做防盗链

 代码演示:

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

通过request获得请求体

String getParameter(String name)

String[] getParameterValues(String name)

Enumeration getParameterNames()

Map<String,String[]> getParameterMap()

代码演示:

package com.oracle.demo01;

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ContentServlet extends HttpServlet {

    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<String,String[]>中
        Map<String,String[]> map=request.getParameterMap();
        for(Map.Entry<String, String[]> entry:map.entrySet()){
            //参数name值
            System.out.println(entry.getKey());
            //参数value值(String[])
            for(String str:entry.getValue()){
                System.out.println(str);
            }
            System.out.println("--------------------------------------");
        }
    }

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

  注意: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)

 代码演示:

public class Servlet01 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //往域对象中设置值
        request.setAttribute("name","zhangsan");
        //请求转发到Servlet02
        request.getRequestDispatcher("/Servlet02").forward(request, response);;
    }
}


public class Servlet02 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name=(String)request.getAttribute("name");
        response.getWriter().write(name);
    }
}

注意: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);

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

 

 获得中文乱码的解决:

post:request.setCharacterEncoding(“UTF-8”);

  get:

parameter = new String(parameter.getBytes(“iso8859-1”),”UTF-8”);

 

request转发和域

      request.getRequestDispatcher(转发的地址).forward(req,resp);

      request.setAttribute(name,value)

      request.getAttribute(name)