美文网首页
19.servlet

19.servlet

作者: 星野君 | 来源:发表于2022-05-02 11:01 被阅读0次

    一、快速入门
    1.pom.xml里添加依赖

        <dependencies>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.0.1</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    
    1. 实现接口
    public class ServletDemo01 implements Servlet
    
    1. 重写方法,编辑访问路径
    @WebServlet("/demo")
    public class ServletDemo01 implements Servlet{
      @Override
      public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("hello servlet");
      }
    
      @Override
      public ServletConfig getServletConfig() {
        return null;
      }
    
      @Override
      public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    
      }
    
      @Override
      public String getServletInfo() {
        return null;
      }
    
      @Override
      public void destroy() {
    
      }
    }
    
    1. 正常我们不去实现servler接口,而是去继承httpservlet类
    @WebServlet("/demo02")
    public class ServletDemo02 extends HttpServlet {
    
      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get");
      }
    
      @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post");
      }
    }
    
    

    二、生命周期
    1.加载和实例化,默认情况下,servlet第一次访问时,由容器创建一个servlet对象,非默认情况下可以通过

    @WebServlet(urlPatterns="/demo", loadOnStartup = 1)
    

    loadOnStartup 为负整数时,就是默认情况,0或者整数时,服务器创建的时候就创建servlet对象,数字越小优先级越高

    1. 初始化,servlet实例化后,会调用init()方法完成初始化,该方法只会调用一次
    2. 请求处理,每次请求servlet的时候,容器都会调用servlet的service()方法对请求进行处理
    3. 服务终止:当需要释放内存或关闭容器时,就会调用servlet的destroy()方法完成资源的释放,调用完此方法后,容器会释放这个实例,该实例随后会被java的垃圾收集器回收

    三、获取参数

    1. request.getParameter()
    2. request.getParameterValues()

    解决中文参数乱码:

    //post方式
    request.setCharacterEncoding("UTF-8");
    //post和get
    String name = request.getParameter("name");
    name = new String(name.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
    
    1. 请求转发
    request.getRequestDispatcher("/demo02").forward(request,response);
    //数据共享
    request.setAttribute();
    request.getAttribute()
    
    1. 重定向
    //  获取虚拟目录
    String contextPath = request.getContextPath();
    response.sendRedirect(contextPath +"/demo02");
    
    1. response获取字符输出流
    response.setContentType("text/html;charset=utf-8");
    final PrintWriter writer = response.getWriter();
    writer.write("<h>哈哈哈</h>");
    
    1. response字节输出流
    final FileInputStream fileInputStream = new FileInputStream("d://test.jpg");
    final ServletOutputStream outputStream = response.getOutputStream();
    // 使用了IOUtils工具类完成拷贝
    IOUtils.copy(fileInputStream, outputStream);
    fileInputStream.close();
    

    四、web.xml

    1. 命名空间
      在 web.xml 中,使用的 web-app_4_0.xsd 文件定义的规则,需要指定这个文件的位置。
    <web-app 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                            http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" 
        id="WebApp_ID" version="4.0">
    </web-app>
    
    1. Servlet配置
        这是我们常用的一个配置,主要使用的标签是<servlet></servlet>为Servlet 命名和<servlet-mapping></servlet-mapping>为 Servlet 定制 URL。
    <project..>
        <servlet>
            <servlet-name>TestServlet</servlet-name>
            <servlet-class>D20210220.TestServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>TestServlet</servlet-name>
            <url-pattern>/TestServlet</url-pattern>
        </servlet-mapping>
    </project>
    

    在 <servlet> 标签中, <servlet-name> 中设置的是为 Servlet 注册的名字,要保证该名字在 web.xml 文件中是唯一的,一般直接使用类名即可,<servlet-class> 中设置的是需要配置的 Servlet 的全类名。
      在 <servlet-mapping> 中, <servlet-name> 中的名字,需要和 <servlet> 中的名字一致,<url-pattern> 为这个 Servlet 映射一个对外访问路径。

    servlet 和 url-pattern 之间的关系是 一对多的关系。

    1. Filter 配置
      在学习了 Servlet 的配置之后,学习 Filter 的配置就很简单了。
        Filter 的配置和 Servlet 的配置很相似,只是将 servlet 换成 filter 而已。
    <filter>
        <filter-name>Filter1</filter-name>
        <filter-class>D2020128.TestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Filter1</filter-name>
        <url-pattern>/TestServlet</url-pattern>
    </filter-mapping>
    

    Filter 的配置中和 Servlet 配置差别较大的地方在于 url-pattern,Servlet 的 url-pattern 中配置的路径是访问 Servlet 的路径,而 Filter 的 url-pattern 中配置的路径是访问已经存在的网络资源,如静态页面、jsp、servlet等。
       filter 和 url-pattern 之间的关系是 多对多的关系。即,一个 filter 可以有多个 url-pattern(使用多个 URL 地址,都会访问同一个 FIlter),多个 filter 可以对应一个 url-pattern(多个 filter 会根据 web.xml 中配置的顺序组成 filter 链)。
      因此,Filter 的 url-pattern 有一种配置是<url-pattern>/*</url-pattern>,表示所有外部访问都需要先经过该过滤器。
       Filter 应用场景:防盗链编码过滤器

    1. Listener 配置
      Listener 不需要处理外界访问,所以它的配置不需要定制 URL,因此只需要配置<listener>
    <listener>
        <listener-class>Listener的全类名<listener-class>
    </listener>
    

    注解配置

    在 Servlet 3.0 版本以上,可以使用@WebServlet注解代替 web.xml 进行配置,@WebServlet的配置是一套独立的用法。

    Servlet 注解配置

    一般用@WebServlet( "/TestServlet1")即可,其中 TestServlet1 的位置可以自己起一个名字,但是需要注意不能在项目中有重名。

    下面展示一下@WebServlet注解的复杂一些的用法,不做详解

    @WebServlet(urlPatterns = "/TestServlet1",initParams = {
            @WebInitParam(name = "name1",value="value1"),
            @WebInitParam(name = "name2",value="value2")
    }, name = "Hello")
    

    Filter 注解配置
      在 Filter 类文件的开头处写上 @WebFilter("/TestFilter")

    相关文章

      网友评论

          本文标题:19.servlet

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