Servlet就是一个接口,定义了java类能被浏览器访问(tomcat识别)的规则,使用时只需实现接口即可(一般继承实现类HttpServlet)
步骤:
创建一个webapp项目

需导入有相应jar包
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author : liu ming yong
* @date : 2022/8/30 下午 4:44
* @description : Servlet类
*/
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.print("servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
<?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"
version="4.0"
metadata-complete="true">
<!--注册servlet-->
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.lmy.MyServlet</servlet-class>
</servlet>
<!--servlet的请求路径-->
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
</web-app>




(1)浏览器依据ip,port建立与servlet容器(容器同时也是一个简单的web服务器)之间的连接。
(2)浏览器将请求数据打包(按照http协议,该数据包也称为请求数据包)。
(3)浏览器发送请求数据包给容器。
(4)容器收到请求数据包之后,解析该数据包
(5)将4中解析之后得到的数据封装到request对象上,同时,容器还要创建response对象。
(6)容器要依据请求资源路径(“/servlet01/myServlet”)找到servlet的配置,然后创建servlet对象。
(7)容器调用servlet对象的service方法。容器会将事先创建好的request,response作为参数传递给service方法。
( 8-10)在service方法里面,可以通过request对象获得请求参数,并进行相应的处理,处理结果会放到response对象里面。
(11-13)容器从response对象中取出处理结果,然后打包(按照http协议,该数据包称之为响应数据包)。再将响应数据包发送给浏览器。
(14-15)浏览器收到响应数据包之后,解析处理结果,然后生成相应的页面。
其实Java Web开发人员需要手动编写代码的部分主要在8-10,因为其他部分工作已被web服务器和开发工具完成。
一个servlet可以指定一个映射路径
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
一个servlet可以指定多个映射路径
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myServlet1</url-pattern>
</servlet-mapping>
一个servlet可以指定通用映射路径
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myServlet/*
默认的映射路径
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*
指定后缀或前缀
<!--自定义后缀实现映射时需注意,*前面不能加其它映射路径-->
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用
共享数据(开发中用Session去实现)
在不同的servlet中可共享获取到彼此保存的数据

保存共享数据:
package com.lmy;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author : liu ming yong
* @date : 2022/9/3 下午 9:02
* @description : 保存servletContext共享数据
*/
public class SetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取Servlet上下文
ServletContext context = this.getServletContext();
// 将数据保存到ServletContext中
context.setAttribute("username","刘明勇");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
获取共享数据:
package com.lmy;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author : liu ming yong
* @date : 2022/9/3 下午 10:43
* @description : 获取servletContext共享数据
*/
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter writer = resp.getWriter();
writer.write("姓名:"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
配置映射文件:
<?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"
version="4.0"
metadata-complete="true">
<servlet>
<servlet-name>setServlet</servlet-name>
<servlet-class>com.lmy.SetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>setServlet</servlet-name>
<url-pattern>/setServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getServlet</servlet-name>
<servlet-class>com.lmy.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getServlet</servlet-name>
<url-pattern>/getServlet</url-pattern>
</servlet-mapping>
</web-app>
测试结果:

获取初始化参数(开发中一般不用)
<context-param>
<param-name>urlparam-name>
<param-value>jdbc:mysql://localhost:3306/dbparam-value>
context-param>
<servlet>
<servlet-name>GetServletParamservlet-name>
<servlet-class>com.lmy.GetServletParamservlet-class>
servlet>
<servlet-mapping>
<servlet-name>GetServletParamservlet-name>
<url-pattern>/GetServletParamurl-pattern>
servlet-mapping>
/**
* @author : liu ming yong
* @date : 2022/9/4 下午 10:07
* @description : 获取初始化参数
*/
public class GetServletParam extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
}
测试结果:

请求转发(开发中一般用request去实现)
/**
* @author : liu ming yong
* @date : 2022/9/4 下午 10:25
* @description : 请求转发
*/
public class ServletDispatcher extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
context.getRequestDispatcher("/getServlet").forward(req,resp);
}
}
<servlet>
<servlet-name>servletDispatcherservlet-name>
<servlet-class>com.lmy.ServletDispatcherservlet-class>
servlet>
<servlet-mapping>
<servlet-name>servletDispatcherservlet-name>
<url-pattern>/servletDispatcherurl-pattern>
servlet-mapping>
测试结果:

读取资源文件(开发中一般用类加载或反射去实现)
maven由于约定大于配置,可能遇到配置文件无法生效的问题,解决办法为:
<build>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>truefiltering>
resource>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>truefiltering>
resource>
resources>
build>
Properties:
发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath;

获取配置文件:需要一个文件流;
username=root
password=123456
package com.lmy;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* @author : liu ming yong
* @date : 2022/9/4 下午 11:01
* @description : 获取配置资源
*/
public class ServletResources extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
InputStream stream = context.getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties = new Properties();
properties.load(stream);
String username = (String)properties.get("username");
String password = (String)properties.get("password");
resp.getWriter().print(username+":"+password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
测试结果:
