重庆网站推,邯郸做网站推广找谁,昆山城乡建设局网站,wordpress怎么放广告一、使用web.xml的方式配置#xff08;Servlet2.5之前使用#xff09;
在早期版本的Java EE中#xff0c;可以使用XML配置文件来定义Servlet。在web.xml文件中#xff0c;可以定义Servlet的名称、类名、初始化参数等。然后#xff0c;在Java代码中实现Servlet接口#x…一、使用web.xml的方式配置Servlet2.5之前使用
在早期版本的Java EE中可以使用XML配置文件来定义Servlet。在web.xml文件中可以定义Servlet的名称、类名、初始化参数等。然后在Java代码中实现Servlet接口并覆盖其中的doGet()或doPost()方法来处理请求。
web.xml
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd idWebApp_ID version4.0display-namejava-servlet-demo02/display-name!-- servlet配置 --servlet!-- 名称 --servlet-nameWebXmlServlet/servlet-name!-- servlet全称类名 --servlet-classcom.mcode.servlet.controller.WebXmlServlet/servlet-class!-- 启动的优先级数字越小越先起作用 --load-on-startup1/load-on-startup/servlet!-- 映射配置 --servlet-mapping!-- 对应名称 --servlet-nameWebXmlServlet/servlet-name!-- 资源匹配规则精确匹配 --url-pattern/webxml/url-pattern/servlet-mapping
/web-appWebXmlServlet
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 {Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置编码方式resp.setCharacterEncoding(UTF-8);//指定客户端解码方式resp.setHeader(content-type, text/html;charsetUTF-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 {Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置编码方式response.setCharacterEncoding(UTF-8);//指定客户端解码方式response.setHeader(content-type, text/html;charsetUTF-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。
属性名类名属性描述nameString指定servlet的name属性等价于servlet-name,若没有指定则默认是类的全限定名valueString[]等价于urlPatterns两者不能共存urlPatternsString[]指定一组servlet的url的匹配模式等价于url-patternloadOnStartupint指定servlet的加载顺序等价于load-on-startupinitParamsWebinitParams[]指定一组初始化参数等价于init-paramsasyncSupportedboolean申明servlet是否支持异步操作模式等价于async-supporteddisplayNameStringservlet的显示名等价于display-namedescriptionStringservlet的描述信息等价于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 {Overridepublic void service(HttpServletRequest request, HttpServletResponse response) {try {request.setCharacterEncoding(UTF-8);response.setCharacterEncoding(UTF-8);response.setContentType(text/html;charsetutf-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依赖 dependencygroupIdjakarta.servlet.jsp/groupIdartifactIdjakarta.servlet.jsp-api/artifactIdversion3.1.1/version/dependency% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8%
html
bodya href/user?methodgetListuser/a%session.getAttribute(method) %
%out.println(session.getAttribute(method));
%
/body
/html