自学内容网 自学内容网

JavaWeb笔记_Request对象

一.Request对象概述

  a.Request专门用来获取浏览器的请求信息(请求行,请求头,请求体)的对象
  b.我们主要使用的是跟HTTP协议相关的Request对象:HttpServletRequest 继承了 ServletRequest
    扩展了ServletRequest接口,提供了更多基于HTTP协议的方法

二.通过Request对象获取请求行

/**
 * 二.通过Request对象获取请求行
 *  String getContextPath():获取当前应用的Application Context
 *  String getMethod():获取的当前的请求请求方式
 *  String getQueryString():获取查询字符串,获取请求行中?后面的参数
 *   String getRequestURI():获取的是请求行中的请求路径(不包含?后面的参数)
 *   StringBuffer getRequestURL():获取的请求的绝对路径(在地址栏中输入的路径),不包含?后面的参数
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求行

        //获取当前应用的Application Context
        System.out.println(request.getContextPath());  //day11_Request

        //获取当前的请求方式
        System.out.println(request.getMethod());  //GET

        //获取查询字符串,获取请求行中 ? 后面的参数
        System.out.println(request.getQueryString());  //username=zs&password=123456

        //获取请求行中的请求路径(不包含 ? 后面的参数)
        System.out.println(request.getRequestURI());  ///day11_Request/request01

        //获取请求行中的绝对路径(在地址栏中输入的路径),不包含 ? 后面的参数
        System.out.println(request.getRequestURL());  //http://localhost:8080/day11_Request/request01
    }

三.通过Request对象获取请求头

/**
 * 二.通过Request对象获取请求头
 *   String getHeader(String name):根据请求头的key获取对应的value
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求头

        System.out.println(request.getHeader("User-Agent"));
        //Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0

        System.out.println(request.getHeader("Host"));
        //localhost:8080

    }

四.通过Request对象获取请求体

/**
 * 二.通过Request对象获取请求体
 *   String getParameter(String name):根据提交参数的name获取对应的值
 *   String[] getParameterValues(String name):根据提交参数的name获取多个值
 *   Map<String,String[]> getParameterMap():将获取的参数以键值对的形式存放到一个map中,然后返回 
                                            这个map :将提交的所有参数以key=value的形式封装到
 *                                          map中,key:对应表单中的name
 *                                          value:name对应的一个或多个值,value是字符串数组
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求体

        //根据提交的参数name获取对应的值(可以在地址栏中添加参数,也可通过提交表单来获取参数)
        System.out.println(request.getParameter("username"));  //zs
        System.out.println(request.getParameter("password"));  //123456
    }

五.Request对象解决中文参数问题

5.1 GET请求

/**
 *
 五.请求中含有中文参数
 1.GET请求
       a.如果Tomcat是8版本以上,那么Tomcat底层在处理Get提交参数的时候,默认使用的是UTF-8码表
         由于页面使用的<meta charset="UTF-8">,将来提交参数也会对参数进行UTF-8编码
         Tomcat接收到UTF-8编码(字符串->字节)参数,底层也使用UTF-8解码(字节->字符串)
       b.如果Tomcat是7版本及以前的版本,那么Tomcat底层在处理Get提交参数的时候,默认使用ISO-8859-1码表
         我们需要修改Tomcat中conf/server.xml中修改默认使用的码表: <Connector port="8080" protocol="HTTP/1.1"
 connectionTimeout="20000"
 redirectPort="8443" URIEncoding="ISO-8859-1"/>
         由于页面使用的<meta charset="UTF-8">,将来提交参数也会对参数进行UTF-8编码
          Tomcat接收到UTF-8编码(字符串->字节)参数,底层使用ISO-8859-1码表解码,由于客户端和服务端码表不一致导致乱码

         解决乱码:我们需要获取到中文参数的原始字节,然后在对其使用UTF-8解码即可
           new String(username.getBytes("ISO-8859-1"), "UTF-8")
 
 */
@WebServlet("/request04")
public class RequestDemo04 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println(request.getParameter("username"));
String username = request.getParameter("username");
/*byte[] bytes = username.getBytes("ISO-8859-1");//获取发送过来username中文的原始字节
System.out.println(new String(bytes, "UTF-8"));*/
System.out.println(new String(username.getBytes("ISO-8859-1"), "UTF-8"));
}

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

5.2 POST请求

/**
 *
 五.请求中含有中文参数
 1.GET请求
       a.如果Tomcat是8版本以上,那么Tomcat底层在处理Get提交参数的时候,默认使用的是UTF-8码表
         由于页面使用的<meta charset="UTF-8">,将来提交参数也会对参数进行UTF-8编码
         Tomcat接收到UTF-8编码(字符串->字节)参数,底层也使用UTF-8解码(字节->字符串)
       b.如果Tomcat是7版本及以前的版本,那么Tomcat底层在处理Get提交参数的时候,默认使用ISO-8859-1码表
         我们需要修改Tomcat中conf/server.xml中修改默认使用的码表: <Connector port="8080" protocol="HTTP/1.1"
 connectionTimeout="20000"
 redirectPort="8443" URIEncoding="ISO-8859-1"/>
         由于页面使用的<meta charset="UTF-8">,将来提交参数也会对参数进行UTF-8编码
          Tomcat接收到UTF-8编码(字符串->字节)参数,底层使用ISO-8859-1码表解码,由于客户端和服务端码表不一致导致乱码

         解决乱码:我们需要获取到中文参数的原始字节,然后在对其使用UTF-8解码即可
           new String(username.getBytes("ISO-8859-1"), "UTF-8")
 2.POST请求
       Tomcat底层在处理Post请求的参数时候,默认使用的是ISO-8859-1码表
       由于页面使用的<meta charset="UTF-8">,将来提交参数也会对参数进行UTF-8编码
        Tomcat接收到UTF-8编码(字符串->字节)参数,底层使用ISO-8859-1码表解码,由于客户端和服务端码表不一致导致乱码
       解决乱码:
         a.第一种方式:
            new String(username.getBytes("ISO-8859-1"), "UTF-8")
         b.第二种方式:
         request.setCharacterEncoding("UTF-8");//底层处理Post提交参数的时候就会使用UTF-8码表
                                              //需要在获取参数之前来设置码表

 */
