Servlet
概念
运行在服务端的程序(Servlet)就是一个接口
定义了Java类被浏览器(Tomcat)访问的规则
官方Java EE 7API.doc
继承Servlet或者HttpServlet 并重写当中的方法,即可完成构建Servlet
快速入门
- 创建JavaEE项目
2. 定义一个类,实现Servlet或者HttpServlet接口,实现接口中的抽象方法
public class ServletDemo extends Servlet{
@Override
public void init(ServletConfig servletConfig){
}
@Override
public ServletConfig getServletConfig(){
return null;
}
// 核心方法,提供业务的方法
@Override
public void service(ServletRequest request,ServletResponse response){
System.out.println("Hello Servlet");
}
@Override
public String getServletInfo(){
return null;
}
@Override
public void destroy(){
}
}
- 在web.xml中配置Servlet
!!!servlet标签和servlet-mapping标签是成对出现的缺一不可!!!
启动项目
输入url
localhost:8080/demo1
控制台出现了打印的一句话,证明了走进了service() 方法
这个/demo1
- 就是你在url-pattern标签里面配置的路径,它会找到servlet-name对应的class并将全类名对应的字节码加载进内存
- 创建对象,class.newInstance()
- 调用核心 service()方法
执行原理
- 当服务器接收到客户端浏览器请求后,会解析请求URL路径,获取访问的Servlet资源路径
- 查找web.xml文件,是否有对应的标签体内容,
- 如果有,则在找到对应的全类名
- tomcat会将字节码文件加载进内存,并且创建其对象
- 调用其方法
Servlet生命周期
第一次启动servlet项目时候,会调用init初始化的方法,后续便不会再调用,也就是说init()只会被调用一次
可以配置或指定Servlet创建时机
<servlet>
<servlet-name>demo2</serlvet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemo</servlet-class>
<!-- 默认是负值 第一次访问url时,才会创建 -->
<!-- 配置了正数,代表服务器启动时创建 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo2</servlet-name>
<url-pattern>/demo2</url-pattern>
</servlet-mapping>
调用完init()方法后,紧接着再调用service()方法,service()可执行多次
public class ServletDemo extends Servlet{
@Override
public void init(ServletConfig servletConfig){
}
// 核心方法,提供业务的方法
@Override
public void service(ServletRequest request,ServletResponse response){
System.out.println("Hello Servlet");
}
@Override
public void destroy(){
}
}
当我们关闭服务器时候,会调用destory() 方法来销毁servlet,只会执行一次
注意: Servlet的init方法只执行一次,说明一个Servlet再内存中只存在一个对象,Servlet时单例的
多个用户同时访问时,可能存在线程安全问题
所以尽量不要再Servlet中定义成员变量,即使定义了成员变量,也不要对其修改
Servlet3.0 支持注解配置
步骤
- 创建JavaEE项目,选择Servlet3.0以上的版本,不创建web.xml
- 定义一个类,实现Servlet接口或者HttpServlet接口
- 重写其中的方法
- 类上添加@WebServlet注解,进行配置
案列
- 创建Java EE 6版本以上的项目,取消勾选web.xml
- 采用注解方式开启Servlet,可以看一下@WebServlet注解的源码有哪些参数
public @interface WebServlet {
String name() default "";
String[] value() default {};
String[] urlPatterns() default {};
int loadOnStartup() default -1;
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
- 这里我们用到了urlPattern是一个url映射路径,其他参数可以自行选择
@WebServlet(urlPatterns = "/demo")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet 3.0 来了.....");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
- 结果,成功打印
urlPattern可以多种定义
- 定义多路径
@WebServlet({"/d","/dd","/ddd"})
- 定义多层次路径
@WebServlet({"/demo/user"})
- 通配符定义(满足前者匹配,后者任意)
@WebServlet({"/demo/*"})
IDEA与Tomcat相关配置
- IDEA会为每一个tomcat部署的项目单独建立一份配置文件
- 工作空间项目和tomcat部署的webe项目
tomcat 真正访问的是tomcat部署的web项目,tomcat部署的web项目对应着工作空间项目是web目录下的所有资源
WEB-INF 目录下的资源不能被浏览器直接访问