一、使用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. (Good topic)压缩字符串 (3.16 leetcode每日打卡)

    字符串压缩.利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能.比如,字符串aabcccccaaa会变为a2b1c5a3.若"压缩"后的字符串没有变短,则返回原先的字符 ...

  2. Log4j入门使用

    前言 本篇文章主要在于,初步了解log4j,以及对它的简单使用 欢迎点赞 收藏 留言评论 私信必回哟 博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 @ 目录 一,log4j简介 二,配 ...

  3. js根据某属性对json数组分类

    原数据: var arr = [ {name: '张三', age: 23, work: '计算机'}, {name: '王五', age: 29, work: '计算机'}, {name: '张兴' ...

  4. Centos8离线安装golang

    一.下载golang 1.下载安装包 2.下载后解压. tar -zxvf go1.17.linux-amd64.tar.gz 二.配置环境变量 vim /etc/profile 1.在环境变量最后添 ...

  5. serdes 常见并口位宽

    serdes主要完成串并转换功能.常见的并口位宽如下: GE/10/25GE/32GE        10/20/40/16/32位 50GE                              ...

  6. [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$. ...

  7. 从零开始封装 vue 组件

    对于学习 Vue 的同学来说,封装 vue 组件是实现代码复用的重要一环.在 Vue 官网中非常详细地介绍了 vue 组件的相关知识,我这里简单摘取使用最频繁的几个知识点,带大家快速入门 vue 组件 ...

  8. jclasslib的安装

    双击安装包打开后点击下一步,然后选择安装的路径. 默认路径,如果c盘有空间不建议更改路径,然后再次点击下一步 依然选择下一步 最后点击完成即可完成安装.现在可以使用啦 注:如果需要安装包,请点击下面链 ...

  9. HTML之元素相对页面(视口)左上角的绝对坐标

    目录 一. 绝对位置 二. 相对位置 一. 绝对位置 网页元素的绝对位置,指该元素的左上角相对于整张网页左上角的坐标.无论网页滚动条如何滚动,它都是不会变化的. // 获取元素的绝对位置坐标(相对于页 ...

  10. 如何屏蔽各大AI公司爬虫User Agent

    罗列各大AI公司Scraper爬虫Crawler使用的User Agent,教您如何在robots.txt里面屏蔽这些爬虫的访问,禁止它们下载您的网站内容以训练 AI 模型,保护数据,降低带宽,防止宕 ...