Servlet系列两种创建方式

 更新时间:2024年02月21日 11:15:20   作者:xdpcxq1029  
本文主要介绍了Servlet系列两种创建方式,包含Servlet2.5之前使用和Servlet3.0后,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、使用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创建 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Springboot整合RabbitMq测试TTL的方法详解

    Springboot整合RabbitMq测试TTL的方法详解

    这篇文章主要介绍了Springboot整合RabbitMq测试TTL的设置,设置TTL一般由两种设置方法,设置整个队列的过期时间另一种设置单个消息的过期时间,通过示例图文相结合给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • rabbitmq中routingkey的作用说明

    rabbitmq中routingkey的作用说明

    这篇文章主要介绍了rabbitmq中routingkey的作用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • springboot中rabbitmq实现消息可靠性机制详解

    springboot中rabbitmq实现消息可靠性机制详解

    这篇文章主要介绍了springboot中rabbitmq实现消息可靠性机制详解,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • Spring Boot web项目的TDD流程

    Spring Boot web项目的TDD流程

    TDD(Test-driven development) 测试驱动开发,简单点说就是编写测试,再编写代码。这是首要一条,不可动摇的一条,先写代码后写测试的都是假TDD。
    2021-05-05
  • java导出数据库的全部表到excel

    java导出数据库的全部表到excel

    这篇文章主要为大家详细介绍了java导出数据库的全部表到excel的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • Java如何利用return结束方法调用

    Java如何利用return结束方法调用

    这篇文章主要介绍了Java如何利用return结束方法调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java轻松掌握面向对象的三大特性封装与继承和多态

    Java轻松掌握面向对象的三大特性封装与继承和多态

    本文主要讲述的是面向对象的三大特性:封装,继承,多态,内容含括从封装到继承再到多态的所有重点内容以及使用细节和注意事项,内容有点长,请大家耐心看完
    2022-05-05
  • Mybatis中and和循环or混用操作(or转换成in)

    Mybatis中and和循环or混用操作(or转换成in)

    这篇文章主要介绍了Mybatis中and和循环or混用操作(or转换成in),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Spring IOC的相关注解运用详解

    Spring IOC的相关注解运用详解

    这篇文章主要介绍了Spring IOC的相关注解运用详解,纯注解实现IOC需要一个Java类代替xml文件,这个Java类上方需要添加@Configuration,表示该类是一个配置类,作用是代替配置文件,需要的朋友可以参考下
    2023-08-08
  • Java实现一个简易版的多级菜单功能

    Java实现一个简易版的多级菜单功能

    这篇文章主要给大家介绍了关于Java如何实现一个简易版的多级菜单功能的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01

最新评论