Tomcat&Servlet7_Servlet3
Servlet:server applet
1、概念:运行在服务器端的小程序
* Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
* 将来我们自定义一个类,实现Servlet接口,复写方法。

2、快速入门
1. 创建JavaEE项目
2. 定义一个类,实现Servlet接口
* public class ServletDemo1 implements Servlet
3. 实现接口中的抽象方法

package cn.itcast.web.servlet; import javax.servlet.*; import java.io.IOException; /** * Servlet快速入门 */ public class ServletDemo1 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 { System.out.println("Hello Servlet"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
4. 配置Servlet
在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_3_1.xsd" version="3.1"> <!-- 配置Servlet --> <servlet> <servlet-name>demo1</servlet-name> <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo1</servlet-name> <!-- 浏览器访问路径 --> <url-pattern>/demo1</url-pattern> </servlet-mapping> </web-app>
5. 启动tomcat,浏览器访问http://localhost:8080/demo1,可以发现每访问一次,那么idea中都会输出一次Hello Servlet

6. 多个项目修改项目访问路径,Run->Edit Configurations->Deployment,修改后项目的访问根路径就变成了http://localhost:8080/day07_tomcat,步骤5中的访问路径自然就变成了:http://localhost:8080/day07_tomcat/demo1
这时,访问http://localhost:8080/day07_tomcat,就相当于访问http://localhost:8080/day07_tomcat/index.jsp,会输出web目录中的index.jsp中的内容。


3、执行原理

1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径(demo1)
2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容
3. 如果有,则在找到对应的<servlet-class>全类名
4. tomcat会将字节码文件加载进内存,并且创建其对象
5. 调用其方法
4、Servlet中的生命周期方法
示例:
package cn.itcast.web.servlet; import javax.servlet.*; import java.io.IOException; /** * Servlet的方法 */ public class ServletDemo2 implements Servlet { /** * 初始化方法 * 在Servlet被创建时执行。只会执行一次 * @param servletConfig * @throws ServletException */ @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init......"); } /** * 获取ServletConfig对象 * ServletConfig:Servlet的配置对象 * @return */ @Override public ServletConfig getServletConfig() { return null; } /** * 提供服务方法 * 每一次servlet被访问时执行。执行多次 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("service......"); } /** * 获取Servlet的一些信息:版本,作者等等。。。 * @return */ @Override public String getServletInfo() { return null; } /** * 销毁方法 * 在服务器正常关闭时执行(在Sevlet被杀死时执行),执行一次 */ @Override public void destroy() { System.out.println("destroy......"); } }
<?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> <servlet-name>demo1</servlet-name> <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo1</servlet-name> <url-pattern>/demo1</url-pattern> </servlet-mapping> <!-- 配置Servlet --> <servlet> <servlet-name>demo2</servlet-name> <servlet-class>cn.itcast.web.servlet.ServletDemo2</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo2</servlet-name> <url-pattern>/demo2</url-pattern> </servlet-mapping> </web-app>
重新启动服务器,Rerun tomcat,第一次访问http://localhost:8080/day07_tomcat/demo2,输出结果:

再次访问http://localhost:8080/day07_tomcat/demo2,则只输出service......

停止服务器后,则输出destroy...
1. 被创建:执行init方法,只执行一次
a. Servlet什么时候被创建?
* 默认情况下,第一次被访问时,Servlet被创建
* 可以配置执行Servlet的创建时机。
* 在<servlet>标签下配置
1. 第一次被访问时创建
* <load-on-startup>的值为负数
2. 在服务器启动时创建
* <load-on-startup>的值为0或正整数
<?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> <servlet-name>demo1</servlet-name> <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo1</servlet-name> <url-pattern>/demo1</url-pattern> </servlet-mapping> <!-- 配置Servlet --> <servlet> <servlet-name>demo2</servlet-name> <servlet-class>cn.itcast.web.servlet.ServletDemo2</servlet-class> <!-- 指定Servlet的创建时机 1. 第一次被访问时,创建 * <load-on-startup>的值为负数 2. 在服务器启动时,创建 * <load-on-startup>的值为0或正整数 --> <load-on-startup>5</load-on-startup> </servlet> <servlet-mapping> <servlet-name>demo2</servlet-name> <url-pattern>/demo2</url-pattern> </servlet-mapping> </web-app>
重启服务器,输出:init......

b. Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
* 多个用户同时访问时,可能存在线程安全问题。
* 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对其修改值(只是获取就不存在线程安全问题)。
2. 提供服务:执行service方法,执行多次
* 每次访问Servlet时,Service方法都会被调用一次。
3. 被销毁:执行destroy方法,只执行一次
* Servlet被销毁时执行。服务器关闭时,Servlet被销毁。
* 只有服务器正常关闭时,才会执行destroy方法(直接关闭idea不会执行destroy方法)。
* destroy方法在Servlet被销毁之前执行,一般用于释放资源。
5、Servlet3.0
好处:支持注解配置。可以不需要web.xml了。
步骤:
1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
从JavaEE6即JDK6开始,才支持webServlet3.0版本。
新建一个模块


在day07_servlet的src文件下创建一个包

2. 定义一个类,实现Servlet接口
3. 复写方法
4. 在类上使用@WebServlet注解,进行配置:@WebServlet("资源路径")
package cn.itcast.web.servlet; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; @WebServlet("/demo") public class ServletDemo 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 { System.out.println("Servlet3.0来了......"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
@WebServlet(urlPatterns="/demo")中urlPatterns是个数组,当只有一个值时省略{}。
启动服务器,访问http://localhost:8080/day07_servlet/demo,执行结果:

WebServlet中有一个value属性,value代表最重要的属性,即urlPatterns。则可以简化为@WebServle(value="/demo"),因为value可以省略,则最终简化为@WebServle("/demo")
重启服务器,访问http://localhost:8080/day07_servlet/demo,执行结果同上。
浙公网安备 33010602011771号