开始卷java了,先写一下在IDEA部署Servlet的两种方法吧,一种导包,一种用maven,然后记录自己学习的过程吧。

IDEA部署Servlet

servlet-api.jar包部署

新建java项目

添加框架支持:

image-20211223153750446

添加web框架

image-20211223154035652

image-20211223154201963

项目目录架构

目录 描述
.idea IDEA工程配置文件
src 存放Java代码
web 存放项目资源
WEB-INF 存放项目配置文件,Jar包、class文件
WebProject.iml 模块配置文件
External Libraries 外部Jar文件

手工导入servlet-api.jar文件

WEB-INF文件夹下新建lib文件夹将tomcat中的servlet-api.jar复制进去

然后对文件进行项目集成,右键lib

image-20211223160110646

编写Servlet

创建MyServlet,实现Servlet接口,重写5个方法

image-20211223160459145

配置web.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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_3_1.xsd"
version="3.1">

<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.dropann.servlet.MyServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>

</web-app>

集成tomcat

image-20211223105023496

image-20211223162321031

关联第三方jar包

基本同手工导入servlet-api.jar文件

选择Project Library完成

Global Library 表示所有工程都可以使用

Project Library表示当前工程中所有的模块都可使用

Module Library表示当前模块可以使用

导出war包

war包可以直接放入Tomcat的webapps目录中,启动Tomcat后自动解压

image-20211223163451480

image-20211223163808890

构建war包

image-20211223164317420

image-20211223164321773

out\artifacts目录中,查看生产的war包

解决IDEA打印中文乱码

1
-Dfile.encoding=UTF-8

image-20211224230734905

maven部署

image-20220118110615975

把maven项目的结构补充完整

image-20220118110907949

如果这边没有将目标设为源文件夹,在这里设置。

image-20220118114515343

如果pom.xml不全的话

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>

后面都一样了。

Servlet 核心接口和类

Servlet接口

所有Servlet都会直接间接与该接口发生联系,该接口包括以下5种方法:

1
2
3
4
5
6
7
8
9
init(ServletConfig servletConfig)

ServletConfig getServletConfig()

service(ServletRequest servletRequest, ServletResponse servletResponse)

getServletInfo()

destroy()

init()Servlet实例化后,Servlet容器会调用init()方法来初始化该对象,在处理客户请求前完成初始化操作,如建立数据库连接等。

GenericServlet抽象类

它提供生命周期initdestroy的简单实现,要编写Servlet只需要重写抽象service

HttpServlet类

该类继承GenericServlet的基础上进一步扩展。HttpServlet的子类必须重写一个方法,该方法通常是以下方法之一:

1
2
3
4
doGet
doPost
doPut
doDelete

Web.xml配置

精确匹配 /具体名称

后缀匹配 *.xxx

通配符匹配1/* 包含服务器所有的资源

通配符匹配2/ 包含服务器所有的资源,不包括jsp

@WebServlet注解常用属性

name:Serlvet名字(可选)

value:配置url路径,可配置多个

urlPatterns:配置url路径,和value作用一样,不能同时使用

loadOnStartup:配置Servlet的创建的时机,如果是0正数 启动程序时创建,如果是负数,则访问时创建。数字越小优先级越高。

1
2
3
4
5
6
@WebServlet(value = {"/bs","/bss"}, loadOnStartup = 0)
public class BasicServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这是get方法");
}
1
2
3
4
5
6
7
8
9
10
11
12
@WebServlet({"/test", "/get"})
public class test extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("POST Method");
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("GET Method");
}
}

image-20220118114701997

Servlet应用

在Servlet中用来处理客户端请求需要用doGetdoPost方法的request对象

解决doPost出现乱码

1
req.setCharacterEncoding("utf-8");

解决响应出现乱码

同时设置服务端的编码格式和客户端响应的文件类型以及响应时的编码格式

1
resp.setContentType("text/html;charset=UTF-8");

getWriter()前设置

Servlet生命周期

1.实例化:由容器调用Servlet构造器创建具体的Servlet对象,只执行一次。

2.初始化:调用init()方法会被调用,只执行一次。

3.提供服务:调用服务器的Servlet()方法处理请求,会执行多次。

4.销毁:当容器停止或重新启动都会引起销毁Servlet对象并调用destroy方法,释放所有在init()中申请的资源,只执行一次。

filter过滤器

过滤器时处于客户端与服务器目标资源之间的一道过滤技术。

过滤器作用:

客户端发送请求时,会先经过Filter在到达目标Servlet中;响应时,会根据执行流程再次反向执行Filter。

image-20211226232239366

编写过滤器

ServletAPI中提供了一个接口,开发人员编写一个Java类实现接口,这个类称之为过滤器。

实现过程

  1. 编写Java类实现Filter接口
  2. 在doFilter方法中编写拦截逻辑
  3. 设置拦截路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("--My--Filter");
//让请求继续
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}

过滤器配置

1
@WebFilter(value = "/过滤目标资源")