Servlet技术
1. Servlet简介
- Servlet是使用Java Servlet API编写的、适合于B/S模式的、运行在Web服务器端的Java类。
- Servlet的工作原理如图所示:
1.1Servlet的主要优点
- 可移植性:Servlet利用Java语言开发,具有Java的跨平台性.
- 功能强大:包括
网络和URL访问
通过JDBC访问远程数据库
通过对象序列化使用Java Bean
通过JNDI使用EJB等 - 性能优良:
实例驻留:Servlet在加载执行之后,它的实例在一段时间内会一直驻留在服务器的内存中。若有请求,服务器会直接调用Servlet实例来服务。
提供线程,效率高:当多个客户请求一个Servlet时,服务器会为每个请求者启动一个线程来处理,所以效率高。 - 可靠性:
有强类型检查功能,利用Java的垃圾回收机制避免内存管理上的问题。
能够安全地处理各种错误,不会因为发生程序上垃圾回收机制逻辑错误而导致整体服务器系统的崩溃。
2. 编译和运行Servlet
2.1Servlet程序的基本结构
- 5个必须的方法:
void init(ServeletConfig config): 被Servlet容器调用,初始化一个Servlet类实例
void destroy():被Servlet容器调用,销毁一个Servlet类实例
String getServletInfo():获得Servlet信息, 如作者、版本号及版权等
void service(ServeletRequest req, ServeletResponse res): 被Servlet容器调用,使得Servlet能接收用户请求并做出响应
ServletConfig getServletConfig()获得ServletConfig对象,里面包含该Servlet的初始化信息 - 不需要直接实现Servlet接口,而是借助Java Servlet API的两个抽象类:GenericServlet和HttpServlet。
- 继承自GenericServlet类的Servlet只需实现service()方法,且与协议无关。
- HttpServlet类是GenericServlet类的子类,它仅支持基于HTTP协议的请求/响应。
2.1.1HttpServlet类主要方法
2.1.2HTTP请求处理过程
2.2编译Servlet源程序
- 编译Servlet源文件需要javax.servlet包和javax.servlet.http包(JDK内置包中没有)
- Tomcat安装目录的lib文件夹下的 servlet-api.jar包。
- 使用可以采用两种方式:
在环境变量的classpath中添加上该jar包
将该jar包解压,把解压后的javax文件夹和要编译的Servlet程序放在同一个目录下编译Servlet源程序。 - tomcat10之后:
不再使用javax.servlet
使用jakarta.servlet
2.3运行Servlet
运行Servlet程序需要做三项工作:
- 将Servlet源程序编译生成的.class文件放在Tomcat安装目录下的webapps目录下某个Web应用目录的WEB-INF\classes目录中
- 在WEB-INF文件夹下建立web.xml并配置(servlet规范中3.0以上版本支持注解)
- 在打开浏览器中通过URL浏览
- web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app …… version="2.4">
<servlet>
<servlet-name>bbb</servlet-name>
<servlet-class>ser.Helloworld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>bbb</servlet-name>
<url-pattern>/servlet/ Helloworld</url-pattern>
</servlet-mapping>
</web-app>
<servlet>和<servlet-mapping>成对出现,完成一个Servlet的配置
<url-pattern>的内容是客户请求时在地址栏中书写地址的形式。
<servlet-name>的内容是一个字符串,两处<servlet-name>的体内容应保持一致。
<servlet-class>的体内容指出Servlet的class文件的从classes目录起的完整路径名和文件名
<?xml version="1.0" encoding="UTF-8"?>
<web-app …… version="2.4">
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>Message.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/Login</url-pattern>
</servlet-mapping>
</web-app>
3. Servlet的生命周期
- 在Servlet生命周期中,init()方法只做一次,初始化Servlet处理请求时所需的对象,如ServletRequest/HttpServletRequest对象、HttpServletResponse对象等。
- 在Servlet生命周期中,destroy()方法也只做一次。可以重定义destroy()方法添加一些收尾工作,如关闭与数据库的连接等 。
4. Servlet中其他常用的类和接口
4.1ServletRequest接口和HttpServletRequest接口
- ServletRequest接口:获取客户端信息和数据流。
- HttpServletRequest接口:继承自接口ServletRequest,只支持HTTP协议,JSP的隐含对象request就是实现HTTPServletRequest接口类的对象。
4.2ServletResponse接口和HttpServletResponse接口
- ServletResponse接口: 向客户端发送信息,能设置响应内容的长度和响应的MIME类型,并提供输出流。
- HttpServletResponse接口:继承自接口ServletResponse,只支持HTTP协议。JSP的隐含对象response就是实现HTTPServletResponse接口类的对象。
特有方法:
4.3HttpSession接口
- JSP的隐含对象session是实现HttpSession接口类的对象
- 在Servlet中与在JSP中一样,通过Cookie或重写URL来支持会话。
4.4ServletConfig接口
- ServletConfig接口定义Servlet 配置对象,在初始化Servlet时将初始化信息传递给Servlet 引擎。
- JSP的隐含对象config是实现ServletConfig接口类的对象
4.5ServletContext接口
- ServletContext对象表示一组Servlet共享资源
- 提供访问有关Servlet环境信息的方法,如访问服务器名称、MIME类型映射、写日志文件等,让相同环境中的Servlet通过属性共享信息
- JSP的隐含对象application是实现ServletContext接口类的对象
4.6RequestDispatcher接口
- 定义一个对象,该对象负责在服务器端接收来自客户端的请求并向他们发送资源
servlet容器创建该对象,用来包装一个给定位置或名字的服务器资源。 - public void forward(ServletRequest request, ServletResponse response)
推进一个请求到服务器的某个资源 - public void include(ServletRequest request, ServletResponse response) throws ServletException,java.io.IOException
该方法在响应中包含某些资源的内容(如:servlet,JSP文件,HTML文件)。该方法关键是能包含服务器端的程序。
4.7Filter、FilterChain 和FilterConfig接口
- 使用过滤器的步骤:
定义过滤器
在web.xml中配置
在web应用中使用
4.7.1在web.xml中配置过滤器
- <filter>标记用于将过滤器名称与过滤器类关联,
- <filter-mapping>标记可将过滤器名称映射至Web资源
- <dispatcher>设定过滤器对应的请求方式:
REQUEST
FORWARD
INCLUDE
ERROR
4.7.2定义过滤器- Filter接口
- 过滤器是实现Filter接口类的对象
- Filter接口类的主要方法
init() //初始化
doFilter() //每当有请求或响应时被容器调用进行过滤(需要重写)
destory() //销毁
4.7.3定义过滤器- FilterChain接口
- FilterChain接口用于调用过滤器链中的一系列过滤器,通过该接口把被过滤的任务在Filter间传递
- 主要方法 :
public void doFilter(ServletRequest req, ServletResponse res)
//调用下一个过滤器,若无则将请求或响应传递到目标。
4.7.4定义过滤器-FilterConfig
- FilterConfig接口用于从web.xml中获取初始参数等信息
- 主要方法 :
getFilterName() //获得过滤器的名字
getInitParameter(String name)//获得名称为name的参数值
getServletContext()//获得ServletContext
getInitParameterNames()//获得所有初始化参数的名称
5. JSP访问Servlet
5.1通过表单
<form name="insert" method="post" action="Note">
表单内容
</form>
5.2通过超链接
<a href="Note?status=selectAll">回到留言管理页面</a>
6. MVC模式的优点
- 适合可扩展性、可维护性的需要。由于MVC的三个模块相互独立,耦合极低,改变其中一个不会影响其他两个。
- 一个模型可以呈现给多个视图,大大提高代码重用性。用户不直接访问分散的UI,可以通过配置文件或流程定义的方式,在不同的环节、时间将不同的页面推向给用户。
- 控制器提高了应用程序的灵活性和可配置性,为构造应用程序提供强有力的手段。给定一些可重用模型和视图,控制器可以根据用户的需求选择适当的模型进行处理,然后选择适当的视图将处理结果显示给用户。
- 通过将表示与模型分离,使开发者可以明确分工,提高开发效率。
7. JSP Model 1
- JSP Model 1是以页面为中心的体系结构,用户通过浏览器访问一系列JSP页面。
- JSP页面不仅提供显示输出,而且负责处理请求,并给客户端响应。(不仅要显示界面,而且还要管控制,有大量的代码段嵌入JSP 页面中)
- 使用Java Bean执行数据存取和业务逻辑,使表示与内容分离。
8. JSP Model 2
- JSP Model 2 体系结构是一种联合使用JSP与Servlet来提供动态内容服务的方法。
- 用JSP生成表示层的内容,让Servlet完成深层次的处理任务。
- Servlet充当控制器的角色:
负责处理用户请求
创建JSP页需要使用的Java Bean对象
根据用户请求选择合适的JSP页返回给用户