一、使用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");
}
}

效果图

url-pattern匹配规则

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

load-on-startup说明

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

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

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

  4. 如果值为正整数或者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.

效果图

@WebServlet注解

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

属性名 类名 属性描述
name String 指定servlet的name属性,等价于<servlet-name>,若没有指定,则默认是类的全限定名
value String[] 等价于urlPatterns,两者不能共存
urlPatterns String[] 指定一组servlet的url的匹配模式,等价于<url-pattern>
loadOnStartup int 指定servlet的加载顺序,等价于<load-on-startup>
initParams WebinitParams[] 指定一组初始化参数,等价于<init-params>
asyncSupported boolean 申明servlet是否支持异步操作模式,等价于<async-supported>
displayName String servlet的显示名,等价于<display-name>
description String servlet的描述信息,等价于<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">user</a>
<%=session.getAttribute("method") %>
<%
out.println(session.getAttribute("method"));
%>
</body>
</html>

Servlet系列:两种创建方式(xml,注解)的更多相关文章

  1. 【转载】 Java中String类型的两种创建方式

    本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...

  2. String变量的两种创建方式

    在java中,有两种创建String类型变量的方式: String str01="abc";//第一种方式 String str02=new String("abc&qu ...

  3. Android中Fragment的两种创建方式

    fragment是Activity中用户界面的一个行为或者是一部分.你可以在一个单独的Activity上把多个Fragment组合成为一个多区域的UI,并且可以在多个Activity中再使用.你可以认 ...

  4. cocos2dx 帧动画的两种创建方式

    看了好几天cocos2dx的帧动画,现在才有点眉目,为了高效期间我们一般会用到 精灵帧缓存(CCSpriteFrameCache) 和动画缓存(CCAnimationCache) .大体的操作步骤: ...

  5. java多线程总结一:线程的两种创建方式及优劣比较

    1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现 ...

  6. python 多进程的两种创建方式

    Python中使用线程有两种方式:函数或者用类来包装线程对象. 第一种---------函数 菜鸟教程的我没看懂,说说我自己懂的----看视频理解的 import time import thread ...

  7. java多线程总结:线程的两种创建方式及优劣比较

    1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现 ...

  8. java多线程总结一:线程的两种创建方式及比较

    1.线程的概念:线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行.当程序作为一个应 ...

  9. Thead基础及两种创建方式

    今天本人给大家讲解一下多线程,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 说说多线程本人自己对它理解的定义:因计算机的CPU支持能够在同一时间执行多于一 ...

  10. java中线程的两种创建方式

    第一种:继承java.lang.Thread类.然后重写run方法 例如我们模拟一个龟兔赛跑 1 package edu.aeon.thread; 2 3 /** 4 * 说明:模拟龟兔赛跑 5 * ...

随机推荐

  1. Java笔记——常用类

    一.API概述 JDK中提供的各种功能的Java类 二.Object类 概述 类层次结构的根类 所有类都直接或间接的继承自该类 Class Object是类object结构的根.每个Class都有ob ...

  2. Node02-包管理工具

    前言:代码共享 模块化的编程思想,支持将代码划分成一个个小的.独立的结构. 我们可以通过模块化的方式来封装自己的代码,将之封装成一个个工具: 我们可以让同事通过导入的方式来使用这些工具,甚至也可以将这 ...

  3. 自学day7 数组

    typora-copy-images-to: media 数组 一.概念 对象中可以通过键值对存储多个数据,且数据的类型是没有限制的,所以通常会存储一个商品的信息或一个人的信息: var obj = ...

  4. RPN FPN ROIPooling

    RPN(Region Proposal Network)介绍---> 特点从backbone 生成的Feture Map中 用一个 3x3 的Conv卷积核 遍历FeatureMap的每个点然后 ...

  5. MVC控制器传DataTable

    MVC中,控制器return Json(DataTable)会出现错误: 序列化类型为"System.Reflection.RuntimeModule"的对象时检测到循环引用. 解 ...

  6. 从ClickHouse通往MySQL的几条道路

    一.应用背景简介 ClickHouse 是 Yandex(俄罗斯最大的搜索引擎)开源的一个用于实时数据分析的基于列存储的数据库,其处理数据的速度比传统方法快 100-1000 倍.ClickHouse ...

  7. [GDOI22pj2D] 机器人

    第四题 机器人 提交文件: robot.cpp 输入文件: robot.in 输出文件: robot.out 时间空间限制: 3 秒, 512 MB 刚上初一的小纯特别喜欢机器人,这周末,她报名了学校 ...

  8. 如何为项目配置opencv

    如何为项目配置opencv 13/100 发布文章 public669 未选择任何文件 new 配置: 包含目录: D:\OpenCV\opencv\build\include D:\OpenCV\o ...

  9. .NET开发中合理使用对象映射库,简化和提高工作效率

    前言 在日常开发中,我们常常需要将一个对象映射到另一个对象,这个过程中可能需要编写大量的重复性代码,如果每次都手动编写,不仅会影响开发效率,而且当项目越来越复杂,庞大的时候还容易出现错误.为了解决这个 ...

  10. 看看 Asp.net core Webapi 项目如何优雅地使用分布式缓存

    前言 缓存是提升程序性能必不可少的方法,Asp.net core 支持多级缓存配置,主要有客户端缓存.服务器端缓存,内存缓存和分布式缓存等.其中客户端缓和服务器端缓存在使用上都有比较大的限制,而内存缓 ...