一、使用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>