欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Servlet系列两种创建方式,

来源: javaer 分享于  点击 21164 次 点评:169

Servlet系列两种创建方式,


目录
  • 一、使用web.xml的方式配置(Servlet2.5之前使用)
    • url-pattern匹配规则
    • load-on-startup说明
  • 二、使用注解的方式配置(Servlet3.0后支持,推荐)
    • @WebServlet注解
  • 三、封装BaseServlet
    • 四、测试

      一、使用web.xml的方式配置(Servlet2.5之前使用)

      在早期版本的Java EE中,可以使用XML配置文件来定义Servlet。在web.xml文件中,可以定义Servlet的名称、类名、初始化参数等。然后,在Java代码中实现Servlet接口,并覆盖其中的doGet()或doPost()方法来处理请求。

      web.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               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">
        <display-name>java-servlet-demo02</display-name>
        <!-- servlet配置 -->
        <servlet>
          <!-- 名称 -->
          <servlet-name>WebXmlServlet</servlet-name>
          <!-- servlet全称类名 -->
          <servlet-class>com.mcode.servlet.controller.WebXmlServlet</servlet-class>
          <!-- 启动的优先级,数字越小越先起作用 -->
          <load-on-startup>1</load-on-startup>
        </servlet>
        <!-- 映射配置 -->
        <servlet-mapping>
          <!-- 对应名称 -->
          <servlet-name>WebXmlServlet</servlet-name>
          <!-- 资源匹配规则:精确匹配 -->
          <url-pattern>/webxml</url-pattern>
        </servlet-mapping>
      </web-app>
      

      WebXmlServlet

      package com.mcode.servlet.controller;
      
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      /**
       * ClassName: WebXmlServlet
       * Package: com.mcode.servlet.controller
       * Description:
       *
       * @Author robin
       * @Version 1.0
       */
      public class WebXmlServlet extends HttpServlet {
          @Override
          protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //设置编码方式
              resp.setCharacterEncoding("UTF-8");
              //指定客户端解码方式
              resp.setHeader("content-type", "text/html;charset=UTF-8");
              //输出
              resp.getWriter().write("基于webxml方式配置的servlet");
          }
      }
      

      效果图

      image

      url-pattern匹配规则

      匹配规则取值说明
      精确匹配/具体的名称只有url路径是具体的名称的时候才会触发 Servlet
      后缀匹配*.xxx只要是以xxx结尾的就匹配触发Servlet
      通配符匹配/*匹配所有请求,包含服务器的所有资源
      通配符匹配/匹配所有请求,包含服务器的所有资源,不包括.jsp

      load-on-startup说明

      • 元素标记容器是否应该在web应用程序启动的时候就加载这个 servlet

      • 它的值必须是一个整数,表示 servlet被加载的先后顺序

      • 如果该元素的值为负数或者没有设置,则容器会当serv1et被请求时再加载

      • 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个 servlet,值越小, servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载

      二、使用注解的方式配置(Servlet3.0后支持,推荐)

      从Java EE 5开始,可以使用注解来创建Servlet。通过在Java类上添加@WebServlet注解,可以将该类作为Servlet来处理。在注解中,可以指定Servlet的名称、URL映射等。

      AnnotationServlet

      package com.mcode.servlet.controller;
      
      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;
      
      /**
       * ClassName: AnnotationServlet
       * Package: com.mcode.servlet.controller
       * Description:
       *
       * @Author robin
       * @Version 1.0
       */
      @WebServlet("/annotation")
      public class AnnotationServlet extends HttpServlet {
          @Override
          protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //设置编码方式
              response.setCharacterEncoding("UTF-8");
              //指定客户端解码方式
              response.setHeader("content-type", "text/html;charset=UTF-8");
              //输出
              response.getWriter().write("基于注解方式配置的servlet");
          }
      }
      

      注意:response中的set的一些方法必须写在response.getWriter()之前

      It does not set the response's characterencoding if it is called after getWriterhas been called or after the response has been committed.

      效果图

      image

      @WebServlet注解

      属性:下面是一些常用属性,value和url一般是必须的,但是二者不能共存,若同时指定,一般自动忽略value。

      属性名类名属性描述
      nameString指定servlet的name属性,等价于<servlet-name>,若没有指定,则默认是类的全限定名
      valueString[]等价于urlPatterns,两者不能共存
      urlPatternsString[]指定一组servlet的url的匹配模式,等价于<url-pattern>
      loadOnStartupint指定servlet的加载顺序,等价于<load-on-startup>
      initParamsWebinitParams[]指定一组初始化参数,等价于<init-params>
      asyncSupportedboolean申明servlet是否支持异步操作模式,等价于<async-supported>
      displayNameStringservlet的显示名,等价于<display-name>
      descriptionStringservlet的描述信息,等价于<description>

      @WebServlet 属于类级别的注解,标注在继承了 HttpServlet 的类之上。常用的写法是将 Servlet 的相对请求路径(即 value)直接写在注解内,
      @WebServlet(urlPatterns = “/MyServlet”)。
      @WebServlet(“/MyServlet”) 省略了 urlPatterns 属性名
      如果 @WebServlet 中需要设置多个属性,则属性之间必须使用逗号隔开.
      通过实现 Serlvet 接口或继承 GenericServlet 创建的 Servlet 类无法使用 @WebServlet 注解。
      使用 @WebServlet 注解配置的 Servlet 类,不要在 web.xml 文件中再次配置该 Servlet 相关属性。若同时使用 web.xml 与 @WebServlet 配置同一 Servlet 类,则 web.xml 中 的值与注解中 name 取值不能相同,否则容器会忽略注解中的配置。

      三、封装BaseServlet

      package com.mcode;
      
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.lang.reflect.Method;
      
      /**
       * ClassName: BaseServlet
       * Package: com.mcode
       * Description:
       *
       * @Author: robin
       * @Version: v1.0
       */
      public abstract class BaseServlet extends HttpServlet {
          @Override
          public void service(HttpServletRequest request, HttpServletResponse response) {
              try {
                
                  request.setCharacterEncoding("UTF-8");
                
                  response.setCharacterEncoding("UTF-8");
                
                  response.setContentType("text/html;charset=utf-8");
                
                  String methodName = request.getParameter("method");
                
                  if (methodName == null || methodName.trim().isEmpty()) {
                      throw new RuntimeException("您没有传递 method 参数! 无法确定您想调用的方法");
                  }
                
                  Class<? extends BaseServlet> classz = this.getClass();
                
                  Method method = classz.getMethod(methodName, HttpServletRequest.class,
                          HttpServletResponse.class);
                
                  method.setAccessible(true);//开启暴力反射
      
                  method.invoke(this, request, response);
                
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }
      

      四、测试

      UserServlet

      package com.mcode;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
      import java.io.IOException;
      
      /**
       * ClassName: UserServlet
       * Package: com.mcode
       * Description:
       *
       * @Author: robin
       * @Version: v1.0
       */
      @WebServlet("/user")
      public class UserServlet extends BaseServlet{
          public void getList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              String method = request.getParameter("method");
              HttpSession session = request.getSession();
              session.setAttribute("method",method);
              request.getRequestDispatcher("index.jsp").forward(request, response);
          }
      }
      

      index.jsp

      引入jsp-api依赖

          <dependency>
            <groupId>jakarta.servlet.jsp</groupId>
            <artifactId>jakarta.servlet.jsp-api</artifactId>
            <version>3.1.1</version>
          </dependency>
      
      <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
      <html>
      <body>
        <a href="/user?method=getList" rel="external nofollow" >user</a>
        <%=session.getAttribute("method") %>
      <%
         out.println(session.getAttribute("method"));
      %>
      </body>
      </html>

      到此这篇关于Servlet系列两种创建方式的文章就介绍到这了,更多相关Servlet创建 内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程! 

      您可能感兴趣的文章:
      • myeclipse创建servlet_动力节点Java学院整理
      • IDEA创建Servlet并配置web.xml的实现
      • 使用IDEA创建servlet JavaWeb 应用及使用Tomcat本地部署的实现
      • servlet创建web后端程序的示例代码
      • Servlet的两种创建方式(xml 注解)示例详解
      • IDEA创建Servlet程序的两种实现方法
      • IDEA2023创建MavenWeb项目并搭建Servlet工程的全过程
      相关栏目:

      用户点评