首页 > 编程语言 > 详细

JavaEE-Servelt

时间:2020-12-04 14:25:01      阅读:17      评论:0      收藏:0      [点我收藏+]

1.0 Servlet概述
    1.1 什么是Servlet
        由Sun公司提供的一个动态Web开发技术,是JavaWeb开发的核心,之后的SpringMVC等WEB框架都是对于Servelt的封装
        
        Servlet是Server与Applet的缩写,即运行在服务端的Java小程序
        
        普通的Java类只需要遵循Servlet规范编写,继承或实现Servlet接口,部署在服务器端的程序都可以被称为Servlet应用
        
        所以,Servlet本质上仍然是一个Java类,但它没有main方法,必须依赖于Tomcat等Web应用服务器才可以运行
        
        概括为一句:
            遵循Servlet规范编写的,继承或实现Servlet接口的,部署在服务器端的Java程序就是Servlet...
            
    1.2 为什么使用Servlet
        了解Servlet是什么之后,接下来介绍Servlet能为我们做什么,为什么要使用Servlet
        
        有提到,Serlvet是一门开发动态Web的技术
        
        静态Web
            1.纯粹的由HTML等技术构建的网页,文件完整的放在服务端
            2.整个页面是不会产生变化的,无法做到数据的实时更新
            
        动态Web
            1.融入了Servlet或PHP等其它技术,文件只是作为一个半成品存放在服务端
            2.整个页面是变化的,根据用户的不同请求,生成不同的页面
            
        简单的来说,Servlet可以接收页面请求并返回数据
        示例:
            一个用户输入了用户名和密码,发起账户登陆请求
            Servlet程序接收了请求,并将数据发送到数据库中进行检索
            数据库返回检索结果,Serlvet根据数据库结果返回不同的响应数据到页面
            1.该用户的用户名密码存在且正确,Servlet返回响应数据-通过,用户成功登陆
            2.该用户的用户名不存在或密码错误,返回响应数据-不通过,用户登陆请求拒绝
        
        当使用了Servlet等动态Web技术以后,可以灵活的处理和响应用户请求,更好的实现页面交互
        如果是静态Web,那么很多的功能会无法实现或实现十分的麻烦
        
    1.3 实现一个简单的Servlet程序
        1.打开IDEA,创建一个Maven项目或JavaEE项目,这里使用的是Maven(建议使用Maven,往后的JavaEE项目的复杂度会很高)
        2.基于原型创建,选择模板-org.apache.maven.archetypes:maven-archetype-webapp,键入项目路径和项目名称,完成创建
        3.编辑pom.xml文件,去除无用的模板生成代码,写入Servlet依赖
          <dependencies>
            <dependency>
              <groupId>javax.servlet</groupId>
              <artifactId>javax.servlet-api</artifactId>
              <version>4.0.1</version>
            </dependency>
          </dependencies>
        4.导入本地的Tomcat,配置端口和项目名称
        5.在webapps新建统计目录java,并编写Servlet类Hello,具体代码如下
            @WebServlet("/hello")
            public class Hello extends HttpServlet {
                @Override
                protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                    System.out.println("浏览器访问该路径下的Servlet程序,打印输出");
                }
            }
        6.运行Tomcat程序,访问设置的Servlet程序的虚拟路径,例如:http://localhost:8080/untitled1_war_exploded/hello
        7.查看IDEA控制台输出结果,是否打印出:浏览器访问该路径下的Servlet程序,打印输出
        
        这是一个简单的Servlet演示Demo,具体的细节会在之后讲解,现在只做大致解释:
            @WebServlet("/hello"):一个Servlet注解,放置在Servlet类上,填写访问该类的路径
            extends HttpServlet:继承Servlet的具体实现类,重写Servlet的doGet等方法
            doGet方法:表示接收处理提交到该Servlet路径上的所有GET请求
        
        现在,我们知道,通过编写Servlet程序并部署到Tomcat服务器内,可以通过IP地址和端口号及项目名称路径访问到具体的Web项目
    
        可以粗略的感受到,项目路径是动态指定的,路径下的文件也不是直接写好的,而是根据请求的不同动态生成页面并返回
        
    1.4 Servlet规范
        有提到,Servlet类必循遵循Servlet规范进行编写,接下来,简述下Servlet的规范
        
        首先,Servlet规范是JavaEE规范中的一种
        
        Servlet规范有如下三种作用(动态资源文件指的是Servlet接口的实现类):
            1.规定Servlet动态资源文件的开发步骤
            2.规范HTTP服务器调用动态资源文件
            3.规范HTTP服务器管理动态资源文件实例对象    
            
        Servlet动态资源文件的开发步骤
            1.创建Java类,继承HttpServlet,使得该类成为Servlet接口的实现类
            2.重写HttpServlet中的两个主要方法,doGet()和doPost()
            3.将该Servlet类注册到服务器(Tomcat)中:
                1.将信息通过XML的形式注册到web.xml中
                2.将信息通过注解的形式直接写在该类的上方(推荐使用)
            
        Servlet规范的接口
            Servlet:核心接口,它是所有Servlet类必须实现的接口
            
            ServletRequest:封装了客户端请求的所有信息,例如获取请求参数或请求地址    
            
            ServletResponse:封装了服务器要返回客户端的所有信息,例如响应数据回浏览器    
            
            ServletContext:定义了运行所有Servlet的服务器,可以获取相关的配置信息
            
            Filter:允许Web容器对请求和响应做统一处理,例如,统一改变HTTP请求内容和响应内容,它可以作用于某个Servlet或一组Servlet
            
            会话:Servlet没有提出协议无关的会话规定,而是每个通信协议自己规定,例如HTTP对应的会话接口是HttpSession
            
            注解:Web应用中,使用了注解的类只有被放到WEB-INF/classes目录中或WEB-INF/lib目录下的jar中,注解才会被Web容器处理,常用的注解如@WebServlet()
                
