HttpServletRequest对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpServletRequest对象相关的知识,希望对你有一定的参考价值。

参考技术A

HttpServletRequest对象:主要作用是用来接收客户端发送过来的请求信息,例如:请求的参数,发送的头信息等都属于客户端发来的信息,service()方法中形参接收的是HttpServletRequest接口的实例化对象,表示该对象主要应用在好TP协议上,该对象是由Tomcat封装好传递过来。

HttpServletRequest是ServletRequest的子接口,ServletRequest只有一个子接口,就是HttpServletRequest。既然只有一个子接口为什么不将两个接口合并为一个?
从长远上讲:现在主要用的协议是HTTP协议,但以后可能出现更多新的协议。若以后想要支持这种新协议,只需要直接继承ServletRequest 接口就行了。

在HttpServletRequest接口中,定义的方法很多,但都是围绕接收客户端参数的。但是怎么拿到该对象呢?不需要,直接在Service方法中由容器传入过来,而我们需要做的就是取出对象中的数据,进行分析、处理。

常用方法

运行结果:

方法

浏览器地址栏输入:

则控制台输出:

由于现在的request属于接收客户端的参数,所以必然有其默认的语言编码,主要是由于在解析过程中默认使用的编码方式为ISO-8859-1(此编码不支持中文),所以解析时一定会出现乱码。要想解决这种乱码问题,需要设置request 中的编码方式,告诉服务器以何种方式来解析数据。或者在接收到乱码数据以后,再通过相应的编码格式还原。

方式一(只针对POST有效,必须在接收所有的数据之前设定):

方式二(借助了String 对象的方法,该种方式对任何请求有效,是通用的):

Tomcat8起,以后的GET方式请求是不会出现乱码的。

请求转发,是一种 服务器的行为 ,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的 URL地址不会改变 ,得到响应后,服务器端再将响应发送给客户端,从始至终 只有一个请求发出 。实现方式如下,达到多个资源协同响应的效果。

通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。

使用作用域时需要设置请求转发,否则没有效果。

request域对象中的数据在一次请求中有效,则经过请求转发,request域中的数据依然存在,则在请求转发的过程中可以通过request来传输/共享数据。

请求转发到Servlet

请求转发到jsp。 此时需要修改:
req.getRequestDispatcher("test.jsp").forward(req, resp);

HttpServletRequest和ServletRequest的区别以及HttpServletRequest对象方法的用法

HttpServletRequest和ServletRequest都是接口

HttpServletRequest继承自ServletRequest 

 

HttpServletRequest比ServletRequest多了一些针对于Http协议的方法。 例如:

getHeader(), getMethod() , getSession() 

    @Override  
    public void doFilter(ServletRequest request, ServletResponse response,  
            FilterChain filterChain) throws IOException, ServletException {  
        // 过滤用户请求,判断是否登录  
        HttpServletRequest httpServletRequest = (HttpServletRequest)request;  
        HttpServletResponse httpServletResponse = (HttpServletResponse)response;  
        httpServletResponse .setContentType("text/html;charset=utf-8");  
        httpServletRequest.setCharacterEncoding("utf-8");  
        httpServletResponse.setCharacterEncoding("utf-8");  
          
        String username = (String)httpServletRequest.getSession().getAttribute("username");  
        if (username == null) {  
            String path = httpServletRequest.getContextPath();  
            httpServletResponse.sendRedirect(path+"/index.jsp");  
        }  
        filterChain.doFilter(httpServletRequest, httpServletResponse);  
    }  

1. 获得客户机信息
    getRequestURL方法返回客户端发出请求时的完整URL。
    getRequestURI方法返回请求行中的资源名部分。
    getQueryString 方法返回请求行中的参数部分。
    getRemoteAddr方法返回发出请求的客户机的IP地址 
    getRemoteHost方法返回发出请求的客户机的完整主机名
    getRemotePort方法返回客户机所使用的网络端口号
    getLocalAddr方法返回WEB服务器的IP地址。
    getLocalName方法返回WEB服务器的主机名 
    getMethod得到客户机请求方式
 2.获得客户机请求头 

    getHeader(string name)方法 
    getHeaders(String name)方法 
    getHeaderNames方法 

 3. 获得客户机请求参数(客户端提交的数据)
    getParameter(name)方法
    getParameterValues(String name)方法
    getParameterNames方法 
    getParameterMap方法


例子程序:

    public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
            System.out.println("getRequestURL: "+request.getRequestURL());  
            System.out.println("getRequestURI: "+request.getRequestURI());  
            System.out.println("getQueryString: "+request.getQueryString());  
            System.out.println("getRemoteAddr: "+request.getRemoteAddr());  
            System.out.println("getRemoteHost: "+request.getRemoteHost());  
            System.out.println("getRemotePort: "+request.getRemotePort());  
            System.out.println("getRemoteUser: "+request.getRemoteUser());  
            System.out.println("getLocalAddr: "+request.getLocalAddr());  
            System.out.println("getLocalName: "+request.getLocalName());  
            System.out.println("getLocalPort: "+request.getLocalPort());  
            System.out.println("getMethod: "+request.getMethod());  
            System.out.println("-------request.getParamterMap()-------");  
            //得到请求的参数Map,注意map的value是String数组类型  
            Map map = request.getParameterMap();  
            Set<String> keySet = map.keySet();  
            for (String key : keySet) {  
            String[] values = (String[]) map.get(key);  
            for (String value : values) {  
                System.out.println(key+"="+value);  
            }  
         }  
            System.out.println("--------request.getHeader()--------");  
            //得到请求头的name集合  
            Enumeration<String> em = request.getHeaderNames();  
            while (em.hasMoreElements()) {  
            String name = (String) em.nextElement();  
            String value = request.getHeader(name);  
            System.out.println(name+"="+value);  
        }  
              
    }  

 

 

浏览器上地址栏:http://localhost:8080/RequestAndResponse/requestmethod?name=sunjob&password=123456&password=haha

控制台输出:

    getRequestURL: http://localhost:8080/RequestAndResponse/requestmethod  
    getRequestURI: /RequestAndResponse/requestmethod  
    getQueryString: name=sunjob&password=123456&password=haha  
    getRemoteAddr: 127.0.0.1  
    getRemoteHost: 127.0.0.1  
    getRemotePort: 2374  
    getRemoteUser: null  
    getLocalAddr: 127.0.0.1  
    getLocalName: localhost  
    getLocalPort: 8080  
    getMethod: GET  
    -------request.getParamterMap()-------  
    name=sunjob  
    password=123456  
    password=haha  
    --------request.getHeader()--------  
    host=localhost:8080  
    user-agent=Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0  
    accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  
    accept-language=zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3  
    accept-encoding=gzip, deflate  
    connection=keep-alive  
    cache-control=max-age=0  

 


















以上是关于HttpServletRequest对象的主要内容,如果未能解决你的问题,请参考以下文章

@Async @Aspect @AfterReturnung。我的方法有 HttpServletRequest 对象作为方法参数,但能够访问它我的 aop 方法

HttpServletRequest对象

HttpServletRequest对象

HttpServletRequest和ServletRequest的区别以及HttpServletRequest对象方法的用法

HttpServletRequest和HttpServletResponse对象

JavaEE——HttpServletRequest对象