一、Servlet
一、前置知识
HTTP请求、响应报文格式:
请求行、请求头、空行、请求体
状态行、响应头、空行、响应体
二、Servlet介绍
- 接口类Servlet
- 抽象类GenericServlet(继承接口类Servlet)
- 实现类HttpServlet(继承抽象类GenericServlet),专门用于创建HTTP协议的Servlet
三、实现方式
- 新建Maven项目,在pom.xml中加上
<packaging>war</packaging>
,打开项目结构,找到Facets,选中项目后,在其中的Web资源目录点击加号生成webapp目录,再其中的部署描述器点击加号生成WEB-INF和在其里面的web.xml,移动WEB-INF至webapp即可。
目录结构
src
main|
|java
|webapp|
|WEB-INF|
|web.xml
pom.xml
<!-- 1.Servlet、Filter、Listener、JSP、JavaBean、EL表达式-->
<!-- https://mvnrepository.com/artifact/jakarta.servlet/jakarta.servlet-api -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/jakarta.servlet.jsp/jakarta.servlet.jsp-api -->
<dependency>
<groupId>jakarta.servlet.jsp</groupId>
<artifactId>jakarta.servlet.jsp-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- 2.jstl -->
<!-- https://mvnrepository.com/artifact/jakarta.servlet.jsp.jstl/jakarta.servlet.jsp.jstl-api -->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>3.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.web/jakarta.servlet.jsp.jstl -->
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>
<!-- 3.mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
一、 注解
一、Servlet
- 定义一个普通类实现接口类javax.servlet.Servlet,并重写五个抽象方法
- 使用@WebServlet注解,配置访问路径@WebServlet(“/demo1”)
- 访问http://localhost:8080/demo1
二、HttpServlet
- 定义一个普通类继承实现类javax.servlet.http.HttpServlet,按需重写doGet和doPost方法,还有其他的
- 使用@WebServlet注解,配置访问路径@WebServlet(“/demo2”)
- doGet()和doPost()逻辑差不多,可以将doPost()处理个别Post独有逻辑然后转去doGet()
- 访问http://localhost:8080/demo2
二、XML
一、Servlet
- 定义一个普通类实现接口类javax.servlet.Servlet,重写所有方法
- 在web.xml中填写
<servlet></servlet>
和<servlet-mapping></servlet-mapping>
标签
<servlet>
<servlet-name>demo4</servlet-name> <!-- 别名 -->
<servlet-class>com.miao.Web.Servlet.ServletDemo4</servlet-class> <!-- 全类名 -->
</servlet>
<servlet-mapping>
<servlet-name>demo4</servlet-name> <!-- 先前设置的别名 -->
<url-pattern>/demo4</url-pattern> <!-- 路径 -->
</servlet-mapping>
二、HttpServlet
- 定义一个普通类继承实现类javax.servlet.http.HttpServlet,重写doGet和doPost方法
- 在web.xml中填写
<servlet></servlet>
和<servlet-mapping></servlet-mapping>
标签
<servlet>
<servlet-name>demo4</servlet-name> <!-- 别名 -->
<servlet-class>com.miao.Web.Servlet.ServletDemo4</servlet-class> <!-- 全类名 -->
</servlet>
<servlet-mapping>
<servlet-name>demo4</servlet-name> <!-- 先前设置的别名 -->
<url-pattern>/demo4</url-pattern> <!-- 路径 -->
</servlet-mapping>
四、Servlet生命周期
- 自上而下调用
- 加载和实例化Serlvet对象,只调用一次
- init初始化:初始化,加载配置文件、连接。默认是第一次访问该url时才调用且只调用一次;loadOnStartup为0或者正整数时,服务器创建时就调用且只有一次:@WebServlet(urlpatterns = “/demo1”, loadOnStartup = 1)
- getServletConfig:获取ServletConfig对象()
- service:处理请求,可调用多次
- getServletInfo:获取Servlet信息(作者、版本和版权等,不常用)
- destroy:释放资源,只调用一次。内存释放/服务器关闭时调用且只有一次
五、配置urlpatterns
1. 多个目录匹配
- @WebServlet(urlPatterns = {“/demo1”, “/demo2”}),XML中则是直接写出多个
<servlet-mapping></servlet-mapping>
2. 精确匹配
- @WebServlet(“/user/list”),优先级更高
3. 目录匹配
- @WebServlet(“/user/*”)
4. 扩展名匹配
- @WebServlet(“*.html”),前面不能加’/’
5. 任意匹配(不建议使用)
- @WebServlet(“/”);@WebServlet(“/*”),使用前者则会覆盖tomcat自带的DefaultServlet(用于静态资源访问!将访问不到html文件!)
六、ServletConfig和ServletContext
<servlet>
<servlet-name>xxx</servlet-name> <!-- 别名 -->
<servlet-class>xxx</servlet-class> <!-- 全类名 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
ServletConfig config = this.getSerlvetConfig();
String value = config.getInitParameter("encoding") // UTF-8。获取参数名为encoding的参数值
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
SerlvetContext context = this.getServletContext();
Enumeration<String> values = context.getInitParameterNames(); // 获取所有参数名
while (values.hasMoreElements) {
String name = values.nextElement(); // 只有一个encoding
String value = context.getInitParameter(name); // UTF-8。获取参数名为encoding的参数值
}