2.0 Servlet生命周期与接口实现
    2.1 什么是生命周期
        一个Servlet程序存在着三个阶段    初始化程序 -> 服务处理 -> 程序销毁
        在Servlet中分别由三个方法表示生命周期的三个阶段
        
        init() 初始化程序 在该Servlet第一次被访问时调用,但整个生命周期仅执行一次
        service() 服务处理 用于处理客户端请求和响应 在整个生命周期可以执行多次
        destory() 销毁程序 用于结束当前Servelt程序的运行 是在生命周期的最后一个执行,仅可执行一次
        
        Servlet对象的生命周期由容器管理,无法人为干涉
        
    2.2 init初始化
        当客户端发送请求到服务端,Servlet服务会根据请求路径寻找指定的Servlet,若未初始化则调用init()方法
        init()方法在整个Servelt生命周期中,是第一个调用的方法,用于Servlet程序的初始化工作,仅可调用一次
        
        示例:
            创建一个Servlet程序,覆盖重写init,启动Tomcat服务器
            打开浏览器,多次发起访问请求
            查看IDEA控制台
            init方法最先被调用,但只被调用一次
    
    2.3 service服务处理(运行阶段)
        service是Servelt程序生命周期中最核心的最重要的阶段,它主要负责调用doGet或doPost方法,完成请求处理和结果响应
        
        示例:
            创建一个Servlet程序,覆盖重写service,启动Tomcat服务器
            打开浏览器,多次发起访问请求
            查看IDEA控制台
            service可以被多次调用
    
    2.4 destory程序销毁
        当服务器关闭时,Servlet的destory会被自动调用,销毁Servlet程序,JVM负责垃圾的回收
        
        示例:
            创建一个Servlet程序,覆盖重写destory,启动Tomcat服务器
            打开浏览器,多次发起访问请求
            查看IDEA控制台
            Servlet程序处理请求的时候,init最先加载,service被多次加载,但是destory没有被调用
            此时,清空IDEA控制台,停止Tomcat的运行
            在彻底关闭之前,destory被调用...
        
    2.5 生命周期的总结
        Servlet的生命周期分为三个阶段,分别由init,service,destory表示
        
        生命周期的初始化和销毁执行且只执行一次,分别在程序初始化和销毁时调用
        
        service最为重要,负责将不同的请求调用不同的放啊进行处理并返回响应数据
        
        生命周期不受人为的干涉,由Servle容器(Tomcat)自动处理
        
    2.6 Servlet 接口
        Servlet是一个接口类,是Servlet程序最顶层的类,其它诸如GenericServlet,HttpServlet等实现类都是直接或间接地继承于Servlet接口。
        
        在IDEA中通过Ctrl Shift N 快捷键 打开搜索框 输入Servlet进行查找
        
        此时,会发现,Servlet接口类中只有五个方法
                
            void init(ServletConfig var1) throws ServletException;
    
            ServletConfig getServletConfig();
        
            void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
        
            String getServletInfo();
        
            void destroy();
            
         表示Servelt生命周期:init service destory
        
         另外两个了解即可,负责获取该Servelt的配置和信息
        
         getServletConfig():读取web.xml中配置的初始化参数
        
         ServletContext():Tomcat服务器启动时创建,代表当前的整个应用,用于获取整个应用的配置信息    
        
    2.7 GenericServlet 抽象类
        接口的多级抽象封装意义请参考Java的SE基础(接口与抽象)
    
        GenericServlet实现了Servlet接口,进行了功能的拓展
        
        GenericServlet对于Servlet中的init和destory方法做了保留,并未覆盖重写
        
    2.8 HttpServlet 抽象类
        HttpServlet继承了GenericServlet,间接实现了Servlet接口,极大的拓展了Servlet的功能
        其中最明显的是
            在接受请求的方法中,详细的定义区分了七种不同的方法,其中以doGet与doPost最为常用
            这七种请求方式在WEB页面中也是支持的,这样更好的区分WEB交互时的数据交互    
        HttpServlet是目前主流的Servlet,接下来的关于Servelt的讲解中,使用的都是HttpServlet实现类

