一、Servlet

一、前置知识

HTTP请求、响应报文格式:

请求行、请求头、空行、请求体

状态行、响应头、空行、响应体

java poi TableWidthType 设置换行 javaweb换行servlet_mysql

二、Servlet介绍

  1. 接口类Servlet
  2. 抽象类GenericServlet(继承接口类Servlet)
  3. 实现类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
  1. 定义一个普通类实现接口类javax.servlet.Servlet,并重写五个抽象方法
  2. 使用@WebServlet注解,配置访问路径@WebServlet(“/demo1”)
  3. 访问http://localhost:8080/demo1
二、HttpServlet
  1. 定义一个普通类继承实现类javax.servlet.http.HttpServlet,按需重写doGet和doPost方法,还有其他的
  2. 使用@WebServlet注解,配置访问路径@WebServlet(“/demo2”)
  3. doGet()和doPost()逻辑差不多,可以将doPost()处理个别Post独有逻辑然后转去doGet()
  4. 访问http://localhost:8080/demo2

二、XML

一、Servlet
  1. 定义一个普通类实现接口类javax.servlet.Servlet,重写所有方法
  2. 在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
  1. 定义一个普通类继承实现类javax.servlet.http.HttpServlet,重写doGet和doPost方法
  2. 在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生命周期

  • 自上而下调用
  1. 加载和实例化Serlvet对象,只调用一次
  2. init初始化:初始化,加载配置文件、连接。默认是第一次访问该url时才调用且只调用一次;loadOnStartup为0或者正整数时,服务器创建时就调用且只有一次:@WebServlet(urlpatterns = “/demo1”, loadOnStartup = 1)
  3. getServletConfig:获取ServletConfig对象()
  4. service:处理请求,可调用多次
  5. getServletInfo:获取Servlet信息(作者、版本和版权等,不常用)
  6. destroy:释放资源,只调用一次。内存释放/服务器关闭时调用且只有一次

五、配置urlpatterns

1. 多个目录匹配

  1. @WebServlet(urlPatterns = {“/demo1”, “/demo2”}),XML中则是直接写出多个<servlet-mapping></servlet-mapping>

2. 精确匹配

  1. @WebServlet(“/user/list”),优先级更高

3. 目录匹配

  1. @WebServlet(“/user/*”)

4. 扩展名匹配

  1. @WebServlet(“*.html”),前面不能加’/’

5. 任意匹配(不建议使用)

  1. @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的参数值
    }