一、Servlet:其实就是一个java程序,运行在我们的web服务器上,用于接收和响应 客户端的http请求。
二、Hello Servlet
1、新建一个web工程,要有一个服务器
2、新建一个实现Servlet接口的类
3、配置Servlet,用意:匹配客户端请求,指向具体Servlet
3.1、具体配置文件路径在webContent/WEB-INF/web.xml
3.2、配置信息
4、启动Run AS
浏览器地址栏:http://localhost:8080/p02_HellowServlet/a
分析:http://localhost:8080/项目名称+<url-pattern>节点内容(/a)
<url-pattern>写法:
Ⅰ、全路径匹配
以 / 开始 /a /aa/bb
localhost:8080/项目名称/aa/bb
Ⅱ、路径匹配 , 前半段匹配
以 / 开始 , 但是以 * 结束 /a/* /*
*)其实是一个通配符,匹配任意文字
localhost:8080/项目名称/aa/bb
Ⅲ、以扩展名匹配
写法: 没有/ 以 * 开始 *.扩展名 *.aa *.bb
三、Servlet执行过程
1、通过URL请求找到对应Web项目(发布在tomcat服务器上的web项目)
2、查找web.xml文件中url-pattern节点中是否有符合URL格式的,如果没有就404,有的话获取其兄弟节点servlet-name内容
3、根据servlet-name查找servlet节点下servlet-class指向servlet的类全名称,并执行Servlet中的service方法
四、Servlet接口方法分析
1 public class HelloServlet implements Servlet {
2 @Override
3 public void init(ServletConfig config) throws ServletException {
4 System.out.println("Servlet init");
5 }
6
7 @Override
8 public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
9 System.out.println("Servlet service");
10 }
11
12 @Override
13 public void destroy() {
14 System.out.println("Servlet destroy");
15 }
16
17 @Override
18 public ServletConfig getServletConfig() {
19
20 return null;
21 }
22
23 @Override
24 public String getServletInfo() {
25
26 return null;
27 }
28 }
运行结果:
Ⅰ、Init方法:在创建该servlet的实例时,就执行该方法。
一个servlet只会初始化一次, init方法只会执行一次
默认情况下是 : 初次访问该servlet,才会创建实例。
Ⅱ、service方法:只要客户端来了一个请求,那么就执行这个方法了。
该方法可以被执行很多次。 一次请求,对应一次service方法的调用
Ⅲ、destroy方法:servlet销毁的时候,就会执行该方法
1. 该项目从tomcat的里面移除。
2. 正常关闭tomcat就会执行 shutdown.bat
Ⅳ、getServletConfig方法:对外提供可获取ServletConfig对象的公共方法
ServletConfig对象所对应的实体,如下图:
ServletConfig对象对应是上图servlet节点,那么就应该有方法可以获取子节点内容的方法
三个方法:
getServletName
getInitParameter(String name)
getInitParameterNames
演示:
servlet节点配置
1 <servlet>
2 <servlet-name>HelloServlet</servlet-name>
3 <servlet-class>com.marw.servlet.HelloServlet</servlet-class>
4 <init-param>
5 <param-name>params01</param-name>
6 <param-value>1</param-value>
7 </init-param>
8 <init-param>
9 <param-name>params02</param-name>
10 <param-value>2</param-value>
11 </init-param>
12 <init-param>
13 <param-name>params03</param-name>
14 <param-value>3</param-value>
15 </init-param>
16 <init-param>
17 <param-name>params04</param-name>
18 <param-value>4</param-value>
19 </init-param>
20 <load-on-startup>2</load-on-startup>
21 </servlet>
service方法中的代码
1 @Override
2 public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
3 System.out.println("Servlet service");
4
5 // 获取到的是配置servlet里面servlet-name 的文本内容
6 String servletName = config.getServletName();
7 System.out.println("servletName=" + servletName);
8
9 // 2、。 可以获取具体的某一个参数。
10 String str = config.getInitParameter("params01");
11 System.out.println("params01=" + str);
12
13 // 3.获取所有的参数名称
14 Enumeration<String> names = config.getInitParameterNames();
15 // 遍历取出所有的参数名称
16 while (names.hasMoreElements()) {
17 String key = (String) names.nextElement();
18 String value = config.getInitParameter(key);
19 System.out.println("key===" + key + " value=" + value);
20
21 }
22 }
结果:
Ⅴ、getServletInfo方法:可以自定义信息
补充:load-on-startup改变Servlet初始化(Init)方法执行时机
1. 默认情况下,只有在初次访问servlet的时候,才会执行init方法。
2. 初始化方法做一些比较耗时的逻辑,可能会在init方法中逗留太久的时间。 那么有没有方法可以让这个初始化的时机提前一点。
3. 在配置的时候, 使用load-on-startup元素来指定, 给定的数字越小,启动的时机就越早。 一般不写负数, 从2(服务器启动时机)开始即可。