3.0 Servlet基本使用

    虚拟路径映射
        Servlet程序需要一个地址,用于接收请求
        
        有以下两种Servlet的路径配置方式
        
        XML配置
            展开webapp目录,编辑最内层的web.xml
            将以下内容写入<web-spp>标签内
              <servlet>
                <servlet-name>Hello</servlet-name>
                <servlet-class>com.servelt.Hello</servlet-class>
              </servlet>
              <servlet-mapping>
                <servlet-name>Hello</servlet-name>
                <url-pattern>/hello</url-pattern>
              </servlet-mapping>
              该内容是对某一个Servlet类的配置
              <servlet>:主要配置
                  <servlet-name>:名称,可任意,但建议与类名保持一致
                  <servlet-calss>:填写Servlet类的全路径,例如:com.servlet.Hello
              <servlet-mapping>:映射配置
                  <servlet-name>:该名称必须与servlet中的servlet-name保持一致,表示唯一的映射
                  <url-pattern>:写入该Servlet类的URL访问路径,例如:/hello
        
        注解配置
            @WebServlet注解,放置与Servlet类的上方
            先看两个配置示例:
                @WebServlet(value = "/hello")
                @WebServlet("/hello")
            可以得出,当你在@WebServlet()直接写入字符串形式的URL映射路径时,默认是value = "" 的简写
            当你不需要配置其它Servlet项的时候,简写是推荐使用的,它也是大多Servlet路径的配置方式
            
        关于XML配置和注解配置,它们虽各有优劣,但相对而言的话,注解的方式更方便高效
        
    Request 请求
        Request负责接收处理客户端的请求,实质上是封装了HTTP的请求头
        
        获取客户端参数
            req.getRequestURI():获取客户端发送请求的完整的URL路径
                示例:
                1.Servlet类写入String requestURI = req.getRequestURI();
                2.自定义任意页面表单发送请求至该Servlet
                3.打印接收结果到控制台,例如:System.out.println("请求发送的URL地址:" + requestURI);
                
            req.getQueryString():获取URL请求中携带的参数
                示例:
                1.Servlet类写入String queryString = req.getQueryString();
                2.自定义任意页面表单发送请求至该Servlet
                3.打印接收结果到控制台,例如:System.out.println("URL中携带的参数:" + queryString);
            
            req.getMethod():获取客户端发送请求的方式
                示例:
                1.Servlet类重写doGet/doPost,并在其中写入String reqMethod = req.getMethod();
                2.自定义任意页面表单至该Servlet,提交方式为GET/POST
                3.打印接收结果到控制台,例如:System.out.println("请求发送的方式:" + reqMethod);
                
            req.getRemoteAddr():获取请求客户端的IP地址
                示例:
                1.在Servlet的doGet方法内写入String remoteAddr = req.getRemoteAddr();
                2.通过任意页面表单发送请求至该Servlet
                3.打印接收结果到控制台,例如:System.out.println("客户端的IP地址:" + remoteAddr);       
                
            req.getContextPath():获取当前WEB应用的虚拟目录名称
                示例:
                1.doGet方法内写入String contextPath = req.getContextPath();
                2.从页面发送请求至Servlet类
                3.打印输出结果,例如: System.out.println("当前Web应用的虚拟目录:" + contextPath);
                        
        获取请求参数
            req.getParameter(String name):填入字符串,返回字符串
                接收一个请求参数,例如密码框(单个name值对应的单个参数)
                示例:
                1.在index.jsp中写入一个简单的表单,例如:<input type="text" name="userName">,其中name是Servlet可以接收的URL参数
                2.表单提交不指定默认为GET方式,提交地址填写为项目名跟Servlet路径,例如:/untitled1_war_exploded/hello
                3.创建一个Servlet类,重写doGet方法
                4.创建字符串变量接收参数,例如:String userName = req.getParameter("userName");
                        5.打印接收结果到控制台,例如:System.out.println("doGet方法调用,接收到前端参数:" + userName);
            
            req.getParameterValues(String name):填入字符串,返回字符串数组
                接收多个请求参数,例如复选框(同name值的不同参数)
                示例:
                1.同样写入表单,写入一个复选选项框,例如:
                    <input type="checkbox" name="hobby" value="游泳">
                    <input type="checkbox" name="hobby" value="登山">
                    <input type="checkbox" name="hobby" value="敲代码">
                2.默认GET提交,定义提交地址
                3.创建一个Servlet类,重写doGet方法
                4.创建字符串数组变量接收参数,例如:String[] hobbies = req.getParameterValues("hobby");
                5.打印接收结果到控制台,例如:System.out.println("doGet方法调用,接收到前端参数:" + Arrays.toString(hobbies));
                
            req.getParameterMap():接收多个请求参数,以Map形式保存,返回值为Map<String, String[]>
            
            req.getParameterNames():获取当前提交的所有参数的参数名(非参数值)
                示例:
                Enumeration<String> parameterNames = req.getParameterNames();
                while (parameterNames.hasMoreElements()){
                    System.out.println("参数:" + parameterNames.nextElement());
                }
        
        req.setCharacterEncoding():自定义接收请求的编码,例如:req.setCharacterEncoding("UTF-8");
    
    Response 响应
        Response 负责响应数据回客户端,实质上是封装了HTTP的响应头
        
        设置状态码
            response.setStatus(int status)设置状态码,例如:resp.setStatus(200);
        
        设置响应头
            setHeader(String name, String value) 通过给定的名称和值设置响应头。若响应头已经存在,则会覆盖重写
            
            setDateHeader(String name, long date) 通过给定的名称和日期值设置响应头,该日期根据距历元时间的毫秒数指定。若响应头已经存在,则会覆盖重写
                
            setIntHeader(String name, int value) 此方法的默认行为是对包装的响应对象调用 addIntHeader(String name, int value)
            
            addHeader(String name, String value) 通过给定的名称和值添加响应头,此方法允许响应头有多个值
            
            addDateHeader(String name, long date) 通过给定的名称和日期值添加响应头,该日期根据距历元时间的毫秒数指定,此方法允许响应头有多个值
            
            addIntHeader(String name, int value) 通过给定的名称和整数值添加响应头。此方法允许响应头有多个值
        
        设置响应消息
            ServletOutputStream getOutputStream() 以字节输出流的形式,响应数据到浏览器
                示例:
                1.doGet方法内写入如下内容
                    resp.getOutputStream().println("这是Servlet返回的响应消息,你的请求已经被接收,正在处理中......");
                2.通过页面表单发起请求
                3.浏览器页面就加载,接收并打印服务端响应数据:这是Servlet返回的响应消息,你的请求已经被接收,正在处理中......  
            
            PrintWriter getWriter():以字符输出流的形式,响应数据到浏览器
                示例:
                1.doGet方法内写入以下内容
                    resp.setContentType("text/html;charset=utf-8");
                    PrintWriter printWriter = resp.getWriter();
                    printWriter.println("这是Servlet返回的响应消息,你的请求已经被接收,正在处理中......");
                2.通过页面表单发起请求
                3.浏览器页面加载,接收并打印服务端响应数据:这是Servlet返回的响应消息,你的请求已经被接收,正在处理中......
                
            概括:当使用字符输出流响应数据时,需要指定响应体的字符编码(resp.setContentType("text/html;charset=utf-8");)
        
        域对象
            setAttribute(String s,Object o):存入数据到作用域
            
            getAttribute(String s):取出域对象中存放的数据
            
            removeAttribute(String name):移除作用域中的对象
            
            示例:
                1.接收Servlet写入:
                    resp.setContentType("text/html;charset=utf-8");
                    req.setAttribute("第一段话", "Servlet中的Request作用域对象");
                    req.setAttribute("第二段话", "只有请求转发的跳转是一次请求,重定向不是");
                    req.setAttribute("第三段话", "注意数据类型转换");
                    req.getRequestDispatcher("/two").forward(req, resp);
                2.转发的目标Servlet写入:
                    resp.setContentType("text/html;charset=utf-8");
                    System.out.println("+++++++++请求转发的目标地址");
                    String attribute1 = (String) req.getAttribute("第一段话");
                    String attribute2 = (String) req.getAttribute("第二段话");
                    String attribute3 = (String) req.getAttribute("第三段话");
                    System.out.println(attribute1 + "\n" + attribute2 + "\n" + attribute3);
                3.页面发送请求到接收的Servelt,之后查看IDEA控制台信息
        
        
    
