Servlet系列:两种创建方式(xml,注解)
一、使用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说明
元素标记容器是否应该在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.
效果图

@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,注解)的更多相关文章
- 【转载】 Java中String类型的两种创建方式
本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...
- String变量的两种创建方式
在java中,有两种创建String类型变量的方式: String str01="abc";//第一种方式 String str02=new String("abc&qu ...
- Android中Fragment的两种创建方式
fragment是Activity中用户界面的一个行为或者是一部分.你可以在一个单独的Activity上把多个Fragment组合成为一个多区域的UI,并且可以在多个Activity中再使用.你可以认 ...
- cocos2dx 帧动画的两种创建方式
看了好几天cocos2dx的帧动画,现在才有点眉目,为了高效期间我们一般会用到 精灵帧缓存(CCSpriteFrameCache) 和动画缓存(CCAnimationCache) .大体的操作步骤: ...
- java多线程总结一:线程的两种创建方式及优劣比较
1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现 ...
- python 多进程的两种创建方式
Python中使用线程有两种方式:函数或者用类来包装线程对象. 第一种---------函数 菜鸟教程的我没看懂,说说我自己懂的----看视频理解的 import time import thread ...
- java多线程总结:线程的两种创建方式及优劣比较
1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现 ...
- java多线程总结一:线程的两种创建方式及比较
1.线程的概念:线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行.当程序作为一个应 ...
- Thead基础及两种创建方式
今天本人给大家讲解一下多线程,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 说说多线程本人自己对它理解的定义:因计算机的CPU支持能够在同一时间执行多于一 ...
- java中线程的两种创建方式
第一种:继承java.lang.Thread类.然后重写run方法 例如我们模拟一个龟兔赛跑 1 package edu.aeon.thread; 2 3 /** 4 * 说明:模拟龟兔赛跑 5 * ...
随机推荐
- (Good topic)压缩字符串 (3.16 leetcode每日打卡)
字符串压缩.利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能.比如,字符串aabcccccaaa会变为a2b1c5a3.若"压缩"后的字符串没有变短,则返回原先的字符 ...
- Log4j入门使用
前言 本篇文章主要在于,初步了解log4j,以及对它的简单使用 欢迎点赞 收藏 留言评论 私信必回哟 博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 @ 目录 一,log4j简介 二,配 ...
- js根据某属性对json数组分类
原数据: var arr = [ {name: '张三', age: 23, work: '计算机'}, {name: '王五', age: 29, work: '计算机'}, {name: '张兴' ...
- Centos8离线安装golang
一.下载golang 1.下载安装包 2.下载后解压. tar -zxvf go1.17.linux-amd64.tar.gz 二.配置环境变量 vim /etc/profile 1.在环境变量最后添 ...
- serdes 常见并口位宽
serdes主要完成串并转换功能.常见的并口位宽如下: GE/10/25GE/32GE 10/20/40/16/32位 50GE ...
- [ABC262D] I Hate Non-integer Number
Problem Statement You are given a sequence of positive integers $A=(a_1,\ldots,a_N)$ of length $N$. ...
- 从零开始封装 vue 组件
对于学习 Vue 的同学来说,封装 vue 组件是实现代码复用的重要一环.在 Vue 官网中非常详细地介绍了 vue 组件的相关知识,我这里简单摘取使用最频繁的几个知识点,带大家快速入门 vue 组件 ...
- jclasslib的安装
双击安装包打开后点击下一步,然后选择安装的路径. 默认路径,如果c盘有空间不建议更改路径,然后再次点击下一步 依然选择下一步 最后点击完成即可完成安装.现在可以使用啦 注:如果需要安装包,请点击下面链 ...
- HTML之元素相对页面(视口)左上角的绝对坐标
目录 一. 绝对位置 二. 相对位置 一. 绝对位置 网页元素的绝对位置,指该元素的左上角相对于整张网页左上角的坐标.无论网页滚动条如何滚动,它都是不会变化的. // 获取元素的绝对位置坐标(相对于页 ...
- 如何屏蔽各大AI公司爬虫User Agent
罗列各大AI公司Scraper爬虫Crawler使用的User Agent,教您如何在robots.txt里面屏蔽这些爬虫的访问,禁止它们下载您的网站内容以训练 AI 模型,保护数据,降低带宽,防止宕 ...