Request对象详解,重定向和请求转发区别,BeanUtils用法

时间:2022-02-20作者:klpeng分类:Java技术浏览:261评论:0

Request对象

GET http://localhost:8080/day04/a_form.html?username=jack&nickname=1234HTTP/1.1
POST http://localhost:8080/day04/a_form.html HTTP/1.1

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //GET http://localhost:8080/day04/a_form.html?username=jack&nickname=1234 HTTP/1.1
        //重要的三个API
        //1.获得请求方式
        String method = request.getMethod();
        System.out.println("请求方式:" + method);
        //2.获得服务器发布的名称  application 应用 context  根路径= day04_request
        String contextPath = request.getContextPath();
        System.out.println("根路径:"+contextPath);//动态路径设置

        //3.远程主机的ip地址  指的是访问的浏览器ip地址   Remote 远程   Addr 地址    0:0:0:0:0:0:0:1 ipv6的地址  本地等效127.0.0.1
        String remoteAddr = request.getRemoteAddr();
        System.out.println("远程主机的ip地址:"+remoteAddr);
}        

Host: localhost:8080
Connection: keep-alive
Content-Length: 27
Cache-Control: max-age=0
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36
Sec-Fetch-Dest: document
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Referer: http://localhost:8080/day04/a_form.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Idea-a04ab689=b23c0a93-4c5e-4a7e-9125-9dbc273d9498

格式:
key-value
获得请求头request.getHader(String key)一般请求情况下 不需要特殊设置请求头 默认情况: 浏览器自动发起的。
Request对象详解,重定向和请求转发区别,BeanUtils用法

体-请求数据(重要)

get没有请求体
浏览器将数据传输给服务器 服务器目的 获得浏览器传输的数据 重要的时用户传递的主观数据(用户输入)
Request对象详解,重定向和请求转发区别,BeanUtils用法
页面代码
a.html

<!--注册-->
    <form action="/day04_request/requestParam" method="get">
        用户名:<input type="text" name="username"><br/>
        昵称:<input type="text" name="nickname"><br/>
        爱好: <input type="checkbox" name="hobby" value="0"> 抽烟
                <input type="checkbox" name="hobby" value="1"> 喝酒
                <input type="checkbox" name="hobby" value="2"> 烫头
        <input type="submit" value="get提交">
    </form>

    <hr/>

    <form action="/day04_request/requestParam" method="post">
        用户名:<input type="text" name="username"><br/>
        昵称:<input type="text" name="nickname"><br/>
        爱好: <input type="checkbox" name="hobby" value="0"> 抽烟
        <input type="checkbox" name="hobby" value="1"> 喝酒
        <input type="checkbox" name="hobby" value="2"> 烫头
        <input type="submit" value="post提交">
    </form>

web.xml

  <servlet>
        <servlet-name>RequestParamServlet </servlet-name>
        <servlet-class>com.llz.servlet.RequestParamServlet </servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>RequestParamServlet</servlet-name>
        <url-pattern>/requestParam</url-pattern>
    </servlet-mapping>

Servlet代码

public class RequestParamServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost");

        //getParameter() 根据指定的名称 获得指定的一个返回值
        String username = request.getParameter("username");
        String nickname = request.getParameter("nickname");
        System.out.println(username + " @@ " + nickname);

        //getParameterValues() 根据指定的名称获得一组值
        String[] hobbies = request.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));

        //获得浏览器传输的所有key和所有的value  value是一个数组
        //数组中可能只有一个成员
        Map<String, String[]> parameterMap = request.getParameterMap();

        //遍历数据
        //parameterMap.entrySet().iter  + table键
        for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
            System.out.println(entry.getKey() + "@@" + Arrays.toString(entry.getValue()) );
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet");

        String username = request.getParameter("username");
        String nickname = request.getParameter("nickname");
        System.out.println(username + " @@ " + nickname);

        String[] hobbies = request.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));
        //获得浏览器传输的所有key和所有的value  value是一个数组
        //数组中可能只有一个成员
        Map<String, String[]> parameterMap = request.getParameterMap();
        //遍历数据
        //parameterMap.entrySet().iter  + table键
        for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
            System.out.println(entry.getKey() + "@@" + Arrays.toString(entry.getValue()) );
        }
    }
}

(note:/day04_request 为项目发布的名称,/requestParam为资源名称)

调用顺序(理解)
Request对象详解,重定向和请求转发区别,BeanUtils用法
问题
get提交没有出现乱码 post提交有乱码
问题分析
Request对象详解,重定向和请求转发区别,BeanUtils用法
解决方法

//解决乱码  处理请求编码
 request.setCharacterEncoding("utf-8");

//处理乱码 请求和响应的处理 都必须写最前面
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");

BeanUtils

BeanUtils的jar 可以 快速的将 map的数据 封装到 对象中
Request对象详解,重定向和请求转发区别,BeanUtils用法
页面代码