4.0 请求转发与重定向
    请求转发:req.getRequestDispatcher().forward(req,resp);
        示例:
        1.新建两个Servlet程序,路径分别为/one,/two
        2.自定义页面表单发送请求给第一个Servlet:action="/untitled1_war_exploded/one"
        3.第一个Servlet通过请求转发给第二个Servelt:
            resp.setContentType("text/html;charset=utf-8");
            req.getRequestDispatcher( "/two").forward(req,resp);
        4.第二个Servlet响应回数据给浏览器:
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().println("请求已经从第一个Servlet转发到了第二个Servlet...");
            
        请求转发概括:
        1.请求转发属于服务端的跳转,相当于函数方法的调用,过程中的文件都属于同一次请求,共用一个Request作用域所以可以用于传递数据或session会话
        2.请求转发的过程中,地址栏不会发生改变
        3.请求转发不能指向服务器外部,例如转发到www.baidu.com,这也使得请求转发的速度相对较快
        4.请求转发时需要填写转发地址,其中"/"代表的是相对当前路径
    
    重定向:response.sendRedirect();
        示例:
        1.在Servlet中写入:
            resp.setContentType("text/html;charset=utf-8");
            resp.sendRedirect("https://www.bilibili.com/");
        2.自定义页面表单发起请求
        3.网页URL地址被重定向到哔哩哔哩
        
        重定向概括:
        1.重定向属于客户端的跳转,重定向是由两次请求组成,详解如下
            客户端发起请求给服务端    第一次请求
            服务端返回响应给客户端    第一次请求结束
            客户端根据响应向里一个服务端发起请求    第二次请求
        2.重定向的两次请求不是同一个,所以过程中不能共用一个Request作用域,不可以传输session等数据信息
        3.重定向的过程中,地址栏发生改变,为第二次实际请求的URL地址    
        4.重定向可以指向服务器外部,例如转发到https://www.bilibili.com/,所以重定向的速度相对于请求转发较慢
        5.重定向时需要填写重定向地址,其中"/"可以代表项目的根路径,所以书写地址时需要格外注意,建议使用request.getContextPath()方法获取项目的完整路径
    
    
