前 言
人总是要有梦想的,也许哪天就实现了呢!
如果有不正确之处,还望赐教,毕竟我只是初学者!
一、Servlet 简介
1、概 述
该内容来源于百度百科
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。其本质是一个接口。
2、为什么需要Servlet?
学完前端三件套后的我们,可以写出丰富的页面,但是始终是页面,却不能实现一些与后端的交互功能,例如:现在有一个表单,虽然样式很精美,但是你点击提交的时候,你所输入的数据却无处存放,不能够成功的交给后台,与此同时你也不能从后台拿到数据向用户展示。为了解决这个问题,就出现了Servlet技术。Servlet技术可以帮助我们拿取前台数据和向前台发送数据。
二、Servlet 快速入门
public class ServletDemo implemens Servlet {
public static void main(String[] args) {
@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() {
}
}
}
在WEB-INF目录下的web.xml中配置该Servlet
<servlet>
<servlet-name>servletDemo</servlet-name>
<servlet-class>com.lmy.servlet.ServletDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletDemo</servlet-name>
<url-pattern>/servletDemo</url-pattern>
</servlet-mapping>
执行原理
- 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径,即
<url-pattern>
标签体中的内容 - 查找web.xml文件,是否有对应的
<url-pattern>
标签体内容 - 如果有,则找到其对应的
<servlet-class>
全类名 - 然后tomcat会将字节码文件加载进内存,并且创建其对象
- 最后调用其方法
三、Servlet 生命周期
1、生命周期的五个步骤
- 加载Servlet:当Tomcat第一次访问Servlet的时候,tomcat会将其加载到web容器中,并对其进行实例化;
- Servlet初始化:当Servlet被实例化后,Tomcat会调用init()方法来初始化Servlet对象;
- 处理服务:当Servlet被初始化后,浏览器发出请求,Servlet会调用service()方法来处理该请求;
- 销毁:当Tomcat关闭或检测到Servlet要从Tomcat中删除的时候会自动调用destory()方法让该Servlet对象释放所占的资源;一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁;
- 卸载:当Servlet调用完destroy()方法后,等待垃圾回收;如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作;
2、代码示例
public class ServletDemo3 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("我被初始化啦!!!!");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("我被执行啦!!!!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("我被销毁了!!!");
}
}
web.xml中servlet配置:
<servlet>
<servlet-name>servletDemo3</servlet-name>
<servlet-class>com.itcast.servlet.ServletDemo3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletDemo3</servlet-name>
<url-pattern>/demo3</url-pattern>
</servlet-mapping>
2、执行过程
-
启动项目,访问demo3:
-
我们再次访问该路径:
-
最后关闭程序:
3、执行过程分析
- init()方法只会执行一次:我们访问了该servlet两次,而init()方法只在第一次访问的时候被执行,并且先于service()方法执行;
- 每被访问一次,service()方法被执行一次;
- 当程序关闭时,才会执行destory()方法;
四、Servlet 注解方式
1、为什么出现注解方式
在Servlet3.0版本之前,我们每写一个Servlet,我们就需要在web.xml文件中配置该Servlet,保证其可以被成功访问,这种方式,很繁琐。假设出现一种情况,一个项目有20多个servlet,而你也就必须配20多个Servlet,有时候还可能出错。为了解决这一问题,简化开发,在Servlet3.0以后便可以使用注解的方式来设置Servlet访问路径等信息。
2、如何将web项目设置为3.0以上版本
这里只提供idea的修改方式,在新建项目时如下操作:
3、代码示例
@WebServlet(value = "/servletDemo1")
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("Servlet 3.0");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
4、注解注意事项
- 注解中的value可以替换为url-pattern,value值为虚拟路径,并且value也可以省略不写,即
@WebSerlvet("/servletDemo1")
- 查看底层代码时,value和url-patter都为String数组,这就代表着我们可以为一个Servlet设置多个虚拟目录,通过不同的虚拟目录所访问的都是同一个Servlet;例如:
@WebServlet(value={"/servletDemo1", "/demo1", "/hello"})
,但是不推荐这样做,因为这样会导致不好控制访问路径。、
5、路径定义规则
- /xxx:单层路径匹配,强烈推荐这种方式,因为可以明确指定Servlet
- /xxx/xxx:多层路径,目录结构,这种方式可以体现出项目的目录结构,推荐使用
- /*:任意路径都可以匹配成功,这种URL优先级最低,不推荐去这样使用
- *.do:通过指定扩展名匹配,扩展名前面的名称可以任意,这种方式也不推荐