servlet基础
# 导入Servlet依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.0</version>
<scope>provided</scope><!--必须,依赖范围-->
</dependency>
1
2
3
4
5
6
2
3
4
5
6
# 基本使用
// 2.使用@WebServlet注解配置该servlet的访问路径
@WebServlet("/demo")
// 1.创建一个类实现 Servlet 接口,并重写改接口所有方法,并在service中输入一句话
public class ServletDemo implements Servlet{
@Override
public void init(ServletConfig servletConfig) throws ServletException {
// 初始化方法,在Servlet被创建时执行,只执行一次
}
// 获取ServletConfig对象
@Override
public ServletConfig getServletConfig() {
return null;
}
// 提供服务方法,每次Servlet被访问,都会调用该方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
// 3.输出
System.out.println("servlet 访问了");
}
// 获取ServletConfig信息
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
// 销毁方法,当Servlet被销毁时,调用该方法,在内存释放或服务器关闭时销毁Servlet
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
访问:http://localhost:8080/demo
# Servlet生命周期
- 加载和实例化:默认情况下,当
Servlet
第一次被访问时,由容器创建Servlet
对象,或者在配置注解时设置@WebServlet("/demo", loadOnStartup=1)
,默认为负整数(第一次访问时创建),0或正整数(服务器启动时创建,数字越小优先级越高,用给哪些启动耗时的) - 初始化:在
Servlet
实例化后,将调用Servlet
的init()
方法初始化这个对象,完成一些加载配置文件、创建连接等初始化的工作,该方法只调用一次。 - 请求处理:每次请求
Serlevt
时都会调用Servlet
的service()
方法对请求进行处理。 - 服务中止:当需要释放内存或者容器关闭时,容器就会调用
Servlet
的destroy()
方法完成资源的释放。
# HttpServlet
正常使用的时候,继承HttpServlet
# Servlet urlPattern配置
Serlevt要想被访问,必须配置其访问路径urlPattern
- 一个Servlet可以配置多个
urlPattern
:@WebServlet(urlPattern={"/demo1", "/demo2"})
urlPattern
配置规则- 精确匹配
@WebServlet(urlPattern="/user/select")
: localhost/user/select
- 目录匹配
@WebServlet(urlPattern="/user/*")
: localhost/user/select,localhost/user/change
- 扩展名匹配
@WebServlet(urlPattern="*.do")
: localhost/select.do,localhost/change.do
- 任意匹配
@WebServlet(urlPattern="/")
: localhost/select,localhost/change/aa@WebServlet(urlPattern="/*")
: localhost/select,localhost/change/bb
- 精确匹配
# 注解
# @WebServlet
3.0新增注解,用于定义Servlet
组件
属性列表
属性名 | 类型 | 描述 |
---|---|---|
name | String | 等同于<servlet-name> ,如果没有显式指定,则为类的全限定名 |
value | String[] | 等价于urlPattern ,两个属性不能同时使用 |
urlPatterns | String[] | 指定一组Servlet的匹配模式,等同于<url-pattern> |
loadOnStartup | int | 指定Servlet的加载顺序,等同于<load-on-startup> |
initParams | WebInitParamp[] | 指定一组Servlet初始化参数,等同于<init-param> |
asyncSupported | boolean | 声明Servlet是否支持异步操作模式,等同于<async-supported> |
description | String | 该Servlet描述信息,等同于<description> |
displayName | String | 该Servlet的显示名,通常配合工具使用,等同于<display-name> |
3.0以下版本是在web.xml
中配置的
<web-app>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
</web-app>
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# @WebFilter
声明过滤器
@WebFilter(filterName="char",urlPatterns="/*")
public class CharFilter implements Filter{}
1
2
2
等同于web.xml
<filter>
<filter-name>char</filter-name>
<filter-class>CharFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>char</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# @WebListener
声明监听器
@WebListener("这是一个描述")
public class MyContentListener implements ServletContextLinstener{}
1
2
2
# @WebInitParam
等价于web.xml
文件中的<servlet>
和<filter>
中的子标签<init-param>
,改注释不单独使用,需要配合@WebServlet
或@WebFilter
使用。
@WebServlet(
urlPatterns={"/simple"},
name="SimpleServlet",
initParams={@WebInitParam(name="username", value="张三", description="用户名")}
)
public class SimpleServlet extends HttpServlet{}
1
2
3
4
5
6
7
2
3
4
5
6
7
等同于web.xml
<web-app>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.servlet.MyServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>张三</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
</web-app>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# @MultipartConfig
用于处理文件上传,需要标注在@WebServlet
注解上。常用属性:
属性名 | 类型 | 是否可选 | 描述 |
---|---|---|---|
fileSizeThreshold | Int | 是 | 当数据量大于该值时,内容将被写入文件 |
location | String | 是 | 存放生成的文件地址 |
maxFileSize | Long | 是 | 允许上传的文件最大值。默认为-1,表示没有限制 |
maxRequestSize | Long | 是 | 针对该multipart/form-data请求的最大数量,默认值为-1,表示没有限制 |
@WebServlet("/UploadServlet")
@MultipartConfig(location = "F:\\Workspace\\Java\\web\\public")
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter pw = resp.getWriter();
// 获取服务地址
String path = this.getServletContext().getRealPath("/");
// 获取用户选择的上传文件
Part p = req.getPart("file1");
// 仅处理上传的图像文件
if(p.getContentType().contains("image")){
// 获取上传文件名
String fname1 = p.getSubmittedFileName();
System.out.println("提交的文件名:" + fname1);
// 对文件名进行截取
int path_idx = fname1.lastIndexOf("\\") + 1;
String fname2 = fname1.substring(path_idx);
p.write(path + "/upload/" + fname2);
pw.write("文件上传成功");
}else{
pw.write("请选择图片文件!!!");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
上次更新: 2023/09/22, 16:54:32