概念
Server applet:运行在服务器端的小程序。它是一个接口,定义了Java类被浏览器访问到(Tomcat识别)的规则。我们在自定义类的时候,要实现Servlet接口,复写方法。
快速入门
- 创建JavaEE项目
- 定义实现Servlet的类
1
| public class ServletDemo1 implements Servlet{}
|
- 实现接口中的抽象方法
配置Servlet
在web.xml的web-app标签中如下配置:
1 2 3 4 5 6 7 8 9 10
| <servlet> <servlet-name>demo1</servlet-name>// 和<servlet-mapping>中的内容一样 <servlet-class>web.servlet.ServletDemo1</servlet-class>// servlet应用的全类名 </servlet>
<servlet-mapping> <servlet-name>demo1</servlet-name>// 和<servlet>中的内容一样 <url-pattern>/demo1</url-pattern>// 客户端在访问时使用的url </servlet-mapping>
|
Servlet执行原理
- Servlet作用:处理请求。
- 当浏览器访问一个路径时,就向tomcat发送一个请求。服务器接收到客户端的请求后,会解析请求URL路径,获取访问的Servlet的资源路径。
- 查找web.xml文件,是否有对应的
<url-pattern>
标签体内容。
- 如果有,则再找到对应的
<servlet-class>
全类名。
- tomcat会将字节码文件加载进内存,并创建其对象。
- 调用其方法。
Servlet中的生命周期
被创建:执行init方法,只执行一次。
提供服务:执行servlet方法,执行多次。每刷新一次就调用一次。
被销毁:执行destroy方法,执行一次。
- 只有服务器正常关闭时,才会执行destroy方法。
- destroy方法在Servlet被销毁之前执行,一般用于释放资源。
实现servlet的三种方式
- 实现javax.servlet.Servlet接口。
- 继承javax.servlet.GenericServlet类(适配器模式)。可以选择性地实现一些方法。
- 继承javax.servlet.http.HttpServlet类(模板方法设计模式)。比较常用。
Servlet 3.0
支持注解配置。可以不用web.xml.了。
步骤:
创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml。
定义一个类,实现Servlet接口。
复写方法。
在类上使用@WebServlet注解,如下进行配置:
@WebServlet("/资源路径")
这个注解中有多个配置,其中value与urlPatterns相关联。只写一个配置时,value可以省略不写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface WebServlet{ String name default ""; String[] value() default {}; String[] urlPatterns() defualt -1; int loadOnStarup() default -1; WebInitParam[] initParams() defalut {}; boolean asyncSupported() default false; String smallIcon default ""; String largecon default ""; String description() default ""; String displayName() default ""; }
|
IDEA与Tomcat的相关配置
IDEA会为每一个Tomcat部署的项目单独建立一份配置文件。
查看控制台的log:Using CATALINA_BASE: "C:\Users\Retur0\.IntelliJIdea2019.1\system\tomcat\_Tomcat_IDEA"
工作空间项目 和 tomcat的web项目。
tomcat真正访问的是:“tomcat的web项目”。
“tomcat的web项目”对应着“工作空间项目”的web目录下的所有资源。
断点调试:使用IDEA中的debug启动
Servlet体系结构
Servlet — 接口
|
GenericServlet — 抽象类
|
HttpServlet — 抽象类
- GenericServlet:将Servlet接口中的其他方法做了默认空实现,只将service()方法作为抽象。将来定义Servlet类时,可以继承GenericServlet,实现Service方法即可。
- HttpServlet:对http协议的一种封装,简化操作。
- 定义类来继承HttpServlet
- 复写doGet/doPost方法
Servlet映射规则
urlPatterns:
- servlet访问路径。一个servlet可以定义多个访问路径。
- 路径的定义规则:在项目名要写的前提下
- *.do:自定义扩展名,通过扩展名找到文件。不加/。任何以“.do”结尾的都可以访问Servlet。do也可以换成其他的。
- /*:任何访问都会访问到Servlet。
- /action:加/action前缀的都可以访问到Servlet。action可以替换。可以分模块。
ServletContext上下文
代表的是整个应用,一个应用只有一个ServletContext对象。是单例对象。
作用
域对象。在当前应用,使多个Servlet共享数据。
常用方法
void setAttribute(String name, Object value);
:向ServeltContext对象的map中添加数据。
Object getAttribute(String name);
:从ServletContext对象的map中取数据。
void removeAttribute(String name);
:根据name去移除数据。移除后再取数据得到的结果是null。
1 2 3 4 5 6 7 8 9
| @WebServlet("/Demo1") public class Demo1 extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp){ ServletContext context = this.getServletContext(); System.out.println(context); context.setAttribute("name", "123"); } }
|
1 2 3 4 5 6 7 8 9 10 11
| @WebServlet("/Demo2") public class Demo2 extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp){ ServletContext context = this.getServletContext(); System.out.println(context); String str = (String)context.getAttribute("name"); System.out.println(str); context.removeAttribute("name"); } }
|
ServletContext获取全局配置信息
xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?xml version="1.0" encoding="UTF-8"?> <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"> <display-name>191023</display-name> <context-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </context-param> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
|
servlet:
1 2 3 4 5 6 7 8 9 10
| @WebServlet("/Context2Demo1") public class Demo1 extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp){ String str = (String)this.getServletContext().getInitParameter("encoding"); System.out.println(str); } }
|
获取资源路径
ServletContext的String getRealPath(String path)方法:
- 根据资源名称得到资源的绝对路径。
- 可以得到当前应用任何位置的任何资源。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @WebServlet("/Context3Demo1") public class Demo1 extends HttpServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws FileNotFoundException, IOException{ String path = this.getServletContext().getRealPath("WEB-INF/classes/com/Retur0/web/Context3/info.properties"); Properties pro = new Properties(); pro.load(new FileInputStream(path)); System.out.println(pro.getProperty("username")); } }
|
Servlet的转发
1 2 3 4 5 6 7 8 9 10
| @WebServlet("/Demo1") public class Demo1 extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp){ RequestDispatcher rd = request.getRequest("/Demo2"); rd.forward(req, resp); } }
|
1 2 3 4 5 6
| @WebServlet("/Demo2") public class Demo2 extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp){ response.getWriter().writer("data from Servlet2"); } }
|