美文网首页java基础
java基础-day40-ServletRequest和Serv

java基础-day40-ServletRequest和Serv

作者: 触手不可及 | 来源:发表于2021-07-02 08:54 被阅读0次

    ServletRequest和ServletResponse

    1. Servlet路径处理和特性

    1.1 重定向
    浏览器发送HTTP请求 ==> 服务器
    服务器接收到请求之后 发送302状态码 新的location ==> 浏览器
    浏览器收到302状态码 + location 按照新的location发送新的请求 ==> 服务器
    
    特征:
        1. 该操作是浏览器行为
        2. 重定向最少存在两次的浏览器请求
        3. 重定向情况下,浏览器的地址栏会发生改变
        4. 重定向操作存在两个或者两个以上的请求,每一次新的请求,都会丢失之前的请求数据,也就是request对象【requeset作用域范围】
        5. 重定向可以访问任何资源,不管是当前WEB服务器资源,还是网络端的资源都是可以访问
    
    重定向代码展示
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>01-重定向展示</title>
    </head>
    <body>
    <form action="RedirectServlet" method="post">
        <span>姓名:</span><input type="text" name="userName"> <br>
        <span>密码:</span><input type="password" name="password"> <br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    
    package com.qfedu.a_url;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * 重定向操作
     *
     * @author MI 2020/3/31 9:59
     */
    @WebServlet("/RedirectServlet")
    public class RedirectServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 请求和响应乱码问题解决
            req.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
    
            // 获取用户提交的参数
            String userName = req.getParameter("userName");
            String password = req.getParameter("password");
            System.out.println(userName + ":" + password);
    
            // 重定向操作,重定向当前WEB Application中的index.jsp
            resp.sendRedirect("index.jsp");
    
            // 重定向操作,要求浏览器访问https://www.baidu.com
            // resp.sendRedirect("https://www.baidu.com");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    
    1.2 请求转发
    浏览器发送HTTP请求 ==> 服务器
    服务器接收到请求之后内部资源处理跳转 ==> 服务器其他资源
    服务器其他资源处理完毕之后,才通过原始的请求和响应返回数据 ==> 客户端
    
    特征:
        1. 转发是服务器行为
        2. 转发情况下浏览器有且只发送了一次请求
        3. 转发情况下浏览器的地址栏没有发生任何改变
        4. 转发情况下,浏览器的请求数据时被保存的,是通过request进行传递的
        5. 转发情况下有且只能转发WEB Application整个项目的内容资源
    
    请求转发代码演示
    package com.qfedu.a_url;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * 转发演示,用户请求DispatchServlet1
     *
     * @author MI 2020/3/31 10:19
     */
    @WebServlet("/dispatch")
    public class DispatchServlet1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("用户请求DispatchServlet1,转发......");
    
            // 给Request对象加入一个属性,属性名 Tag, 属性值 骚磊
            req.setAttribute("Tag", "骚磊");
    
            // 转发到WEB Application内部资源
            // getRequestDispatcher("dispatch2") 指定的内部资源名字
            // forward(req, resp) 转发到指定资源,并且带有当前对应用户请求的request对象和response对象
            req.getRequestDispatcher("/dispatch2").forward(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    package com.qfedu.a_url;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * 转发目标 DispatchServlet2
     *
     * @author MI 2020/3/31 10:19
     */
    @WebServlet("/dispatch2")
    public class DispatchServlet2 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // DispatchServlet1 中存储一个键值对数据在Request对象中,如果是同一个请求Request对象
            // 可以取出对应的数据
            Object tag = req.getAttribute("Tag");
            System.out.println("DispatchServlet1 设置的Request对象 Tag属性:" + tag);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    1.3 请求资源路径
    浏览器输入: 
        http://localhost:8080/Day42/dispatch
        
    HOST:
        http://127.0.0.1:8080
        
    资源名:
        Day42/dispatch
    
    Tomcat收到Day42/dispatch,资源请求之后,首先找到Day42项目或者说路径,然后在web.xml或者注解中找到url-pattern 为 dispatch的内容。从而执行对应的Servlet
    
    url-pattern是存在匹配原则
        精确匹配
            /具体名字
        后缀名匹配
            *.do *.action 
            *.xxx  主要是按照规定结尾的url-pattern都可以触发对应的Servlet程序
        通配符匹配
            /* 匹配所有请求,服务器端所有资源都可以匹配
    
    1.4 单Servlet实现多请求
        WEB Application中Servlet是整个WEB项目的核心,Servlet用于接收用户的请求,并且处理用户响应,每一个业务逻辑都有一个对应的Servlet,Servlet非常非常多,对于Servlet容器是存在一定压力的。
        采用Servlet做一个分发操作,分发用户去请求和对应的响应,让别人处理。Servlet程序做的事情就非常的Easy了
        
        需要对于用户请求的URL进行解析操作,通过一写特定的参数完成分发操作,让一个Servlet程序能够满足多个条件处理。
        
    后缀名匹配:
        *.do匹配
    
    单Servlet分发操作代码演示
    package com.qfedu.b_transfer;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    /**
     * 分发操作的Servlet,使用*.do匹配,并且解析操作,执行对应的方法
     *
     * @author MI 2020/3/31 11:09
     */
    @WebServlet("*.do")
    public class TransferServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String requestURI = req.getRequestURI();
            System.out.println(requestURI);
    
            String method = requestURI.substring(requestURI.lastIndexOf("/") + 1, requestURI.lastIndexOf("."));
            System.out.println(method);
    
            Class<ExecuteMethod> executeMethodClass = ExecuteMethod.class;
            Method method1 = null;
            try {
                method1 = executeMethodClass.getMethod(method);
                method1.invoke(null);
            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
    
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    package com.qfedu.b_transfer;
    
    /**
     * 目标执行方法
     *
     * @author MI 2020/3/31 11:10
     */
    public class ExecuteMethod {
        public static void add() {
            System.out.println("Add Method");
        }
    
        public static void delete() {
            System.out.println("Delete Method");
        }
    
        public static void update() {
            System.out.println("Update Method");
        }
    
        public static void select() {
            System.out.println("Select method");
        }
    }
    

    2. ServletContext Servlet上下文对象

    2.1 ServletContext 概述
        Servlet上下文对象,当WEB Application启动时,Tomcat服务器会根据web.xml以及注解方式,创建一个唯一的ServletContext对象,包含整个项目中很多核心的资源数据,并且是一个整个WEB Application的【公共区域】,所有的Servlet程序和JSP程序都可以使用ServletContext中存储的数据。
        当WEB Application项目关闭时,ServletContext对象被销毁
    
    2.2 如何获取ServletContext 对象
    方式一:
        GenericServlet可以通过getServletContext方法获取
    方式二:
        ServletConfig接口中提供了getServletContext方法获取
    方式三:
        HttpSession提供getServletContext方法获取
    方式四:
        HttpServletRequest提供getServletContext方法获取
    
    2.3 ServletContext对象操作演示
    ServletContext对象特征
        1. 唯一性,不管通过哪一个方式获取,都是同一个对象
        2. WEB Application启动时加载创建,退出时销毁
        3. ServletContext中存储的数据时一个共享资源,使用小心
        4. ServletContext是一个【域对象】
    
    package com.qfedu.c_servletcontext;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    /**
     * @author MI 2020/3/31 11:28
     */
    @WebServlet("/TestServletContext")
    public class TestServletContext extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 1. 可以直接通过当前Servlet对象来获取对应的ServletContext数据 【墙裂推荐】
            ServletContext servletContext1 = this.getServletContext();
    
            // 2. 通过ServletConfig对象获取对应的ServletContext对象
            ServletContext servletContext2 = this.getServletConfig().getServletContext();
    
            // 3. 通过Request请求对象获取对应都是ServletContext对象
            ServletContext servletContext3 = req.getServletContext();
    
            // 4. 通过HtttpSession对象获取ServletContext对象
            HttpSession session = req.getSession();
            ServletContext servletContext4 = session.getServletContext();
    
            System.out.println(servletContext1 == servletContext2);
            System.out.println(servletContext2 == servletContext3);
            System.out.println(servletContext3 == servletContext4);
            
            /*
            有效方法1:
                获取当前项目的发布路径
             */
            System.out.println(servletContext1.getRealPath("/"));
    
            /*
            有效方法2:
                获取服务器版本号
                可以资源的根目录
             */
            System.out.println(servletContext1.getServerInfo());
            System.out.println(servletContext1.getContextPath());
    
            /*
             有效方法3:
                作为数据传递的容器
             */
            servletContext1.setAttribute("Tag", "吴磊");
            /*
            有效方法4:
                ServletContext 刚刚区域数据存储还是删除
             */
            System.out.println(this.getServletContext().getAttribute("Tag"));
            this.getServletContext().removeAttribute("Tag");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

    3. 小案例

    从前端提交数据到后台,保存到数据库中
    

    4. HttpServletRequest对象

        HttpServletRequest对象是有服务器根据用户的请求创建得到,一个请求对应一个Request对象。
    
    继承关系
        interface ServletRequest
        --| interface HttpServletRequest
        Tomcat完成的符合HttpServletRequeset接口的实现类对象,对应Requeset
        ----| org.apache.catalina.connector.RequestFacade
    
    Request对象中存在一大堆的方法
    
    方法名 功能
    getMethod() 获取请求方式 GET or POST
    getRequestURL() 获取用户访问浏览器的完整路径
    getRequestURI() 获取用户请求资源名
    getContextPath() 获取虚拟目录名 Application Context
    getQueryString() GET请求的所有参数,POST请求通过请求实体无法获取
    getProtocol() 获取当前使用的网络传输协议 HTTP/1.1
    getRemoteAddr() 获取客户端IP地址
    getRemoteHost() 主机地址
    getRemotePort() 用户请求当前资源的端口号
    getRemoteUser() 用户名字
    Enumeration<String> getHeaderNames() 获取所有请求头名字
    getHeader(String) 获取指定请求头名称对应的值
    请求参数相关方法【重点】
    方法 功能
    String getParameter(String) 根据指定的参数名获取对应的值,返回值类型为String
    Enumeration<String> getParameterNames() 获取所有参数的名字
    String[] getParameterValues(String) 获取指定参数名对应的字符串数组参数值 例如: 多选
    Map<String, String[]> getParameterMap() 获取当前Request请求中所有参数和参数值的Map双边队列,而且可以存着数组形式【框架常用】

    5. HttpServletResponse

        用户发送请求到服务器,服务器会对应当前用户的请求针对性的提供的响应,对应的就是HttpServletResponse对象
        服务器可以通过response对象发送响应告知浏览器,浏览器可以根据服务器响应数据进行解析操作。
    
    方法 功能
    setContentType() 设置当前响应返回数据类型
    PrintWriter getWriter() 字符流对象
    setHeader(name, value) 设置响应头信息
    setStatus(int) 设置当前页面的状态码
    getOutputStream() 输出字节流对象

    相关文章

      网友评论

        本文标题:java基础-day40-ServletRequest和Serv

        本文链接:https://www.haomeiwen.com/subject/sgleultx.html