5.0 会话管理
    提到Servlet会话,就应该记得在学习JavaSE网络编程中的七层模型-会话层
    接下来说的是对于它的理论的实现
    HTTP是无状态的协议,而会话就是为了维持HTTP状态而存在的技术
    会话指的是浏览器和服务器之间的请求与响应过程
    
    Cookie
        创建:new Cookie(String name, String value):
            Cookie cookie = new Cookie("zhangsan", "不是人");
        
        发送:response.addCookie(Cookie):
            resp.addCookie(cookie);
        
        获取:request.getCookies(),获取所有Cookie:
            Cookie[] reqCookies = req.getCookies();
        
        遍历:接收返回的是一个Cookie数组,可以使用增强for循环:
            Cookie[] reqCookies = req.getCookies();
            for (Cookie cookie : reqCookies) {
                System.out.println(cookie.getName());
                System.out.println(cookie.getValue());
                System.out.println("--------------");
            }
        
        调用:Cookie.getName():
            System.out.println(cookie.getName());
            System.out.println(cookie.getValue());
            
        有效期:void setMaxAge():
            cookie.setMaxAge(10);
            单位秒
            默认有效期是当前浏览器关闭前
                            
        注意:
            1.Cookie是存储于浏览器里的,意味着可以被修改伪造
            2.浏览器本身对于Cookie存在大小和数量限制,也可以拒绝存储Cookie
            3.默认情况下Cookie在浏览器关闭时失效,也可以手动设置失效时间

    Session
        获取:req.getSession():
            HttpSession reqSession = req.getSession();
        
        会话标识符:getId():
            String id = reqSession.getId();
        
        创建时间:getCreationTime():
            long creationTime = reqSession.getCreationTime();

        最后访问时间:getLastAccessedTime():
            long lastAccessedTime = reqSession.getLastAccessedTime();

        会话是否一致:isNew():
            boolean aNew = reqSession.isNew();
            
        JSESSIONID:此次会话的唯一标识
            1.每一次请求到达服务器时,会查看浏览器是否存在JSESSIONID这个Cookie
            2.如果不存在,则认为此次会话是一个新的会话,创建新的Session对象并根据Session的会话标识符生成新的会话标识JSESSIONID
            3.若存在,则会去查找匹配的Session对象,若匹配Session对象也存在,返回该对象,完成数据共享
            
        域对象
            setAttribute(String s,Object o):存入数据到作用域
            
            getAttribute(String s):取出域对象中存放的数据
            
            removeAttribute(String name):移除作用域中的对象
            
            示例:
                1.接收Servlet写入:
                    resp.setContentType("text/html;charset=utf-8");
                    HttpSession reqSession = req.getSession();
                    reqSession.setAttribute("第一段话","这是Session的域对象");
                    reqSession.setAttribute("第二段话","不是Request的域对象,但原理大致相同");
                    req.getRequestDispatcher("/two").forward(req,resp);
                2.转发的目标Servlet写入:
                    resp.setContentType("text/html;charset=utf-8");
                    System.out.println("+++++++++请求转发的目标地址");
                    HttpSession reqSession = req.getSession();
                    String attribute1 = (String) reqSession.getAttribute("第一段话");
                    String attribute2 = (String) reqSession.getAttribute("第二段话");
                    System.out.println(attribute1 + "\n" + attribute2 + "\n");            
                        3.页面发送请求到接收的Servelt,之后查看IDEA控制台信息
                
                有效时间(不操作时间)
                    默认有效时间实际指的是无任何操作的时间,即会话停止多长时间会关闭,如果进行了操作,则失效时间重新倒计时
                    
                    有如下三种方式配置有效时间:

                    1.服务器(Tomcat)内部默认失效时间:
                        打开conf目录下的web.xml
                        找到以下配置,其中30是Tomcat的默认时间,单位分钟
                    <session-config>
                        <session-timeout>30</session-timeout>
                    </session-config>
                不建议直接服务器的默认配置,因为服务器上运行的不仅有一个WEB项目
                    2. reqSession.setMaxInactiveInterval():手动设置到期时间,单位为秒
                        getMaxInactiveInterval()可以查看当前Session对象的有效期
                        直接查看,结果是1800秒,与Tomcat的默认设置匹配
                    3.reqSession.invalidate():直接销毁当前Session会话信息,可以通过浏览器控制台的存储Cookie里的JSESSIONID判断是否销毁        
                    
