一笑奈何

对一个男人来说,最无能为力的事儿就是“在最没有能力的年纪,碰见了,最想照顾一生的姑娘。...

Resquest的详细介绍

一、HttpServletRequest
1、HttpServletRequest概述
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service方法中的request的类型是ServletRequest,而doGet/doPost方法的request的类型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大。request对象是JSP中重要的对象,每个request对象封装着一次用户请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径。
2、Request的运行流程
同Response。
3、request获得请求内容
请求行
获得客户端的请求方式: String  getMethod();
获得请求的资源: String  getContextPath();---web应用的名称
String getRequestURI()
StringBuffer getRequestURL()
String getContextPath() ---web应用的名称
String getQueryString() ---- get提交url地址后的参数字符串
    
//1、获得请求方式
             String method = request.getMethod();
             System.out.println("method:"+method);
             //2、获得请求的资源相关的内容
             String requestURI = request.getRequestURI();
             StringBuffer requestURL = request.getRequestURL();
             System.out.println("uri:"+requestURI);
             System.out.println("url:"+requestURL);
             //获得web应用的名称
             String contextPath = request.getContextPath();
             System.out.println("web应用:"+contextPath);
             //地址后的参数的字符串
             String queryString = request.getQueryString();
             System.out.println(queryString);
             //3、获得客户机的信息---获得访问者IP地址
             String remoteAddr = request.getRemoteAddr();
             System.out.println("IP:"+remoteAddr);
注意:request获得客户机(客户端)的一些信息
request.getRemoteAddr() --- 获得访问的客户端IP地址

请求头
获得指定请求头: String  getHeader(String  name);
获取所有请求头的名称:java.util.Enumeration<String> getHeaderNames();
long getDateHeader(String name)
String getHeader(String name)
Enumeration getHeaderNames()
Enumeration getHeaders(String name)
int getIntHeader(String name)
            //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 头的作用:执行该此访问的来源做防盗链

请求体
请求体中的内容是通过post提交的请求参数,格式是:
username=zhangsan&password=123&hobby=football&hobby=basketball
key ---------------------- value
username                [zhangsan]
password                [123]
hobby                    [football,basketball]
 
获取paramName请求参数的值:
String getParameter(String paramName);
paramName请求参数的值,当该请求参数有多个值时,该方法将返回多个值所组成的数组:
String[] getParameterValues(String name);
获取所有请求参数名和参数值所组成的Map对象
Map<String,String[]> getParameterMap();
获取所有请求参数名所组成的Enumeration对象
Enumeration getParameterNames();
            //1、获得单个表单值
             String username = request.getParameter("username");
             System.out.println(username);
             String password = request.getParameter("password");
             System.out.println(password);
             //2、获得多个表单的值
             String[] hobbys = request.getParameterValues("hobby");
             for(String hobby:hobbys){
                    System.out.println(hobby);
             }
             //3、获得所有的请求参数的名称
             Enumeration<String> parameterNames = request.getParameterNames();
             while(parameterNames.hasMoreElements()){
                    System.out.println(parameterNames.nextElement());
             }
             System.out.println("------------------");
             //4、获得所有的参数 参数封装到一个Map<String,String[]>
             Map<String, String[]> parameterMap = request.getParameterMap();
             for(Map.Entry<String, String[]> entry:parameterMap.entrySet()){
                    System.out.println(entry.getKey());
                    for(String str:entry.getValue()){
                           System.out.println(str);
                    }
                    System.out.println("---------------------------");
             }
   注:Map复杂了一点,但是比较有用。          
 
注意:不论是get请求方式还是post请求方式,上述的方法一样可以获得。

4、Request的其他功能
a、request是一个域对象
request对象也是一个存储数据的区域对象,所以也具有如下方法:
setAttribute(String name, Object o)
getAttribute(String name)
removeAttribute(String name)
 
注意:request域的作用范围:一次请求中
在request中存储数据,然后通过请求转发能够获取到(重定向没有数据)。(a与b结合来看)
 
b、request完成请求转发
获得请求转发器----path是转发的地址
RequestDispatcher getRequestDispatcher(String path)
通过转发器对象转发
requestDispathcer.forward(ServletRequest request, ServletResponse response)
//servlet1将请求转发给servlet2
             RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");
             dispatcher.forward(request, response);
注意:转发与重定向的区别?
        1)重定向两次请求,转发一次请求
        2)重定向地址栏的地址变化,转发地址不变
        3)重新定向可以访问外部网站 转发只能访问内部资源
        4)转发的性能要优于重定向
重定向是服务器外部行为,请求转发是服务器内部行为。
 
注意:ServletContext域与Request域的生命周期比较?
        ServletContext:
            创建:服务器启动
            销毁:服务器关闭
            域的作用范围:整个web应用
        request:
            创建:访问时创建request
            销毁:响应结束request销毁
            域的作用范围:一次请求中
 
注意:客户端地址与服务器端地址的写法?
    客户端地址:是客户端去访问服务器的地址,服务器外部的地址。其特点:写上Web应用的名称。
    客户端地址有:直接输入地址;重定向;
 
    服务器端地址:服务器内部资源跳转的地址。其特点:不需要写Web应用的名称。
 

解决获取数据的中文乱码问题?
//设置request的编码-----只适合post方式
             request.setCharacterEncoding("UTF-8");
 
乱码过程:王五----使用UTF-8编码------使用iso8859-1解码------乱码xxx,
实现乱码的解决:xxx------使用iso8859-1编码------使用utf-8解码----王五
编码:str.getByte("iso8859-1");
new String(string,"utf-8");
       //get方式乱码解决
        String username = request.getParameter("username");//乱码
       //先用iso8859-1编码,再使用utf-8解码
        username = new String(username.getBytes("iso8859-1"),"UTF-8");
适用于get  post
get不适用于表单提交。
 
四、总结
1、request获得行的内容(请求参数)
request.getMethod();
request.getRequestURI();
request.getRequestURL();
request.getContextPath();
request.getRemoteAddr();
 
2、request获得头的内容
request.getHeader(name);
 
3、request获得体(请求参数)
String  request.getParameter(name);
Map<String, String[]> request.getParameterMap();
String[] request.getParametherValues(name);
注意:客户端发送的参数到服务器端获得的值都是字符串。
 
中文乱码问题:
post:
request.setCharacterEncoding("UTF-8");
get(原始方法):
 username = new String(username.getBytes("iso8859-1"),"UTF-8");
 
4、request其他内容 (转发和域)
在域存储数据:
request.setAttribute(name,value);
request.getAtteribute(name);
转发:
request.getRequestDispatcher(转发的地址(服务器内部地址)).forward(request,response);

参考连接http://www.cnblogs.com/scalpel-ct/p/7502986.html
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZJ_2420441444/article/details/79951232
个人分类: java
相关热词: resquest
上一篇Response详解
下一篇Session&amp;&amp;Cookie的详细介绍
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