一、使用web.xml的方式配置(Servlet2.5之前使用)
在早期版本的Java EE中,可以使用XML配置文件来定义Servlet。在web.xml文件中,可以定义Servlet的名称、类名、初始化参数等。然后,在Java代码中实现Servlet接口,并覆盖其中的doGet()或doPost()方法来处理请求。
web.xml
java-servlet-demo02WebXmlServletcom.mcode.servlet.controller.WebXmlServlet1WebXmlServlet/webxml
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属性,等价于 ,若没有指定,则默认是类的全限定名 |
value | String[] | 等价于urlPatterns,两者不能共存 |
urlPatterns | String[] | 指定一组servlet的url的匹配模式,等价于
|
loadOnStartup | int | 指定servlet的加载顺序,等价于
|
initParams | WebinitParams[] | 指定一组初始化参数,等价于
|
asyncSupported | boolean | 申明servlet是否支持异步操作模式,等价于
|
displayName | String | servlet的显示名,等价于
|
description | String | servlet的描述信息,等价于
|
@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依赖
jakarta.servlet.jspjakarta.servlet.jsp-api3.1.1
到此这篇关于Servlet系列两种创建方式的文章就介绍到这了,更多相关Servlet创建 内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!