一、 Servlet是什么
定义:一种按照Servlet标准,使用Java类编写的服务端应用程序,运行在服务器端,并由服务器调用执行,浏览器可直接访问,可以像JSP一样,生成动态的WEB页,。位于客户端和服务器端的一个中间层,负责接收和请求客户端用户的响应。
Servlet可以提供以下功能:
(1)对客户端发送的数据进行读取和拦截
(2)读取客户端请求的隐含数据
(3)运行结果或者生成结果
(4)发送响应的数据
Servlet与JSP的区别:
1、JSP是Servlet技术的扩展,在本质上就是Sservlet,但是两者的创建方式不一样。
2、Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观.
3、JSP侧重于视图,Servlet主要用于控制逻辑。
4、Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP是Java和HTML组合成一个扩展名为.jsp的文件,可以方便地编写动态网页.
Servlet多数负责对客户端的请求进行处理和调用JavaBean;由JavaBean负责提供可复用的数据以及数据的访问数据等。
而JSP页面主要负责页面的展示,将动态的数据展现给客户,
因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.在框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层
二、 Servlet的处理流程
Servlet的处理流程:
- 客户端(很可能是Web浏览器)通过HTTP提出请求。
- WEB服务器接收该请求并将其发送给servlet。如果这个servlet尚未被加载,web服务器将把它加载到Java 虚拟机并且执行它。
- Servlet程序将接收该HTTP请求并执行某种处理。 Servlet会将处理后的结果向Web服务器返回应答。
- WEB服务器将从Servlet收到的应答发回给客户端。
三、Servlet的生命周期
- 加载Servlet
WEB容器负责加载Servlet,当WEB容器启动的时候或者是在第一次使用这个Servlet的时候,容器会负责创建Servlet实例,但是用户必须通过部署描述符(web.xml)指定Servlet的位置(Servlet所在的包.类名称),成功加载之后,WEB容器会通过反射的方式对Servlet进行实例化。 - 初始化
当一个Servlet被实例化之后,容器将调用init()方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,例如:建立数据库连接、读取资源文件信息等,如果初始化失败,则此Servlet将被直接卸载。 - 处理服务
当有请求提交时,Servlet将调用service()方法(常用的是doGet()或doPost())进行处理,在service()方法中,Servlet可以通过ServletRequest接收客户的请求,也可以利用ServletResponse设置响应信息。 - 销毁
当WEB容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,以便让该实例释放掉所占用的资源。 - 卸载
当一个Servlet调用完destroy()方法后,此实例将等待被垃圾收集器所回收,如果需要再次使用此Servlet的时候,会重新调用init()方法初始化。
四、如何编写和部署Servlet
- 编写Servlet
根据servlet的发展,Servlet的编写有两种写法,分别是:Servlet2.0 和 Servlet 3.0。
(1). Servlet2.0写法:
HelloServlet类:
package com.etch.edu;
……
public class HelloServlet extends HttpServlet {
//序列化 可以自动生成或者自行定义
private static final long serialVersionUID = 1L;
public void init() throws ServletException{
System.out.println("初始化 init 方法");
}
public void doGet(HttpServletRequest request, HttpServletResponse response){
…….
}
……
}
Web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.etch.edu.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>
(2)Servlet3.0写法:
HelloServlet类:
package com.etch.edu;
@WebServlet(
urlPatterns = { "/HelloServlet " },
name = " helloServlet "
)
public class HelloServlet extends HttpServlet {
//序列化 可以自动生成或者自行定义
private static final long serialVersionUID = 1L;
public void init() throws ServletException{
System.out.println("初始化 init 方法");
}
public void doGet(HttpServletRequest request, HttpServletResponse response){
…….
}
……
}
属性名 | 描述 |
---|---|
name | 指定 Servlet 的 name 属性,等价于 <servlet-name> 。如果没有指定,则该Servlet的取值即为类的全名。 |
urlPatterns | 指定Servlet的URL匹配模式。等价于<url-pattern> 标签。 |
loadOnStartup | 指定 Servlet 的加载顺序,等价于<load-on-startup> 标签。当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载;正数的值越小,该servlet的优先级越高,应用启动时就越先加载;当值相同时,容器就会自己选择顺序来加载 |
编译时会出现找不到servlet包的错误
如果用户使用手工的方式编译一个Servlet的话,则有可能在编译时会出现以下的错误提示:
- 软件包 javax.servlet 不存在
- 软件包 javax.servlet.http 不存在
这两个Servlet的开发包实际上是保存在
%TOMCAT_HOME%\lib\servlet-api.jar
路径下,但是由于现在使用javac命令编译的时候,是使用的JAVA> SE环境编译的,但是Servlet本身已经属于JAVA EE的应用范畴,所以就出现了找不到开发包的情况,此时,有两种方式:
一种是通过classpath指定,在classpath中加入此开发包的路径
另外一种方式是将Servlet的开发包保存在%JAVA_HOME%\jdk1.6.0_02\jre\lib\ext目录之中
- 部署Servlet:
(1)原始的编译部署
利用Java编译器,将具体的Java类进行编译,例如本例中运行编译命令:javac FirstServlet.java 在当前目录中生成FirstServlet.class文件,将FirstServlet.class文件拷贝到WEB-INF文件夹下的classes文件夹下
(2)利用Eclipse或者IntelliJ IDEA中Tomcat服务器
打开IE浏览器,在地址栏中输入地址:http://localhost:8080/HelloServlet/FirstServlet