6.0 ServletContext
    在一个WEB应用中,有且仅有一个ServletContext对象,也可以称为Application对象,作用范围为整个应用程序
    
    该对象与应用程序相关,在WEB服务器启动时会为每一个WEB应用程序创建一个对应的ServletContext对象
    
    该作用域对象极为重要,它的数据是在整个应用程序中共享的,并保留有当前应用程序的相关信息,操作时需谨慎    
    
    获取和使用ServletContext作用域对象有四个方式:
        1.Request:req.getServletContext():推荐使用
        
        2.Session:req.getSession().getServletContext()
        
        3.ServletConfig:getServletConfig().getServletContext()
        
        4.在Servlet类中直接获取:getServletContext()
    
    ServletContext常用方法:
        1.getServerInfo():获取当前服务器的版本信息,例如:Apache Tomcat/8.5.56
        2.getRealPath():获取当前项目的服务器绝对路径,例如:D:\DEMO\JavaEE\untitled1\target\untitled1-1.0-SNAPSHOT\
        3.servletContext.setAttribute():存
        4.servletContext.getAttribute():取
        5.servletContext.removeAttribute():移除
        6.getResourceAsStream(String str):获取资源输入流对象
        
    在这里,大致归纳一下关于Servlet的三大域对象
        1.request作用域对象:作用域范围是一次请求,仅请求转发有效,重定向为二次请求
        2.session作用域对象:一次会话中有效,请求转发和重定向都视为有效范围
        3.ServletContext作用域镀锡:覆盖整个应用程序,直至服务器关闭才失效
        
7.0 文件传输
    在日常开发中,文件的上传与下载是一个很重要的存在,接下来,将通过Servlet来演示这些操作
    
    文件的上传(非原生文件上传)
        1.添加Maven依赖:
            <dependency>
                  <groupId>commons-io</groupId>
                  <artifactId>commons-io</artifactId>
                  <version>2.6</version>
            </dependency>
            <dependency>
                  <groupId>commons-fileupload</groupId>
                  <artifactId>commons-fileupload</artifactId>
                  <version>1.3.3</version>
            </dependency>
        2.编写前端上传表单:
            <form action="/one" enctype="multipart/form-data" method="post">
                <input type="file" name="file">
                <input type="submit">
            </form>
        3.编写后台处理Servlet:
            

                    
6.0 过滤器与监听器
    过滤器和监听器的本质仍是Servlet类,只是

    过滤器:过滤器是在客户端和服务端之间建立一个拦截网,可以被双方的请求响应数据进行过滤筛选处理,比如过滤敏感字符,进行权限校验或处理中文乱码问题



    监听器:

7.0 底层原理与实现
       

JavaEE-Servelt

原文:https://www.cnblogs.com/StruggleOrLieDown/p/14085196.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!