@WebServlet("/request05")
public class RequestDemo05 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//System.out.println(request.getParameter("username"));
//解决Post乱码的第一种方式
/*String username = request.getParameter("username");
System.out.println(new String(username.getBytes("ISO-8859-1"), "UTF-8"));*/

//解决Post乱码的第二种方式
request.setCharacterEncoding("UTF-8");
System.out.println(request.getParameter("username"));
}

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

六.转发与重定向

6.1转发

/**
 * 转发实现:
 *    ServletRequest接口中方法:
 *      RequestDispatcher getRequestDispatcher(String path):获取一个转发器,path代表转发的路径
 *  RequestDispatcher接口中的方法
 *    void forward(ServletRequest request, ServletResponse response):调用该方法实现转发
 *
 */    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //转发
        //浏览器发出出一次请求
        //获取一个转发器
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/request02"); //客户端内部发出请求

        //调用转发器中的方法实现转发  该方法传入的两个参数继续作为参数传给request02doPost()
        //                      即这两个参数和request02中的doPost()方法中的参数为同一个参数
        requestDispatcher.forward(request,response);
    }

6.2重定向

   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //重定向
        //浏览器发出两次请求
        response.sendRedirect("/day11_Request/request02"); //浏览器发出客户端请求
    }

6.3区别

        1.重定向
            a.重定向使浏览器发出两次请求
               第一次原始请求
               第二次重定向请求
            b.重定向会使浏览器的地址栏发生改变
        2.转发
            a.转发使浏览器发出一次请求
            b.转发不会使浏览器的地址栏改变

七. request作为域对象

 * Request域对象使用:
 *     void setAttribute(String name, Object o)
 *     Object getAttribute(String name)
 */
@WebServlet("/request06")
public class RequestDemo06 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  request.setAttribute("username", "张三");
         request.getRequestDispatcher("/request07").forward(request,response);
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
@WebServlet("/request07")
public class RequestDemo07 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
System.out.println(request.getAttribute("username"));
response.getWriter().write("<b>RequestDemo07响应给浏览器资源</b>");
}

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

八.文件上传案例

8.1 文件上传概述

 a.文件上传描述
    头像上传,将文件上传到一个云盘(百度云,onedrive,google drive)
    将客户端本地的文件上传到指定的服务器
  b.上传的前提条件
    1.在表单中利用input type=file这个标签来完成文件上传,需要之地那个input标签的name属性,作         为提交参数
    2.表单的请求方式必须是POST,POST提交没有数据长度限制
    3.需要指定表单的enctype属性,设置为multipart/form-data
  c.将文件上传位置
    我们一般不将上传的文件存储到web应用下,我们一般会用一台单独的服务器来存储上传文件
    FastDFS:分布式文件管理系统

8.2 文件上传实现

/**
 * 实现单文件上传:
 *    1.在servlet上加上@MultipartConfig注解
 *    2.通过request对象获取Part接口实现类对象
 *       HttpServletRequest中方法:
 *          Part getPart(String name):形参的name对应表单中input type=file的name值
 *    3.获取文件的信息主要通过javax.servlet.http.Part接口
 *           getSubmittedFileName():需要servlet 3.1规范才支持,获取上传文件的名称
 *           getContentType():获取文件的类型,MIME类型
 *           getSize():获取的文件大小,单位是字节
 *           getName():获取的是input type=file的name值
 *           void write(String fileName):可以将上传的文件直接写入到指定的路径,需要传入一个指定的路径
 */
/**
 * 实现单文件上传:
 *     @MultipartConfig注解中一些属性
 *         *location属性:指定上传文件的位置
 *         *maxFileSize属性:设定允许上传的文件尺寸最大值,单位是字节,默认值-1,不限制上传文件大小
 *         maxRequestSize属性:如果上传多个文件,总的文件大小不能超过maxRequestSize设定值,单位是字节,默认值-1,不限制上传文件大小
 *         fileSizeThreshold属性:如果上传的文件的字节数超过 fileSizeThreshold(单位字节),将会把上传的数据写到一个临时文件
 *  如果上传的文件超过指定的 maxFileSize值,服务端会抛出异常
 *  FileSizeLimitExceededException: The field uploadFile exceeds its maximum permitted size of 20480 bytes
 *
 */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part uploadfile = request.getPart("uploadfile");
        String sfn = uploadfile.getSubmittedFileName();
        System.out.println(sfn);
        uploadfile.write("D:/app/"+sfn);
    }


原文地址:https://blog.csdn.net/m0_65469669/article/details/140546081

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!