一、快速入门
1.pom.xml里添加依赖
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
- 实现接口
public class ServletDemo01 implements Servlet
- 重写方法,编辑访问路径
@WebServlet("/demo")
public class ServletDemo01 implements Servlet{
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("hello servlet");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
- 正常我们不去实现servler接口,而是去继承httpservlet类
@WebServlet("/demo02")
public class ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post");
}
}
二、生命周期
1.加载和实例化,默认情况下,servlet第一次访问时,由容器创建一个servlet对象,非默认情况下可以通过
@WebServlet(urlPatterns="/demo", loadOnStartup = 1)
loadOnStartup 为负整数时,就是默认情况,0或者整数时,服务器创建的时候就创建servlet对象,数字越小优先级越高
- 初始化,servlet实例化后,会调用init()方法完成初始化,该方法只会调用一次
- 请求处理,每次请求servlet的时候,容器都会调用servlet的service()方法对请求进行处理
- 服务终止:当需要释放内存或关闭容器时,就会调用servlet的destroy()方法完成资源的释放,调用完此方法后,容器会释放这个实例,该实例随后会被java的垃圾收集器回收
三、获取参数
- request.getParameter()
- request.getParameterValues()
解决中文参数乱码:
//post方式
request.setCharacterEncoding("UTF-8");
//post和get
String name = request.getParameter("name");
name = new String(name.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
- 请求转发
request.getRequestDispatcher("/demo02").forward(request,response);
//数据共享
request.setAttribute();
request.getAttribute()
- 重定向
// 获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath +"/demo02");
- response获取字符输出流
response.setContentType("text/html;charset=utf-8");
final PrintWriter writer = response.getWriter();
writer.write("<h>哈哈哈</h>");
- response字节输出流
final FileInputStream fileInputStream = new FileInputStream("d://test.jpg");
final ServletOutputStream outputStream = response.getOutputStream();
// 使用了IOUtils工具类完成拷贝
IOUtils.copy(fileInputStream, outputStream);
fileInputStream.close();
四、web.xml
- 命名空间
在 web.xml 中,使用的 web-app_4_0.xsd 文件定义的规则,需要指定这个文件的位置。
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
</web-app>
- Servlet配置
这是我们常用的一个配置,主要使用的标签是<servlet></servlet>为Servlet 命名和<servlet-mapping></servlet-mapping>为 Servlet 定制 URL。
<project..>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>D20210220.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
</project>
在 <servlet> 标签中, <servlet-name> 中设置的是为 Servlet 注册的名字,要保证该名字在 web.xml 文件中是唯一的,一般直接使用类名即可,<servlet-class> 中设置的是需要配置的 Servlet 的全类名。
在 <servlet-mapping> 中, <servlet-name> 中的名字,需要和 <servlet> 中的名字一致,<url-pattern> 为这个 Servlet 映射一个对外访问路径。
servlet 和 url-pattern 之间的关系是 一对多的关系。
- Filter 配置
在学习了 Servlet 的配置之后,学习 Filter 的配置就很简单了。
Filter 的配置和 Servlet 的配置很相似,只是将 servlet 换成 filter 而已。
<filter>
<filter-name>Filter1</filter-name>
<filter-class>D2020128.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/TestServlet</url-pattern>
</filter-mapping>
Filter 的配置中和 Servlet 配置差别较大的地方在于 url-pattern,Servlet 的 url-pattern 中配置的路径是访问 Servlet 的路径,而 Filter 的 url-pattern 中配置的路径是访问已经存在的网络资源,如静态页面、jsp、servlet等。
filter 和 url-pattern 之间的关系是 多对多的关系。即,一个 filter 可以有多个 url-pattern(使用多个 URL 地址,都会访问同一个 FIlter),多个 filter 可以对应一个 url-pattern(多个 filter 会根据 web.xml 中配置的顺序组成 filter 链)。
因此,Filter 的 url-pattern 有一种配置是<url-pattern>/*</url-pattern>
,表示所有外部访问都需要先经过该过滤器。
Filter 应用场景:防盗链、编码过滤器
- Listener 配置
Listener 不需要处理外界访问,所以它的配置不需要定制 URL,因此只需要配置<listener>
<listener>
<listener-class>Listener的全类名<listener-class>
</listener>
注解配置
在 Servlet 3.0 版本以上,可以使用@WebServlet
注解代替 web.xml 进行配置,@WebServlet
的配置是一套独立的用法。
Servlet 注解配置
一般用@WebServlet( "/TestServlet1")
即可,其中 TestServlet1 的位置可以自己起一个名字,但是需要注意不能在项目中有重名。
下面展示一下@WebServlet
注解的复杂一些的用法,不做详解
@WebServlet(urlPatterns = "/TestServlet1",initParams = {
@WebInitParam(name = "name1",value="value1"),
@WebInitParam(name = "name2",value="value2")
}, name = "Hello")
Filter 注解配置
在 Filter 类文件的开头处写上 @WebFilter("/TestFilter")
网友评论