<!--注册-->
    <form action="/day04_request/registerServlet" method="get">
        用户名:<input type="text" name="username"><br/>
        昵称:<input type="text" name="nickname"><br/>
        密码:<input type="text" name="password"><br/>
        性别:<input type="text" name="gender"><br/>
        年龄:<input type="text" name="age"><br/>
        电话:<input type="text" name="telephone"><br/>
        爱好: <input type="checkbox" name="hobby" value="抽烟"> 抽烟
                <input type="checkbox" name="hobby" value="喝酒"> 喝酒
                <input type="checkbox" name="hobby" value="烫头"> 烫头
        <input type="submit" value="get提交">
    </form>
    <hr/>
    <form action="/day04_request/registerServlet" method="post">
        用户名:<input type="text" name="username"><br/>
        昵称:<input type="text" name="nickname"><br/>
        密码:<input type="text" name="password"><br/>
        性别:<input type="text" name="gender"><br/>
        年龄:<input type="text" name="age"><br/>
        电话:<input type="text" name="telephone"><br/>
        爱好: <input type="checkbox" name="hobby" value="抽烟"> 抽烟
        <input type="checkbox" name="hobby" value="喝酒"> 喝酒
        <input type="checkbox" name="hobby" value="烫头"> 烫头
        <input type="submit" value="get提交">
    </form>

Servlet类代码

public class RegisterServlet extends HttpServlet {
    /**
     * get和post的代码基本是一致  只不过 post多一行出乱码的代码
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            //1.处理乱码 只对post生效  对get不生效
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");

            //2.获得数据
            Map<String, String[]> parameterMap = request.getParameterMap();


            //3.将map的数据 封装到 User中  面向对象 操作User简单
            User user = new User();  //100个字段
       /* user.setUsername(  parameterMap.get("username")[0]  );
        user.setNickname(  parameterMap.get("nickname")[0]  );*/

            //BeanUtils的jar 可以 快速的将 map的数据 封装到 对象中
            //java中的类 其实是要分门别类的 , 实体类 :  只有私有化属性 并且提供get/set的类
            //Bean对象 : javaBean domain entity  实体类
            //Utils 工具类 : 不需要修改代码  能直接使用的类  IOUtils.copy
            //BeanUtils 操作实体类的工具类
            //参数1: javaBean
            //参数2: map数据
            //可以快速的将 map的数据赋值到 javaBean中
            BeanUtils.populate(user , parameterMap ); //需要try 底层反射
            //赋值数据的时候 只有当 页面和后台同时都具有该字段 才会赋值成功 否则数据为null 不会报错
            System.out.println(user);


        /*for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
            System.out.println(entry.getKey()  + " @@ " + Arrays.toString(entry.getValue()));
           if("username".equals(entry.getKey())){
               user.setUsername( Arrays.toString(entry.getValue())   );
           }
        }*/
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

    }
}

请求的其他作用

域对象
域对象: 范围 , 在一定的范围中去共享数据 对象中必然有可以存储数据的地方(map list)
域对象的api一致
getAttribute(String key ) setAttribute( String key , Object value) removeAttribute(String key )

域对象共享的范围不同
ServletContext 特性 : 所有的Servlet对象获得同一份 ServletContext 对象, 一份数据 大家共享 项目启动ServletContext 就初始化了。

请求转发
request域对象一般与请求转发一起使用
请求转发:将当前请求从某一个位置跳转到另外一个位置
代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("oneServlet 执行");
        /**
         * 两个类之间如何调用
         *  拿到第二个类的实力对象 . 方法  对象.方法
         *  twoServlet.doGet(request , response)
         *
         *  以前的方式 : 对象 变量 = new 对象()  我们自己控制的 new对象过程
         *
         *  现在的方式:对象是由tomcat创建 ,而tomcat并没有将实例化的变量给我们
         *  实例化的变量还在tomcat的内部 , 如果需要调用另外一个类的方法
         *  通知tomcat 让tomcat去调用
         *  问题: 1.明确知道 调用的对象
         *        2.明确指导 参数是谁 ( 两个方法的参数一样  照样传递即可)
         *  get 获得 Request 请求  Dispatcher 调度器
         *       获得请求调度器: 交通枢纽 , 作用: 控制我们的请求 去向何处
         *       参数: 调度的位置
         *  request.getRequestDispatcher("twoServlet")
         *  dispatcher.forward(); 执行调度  twoServlet.doGet(request , response)
         */
        //请求转发的代码
        RequestDispatcher dispatcher = request.getRequestDispatcher("twoServlet");
        dispatcher.forward(request ,response );
    }

请求转发和重定向的区别

Request对象详解,重定向和请求转发区别,BeanUtils用法
重定向特点:

  1. 有两次请求 两次响应
  2. 访问的地址会发生改变 重定向之后的地址
  3. 可以跳转站外资源 (除了我们网站内部的资源)
  4. 重定向不可以携带数据

请求转发特点:

  1. 只有一次请求 一次响应
  2. 访问地址没有改变 还指向的第一次访问路径
  3. 只能站内跳转 (服务器内部处理)
  4. 请求转发可以携带数据

ServletContext域和request域区别

ServletContext : 整个项目只有一份 所有人共享这一份数据(数据之间有冲突) , 常用于放置公共数据 例如 :charset=utf-8
request生命周期: ,请求开始的时候 request创建 响应结束的request销毁
存储数据的范围: request 一次请求中 请求转发的过程中传递数据
ServletContext的生命周期:项目启动就创建 整个项目就一份 tomcat关闭 ServletContext就销毁
存储数据的范围: 存储数据后 数据会一直保存在 服务器中 不会被销毁 只有服务停止或者手动的执行removeAttribute 数据销毁

打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
相关推荐

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