Servlet笔记
什么是Servlet?
Servlet 是 Java web 开发的基石,是与平台无关的服务器组件,它是运行在 Servlet 容器/web 应用服务器(Tomcat是其中一种具体的实现形式),负责与客户端进行通信。
Servlet 的功能
- 创建并返回基于客户请求的动态HTML页面(客服发送请求到 Servlet , Servlet 按照请求结果给出特定的 HTML 界面,比如正确的界面或者有错误的界面,同时可以更新界面上的数据等)。
- 与数据库进行通信。
如何使用 Servlet ?
Servlet 本身是 javax 包提供的一组接口,自定义一个类,让这个类实现 Servlet 接口,这个类就具备了接收客户端请求及作出响应的功能。
Step 1:
编写一个类,实现 javax.servlet.Servlet 接口(如果没有这个类,需要把 Tomcat library 引入,有 jsp-api。jar 和 servlet-api.jar 两个 jar 包),然后复写五个方法。主要业务代码是写在 servlet() 方法中。
package com.xn.servlet;
import javax.servlet.*;
import java.io.IOException;
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@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() {
}
}
Step 2:
网页中输入主机号(默认是localhost)端口号加资源地址按理说是可以访问到 Servlet 类的,但是由于浏览器权限等限制,这个是不允许的,浏览器只能访问到 web 包下的根目录的那些 .jsp 文件,想访问到 src 包下的 Servlet 实现类,需要在通过映射的方式间接访问,同时映射需要开发者手动配置,有两种配置方式:
- 基于web/WEB-INF/web.xml 文件中做出映射 。
<?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">
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.xn.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
</web-app>
其中映射是靠 servlet-name 实现,servlet-class 是需要映射的 Servlet 实现类的相对路径,url-pattern 是在访问时,跟在端口号后面的资源访问路径。
- 基于注解的方式(推荐)
直接在 Servlet 类上加上@WebServlet
注解,同时将 url 补充,最终效果与方法1完全一样。
~~~
@WebServlet("/myservlet")
public class MyServlet implements Servlet {
}
~~~
有了以上的映射,那在启动 tomcat 以后,在浏览器里键入
http://localhost:端口号/myservlet
,
就可以访问到Servlet 实现类了(此时浏览器界面是空白的但是不会报错),如果在 service 方法中有其他操作,此时就会执行。
之所以是空白界面,是因为以上操作,servlet 只是接收到了请求,但是没有做出响应。简单实现一个响应:
浏览器输入:
http://localhost:端口号/myservlet?id=10086
~~~
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//最核心方法,业务逻辑写在这里
System.out.println("接收到客服端的请求");
String id = servletRequest.getParameter("id");
servletResponse.setContentType("text/html;charset=UTF-8");
servletResponse.getWriter().write("客户端已接收到 id 为 " + id + "的请求");
}
~~~
此时重新启动,键入上面的地址,此时界面上会显示出
客户端已接收到 id 为 10086的请求
的中文文字信息。
Servlet 的生命周期
- 当浏览器访问 Servlet 的时候,Tomcat 会查询当前 Servlet 的实例化是否存在,如果不存在,则通过反射机制动态创建对象,如果存在,直接执行第3步。
- 调用 init 方法完成初始化操作(生命周期中只会调用一次,浏览器刷新的时候,不走这个方法)
- 调用 service 方法完成业务逻辑操作。
- 关闭 Tomcat 时,会调用 destroy 方法,释放当前对象所占用的资源。
Servlet 的生命周期方法:无参构造方法、inti、service、destroy
- 无参构造方法只调用一次,创建对象。
- inti只调用一次,初始化对象。
- service 调用 N 次,执行业务方法。
- destroy 只调用一次,卸载对象。