1.Servlet基础
Servlet是一种独立于平台和协议的服务器端的Java技术,他使用Java语言编写,可以用来生成动态的Web页面。
1.Servlet体系结构
Servlet对象、ServletConfig对象与Serializable对象是接口对象,其中Serializable是java.io包中的序列化接口,Servlet对象、ServletConfig对象是javax.servlet包中定义的对象,这两个对象定义了Servlet的基本方法并封装了Servlet的相关配置信息。GenericServlet对象是一个抽象类,他分别实现了上述的3个接口,此对象为Servlet接口及ServletConfig接口提供了部分实现,但他并没有对HTTP请求处理进行实现,这一操作由它的子类HttpServlet进行实现。这个对象为HTTP请求中的POSTGET等类型提供了具体的操作方法,所以通常情况下,我们所编写的Servlet对象都继承于HttpServlet,在开发之中所使用的具体的Servlet对象就是HttpServlet对象,因为HttpServlet对Servlet做出了实现,并提供了HTTP请求的处理方法。
2.Servlet技术特点
- 功能强大
- 可移植
- 性能高效
- 安全性高
- 可扩展
3.Servlet与JSP的区别
- 角色不同 JSP页面可以存在HTTP代码与Java代码并存的情况,而Servlet需要承担客户请求与业务处理的中间角色,只有调用固定的方法才能将动态内容输出为静态的HTML,所以JSP更具现实层的角色。
- 编程方法不同
Servlet与JSP在编程方法上存在很大的区别,使用Servlet开发Web应用程序需要遵循Java的标准,而JSP需要遵循一定的脚本语言规范。
- 在Servlet代码中,需要调用Servlet提供的相关API接口方法,才可以对HTTP请求及业务进行处理,对业务逻辑方面的处理能力更加强大。
- 在JSP页面中,可以通过HTTP代码与JSP内置对象实现对HTTP请求及页面的处理,其显示界面的能力更加强大。
- Servlet需要编译后执行
- Servlet需要在Java编译器编译后才可以运行,如果Servlet在编写完成或修改后没有被重新编译,则不能运行在Web容器中。
- JSP由JSP容器对其进行管理,他的编辑过程也有JSP容器对JSP进行自动编辑。所以,无论JSP文件是被创建还是修改,都不需要对其进行编译就可以执行。
- 速度不同 JSP在每次执行不同的内容时,JSP都要对其进行编译,所以,他的效率低于Servlet的效率。
2.Servlet开发
Servlet主要应用于B/S接口的开发中,B/S结构指浏览器与服务器的网络开发模式。在这一模式中,Servlet充当一个请求控制处理的角色,当浏览器发送一个请求时,由Servlet进行接收并对其进行相应的业务逻辑处理,最后对浏览器做出回应,可见Servlet的重要性。
1.Servlet配置
配置的目的是将创建的Servlet注册到Servlet容器之中,以方便Servlet容器对Servlet的调用。在Servlet3.0之后,除了可以在web.xml文件中配置外,还可以利用注解来配置Servlet。 (1)在web.xml文件中配置com.mingrisoft包中的FirstServlet。 具体代码如下:
代码语言:javascript复制<!--注册Servlet-->
<servlet>
<!--Servlet描述信息-->
<description>This is my first Servlet</description>
<!--Servlet的名称-->
<servlet-name>FirstServlet</servlet>
<!--Servlet类的完整名称-->
<servlet-class>com.mingrisoft.FirstServlet</servlet-class>
</servlet>
<!--Servlet映射-->
<servlet-mapping>
<!--Servlet名称-->
<servlet-name>FirstServlet</servlet-name>
<!--访问URL地址-->
<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>
(2)采用注解配置Servlet 采用注解的方式配置com.mingrisoft包中的FirstServlet。 具体代码如下:
代码语言:javascript复制import javax.servlet.annotation.WebServlet;
@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet{
......
}
3.在Servlet中实现页面转发
在Servlet中实现页面转发主要是利用RequestDispatcher接口实现的。RequestDispatcher接口可以把一个请求转发到另一个JSP页面。该接口包括以下两个方法。
- forward()方法 forward()方法用于把请求转发到服务器上的另一个资源,可以是Servlet、JSP或HTML。 其语法格式如下:
requestDispather.forward(HttpServletRequest request,
HttpServletResponse response);
- include()方法 include()方法用于把服务器上的另一个资源(Servlet、JSP、HTML)包含到响应中。 其语法格式如下:
requestDispatcher.include(HttpServletRequest request,
HttpServletResponse response);
4.Servlet处理表单信息
例:应用Servlet处理表单提交的数据。 (1)编写index.jsp页面,在该页面中添加用于收集留言信息的表单集表单元素。 具体代码如下:
代码语言:javascript复制<%@ page language="java" contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>处理表单信息页面</title>
<body>
<form id="form1" name="form1" method="post" action="MessageServlet">
留 言 人:
<input name="person" type="text" id="person"/><br/><br/>
留言内容:
<textarea name="content" cols="30" rows="5" id="content"></textarea><br/><br/>
<input type="submit" name="Submit" value="提交"/>
<input type="reset" name="Submit2" value="重置"/>
</form>
</body>
</html>
(2)编写一个名称为MessageServlet的Servlet,在该Servlet的doPost()方法中获取表单数据并输出。 其具体代码如下:
代码语言:javascript复制package com.wgh;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class MessageServlet
*/
@WebServlet("/MessageServlet")
public class MessageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MessageServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
String person=request.getParameter("person");
String content=request.getParameter("content");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
out.println("<html><head><title>获取留言信息</title></head><body>");
out.println("留言人:" person "<br>");
out.println("留言内容:" content "<br>");
out.println("<a href='index1.jsp'>返回</a>");
out.println("</body></html>");
out.close();
}
}
3.Servlet过滤器
1.什么是过滤器
过滤器的实质是在web应用服务器上的一个web应用组件,用于拦截客户端与目标文件的请求,并对这些请求进行一定的过滤处理再发送给目标资源。过滤器的处理方式如下图所示:
2.过滤器的核心对象
过滤器对象放置在javax.servlet包中,其名称为Filter,它是一个接口。除这个接口外,与过滤器相关的对象还有FilterConfig对象与FilterChain对象。这两个对象也同样是接口对象,位于javax.servlet包中,分别是过滤器的配置对象和过滤器的传递工具。
- Filter接口 每一个过滤器都要直接或间接地实现Filter接口,在Filter接口中定义了3个方法。
方法声明 | 说明 |
---|---|
public void init(FilterConfig filterConfig) throws ServletException | 过滤器初始化方法,此方法在过滤器初始化时调用 |
public void doFilter(ServletRequest request,ServletResponse reponse,FilterChain chain)throws IOException,ServletException | 对请求进行过滤处理 |
public void destroy() | 销毁方法,以便释放资源 |
- FilterConfig接口 FilterConfig接口由Servlet容器实现,主要用于获取过滤器中的配置信息,其方法说明如下:
方法声明 | 说明 |
---|---|
public String getFilterName() | 用于获取过滤器的名字 |
public ServletContext getServletContext() | 获取Servlet上下文 |
public String getInitParameter(String name) | 获取过滤器的初始化参数值 |
public Enumeration getInitParameterName() | 获取过滤器的所有初始化参数 |
- FilterChain接口 FilterChain接口仍然由Servlet容器实现,这个接口只有一个方法,其语法声明如下:
public void doFilter(ServletRequest request,
ServletResponse response)
throws IOException,ServletException
该方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器已经是过滤器链中的最后一个过滤器,那么请求将传递给目标资源。
3.过滤器创建与配置
过滤器与Servlet十分相似,在创建之后同样需要对其进行配置。Servlet3.0中提供了采用注解的方式配置过滤器,其具体实现方法比较简单,只需要在创建类的代码上方采用以下语法格式进行配置就可以。
代码语言:javascript复制import javax.servlet.Eilter;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
@WebFilter(filterName="DemoFilter",
urlPatters={"/*"},
initParans={
@WebInitParam(name="mood",value="awake")})
public class DemoFilter implements Filter{
...
}
- filterName属性:用于指定Servlet过滤器名。
- urlPatterns属性:用于指定哪些URL应用该过滤器。如果指定所有页面均应用该过滤器,可以设置该属性值为“ * ”。
- initParams属性:用于指定初始化参数。
4.Servlet监听器
1.Servlet监听器简介
监听器的作用是监听Web容器的有效期事件,因此它是有容器管理的。利用Listener接口监听在容器中的某个执行程序,并根据其应用程序的需求做出适当的适应。
Listener接口 | Event类 |
---|---|
ServletContextListener | ServletContextEvent |
ServletContextAttributeListener | ServletContextAttributeEvent |
HttpSessionListener | HttpSessionEvent |
HttpSessionActivationListener | HttpSessionEvent |
HttpSessionAttributeListener | HttpSessionBindingEvent |
HttpSessionBindingListener | HttpSessionBindingEvent |
ServletRequestListener | ServletRequestEvent |
ServletRequestAttributeListener | ServletRequestAttributeEvent |
2.Servlet监听器的原理
Servlet监听器的功能比较接近Java的GUI程序的监听器,可以监听由于Web应用中状态改变而引起的Servlet容器产生的相应事件,然后接受并处理这些事件。
3.Servlet上下文监听
Servlet上下文监听可以监听ServletContext对象的创建、删除以及属性添加、删除和修改操作。该监听器需要用到以下两个接口: 1.ServletContextListener接口 该接口存放在javax.servlet包内,主要监听ServletContext的创建和删除。其有两个方法:
contextInitialized(ServletContextEvent event)
方法:通知正在收听的对象应用程序已经被加载及初始化。contextDestroyed(ServletContextEvent event)
方法:通知正在收听的对象应用程序已经被卸载即关闭。
2.ServletAttributeListener接口 该接口存放在javax.servlet包内,主要监听ServletContext属性的增加、删除、修改。其有三个方法:
attributeAdded(ServletContextAttributeEvent event)
方法:当有对象加入Application的范围时,通知正在收听的对象。attributeReplaced(ServletContextAttributeEvent event)
方法:当在Application的范围有对象取代另一个对象时,通知正在收听的对象。attributeRemoved(ServletContextAttributeEvent event)
方法:当有对象从Application的范围移除时,通知正在收听的对象。
4.HTTP会话监听
HTTP会话监听(HttpSession)主要用于监听信息,有4个接口可以进行监听。
1.HttpSessionListener接口
HttpSessionListener接口用于监听HTTP会话的创建、销毁,他提供了以下两个方法:
sessionCreated(HttpSessionEvent event)
方法:通知正在收听的对象session已经被加载及初始化。sessionDestroyed(HttpSessionEvent event)
方法:通知正在收听的对象session已经被载出。
说明:HttpSessionEvent类的主要方法是getSession()
,可以使用该方法回传一个session对象。
2.HttpSessionActivationListener接口
HttpSessionActivationListener接口用于监听HTTP会话active、passivate的情况,他提供了以下3个方法:
attributeAdded(HttpSessionBindingEvent event)
方法:当有对象加入到session的范围时通知正在收听的对象。attributeReplaced(HttpSessionBindingEvent event)
方法:当在session的范围有对象取代另一个对象时,通知正在收听的对象。attributeRemoved(HttpSessionBindingEvent event)
方法:当有对象从session的范围移除时,通知正在收听的对象。
说明:HttpSessionBindingEvent类主要有3个方法:getName()、getSession()、getValues()
。
3.HttpBindingListener接口
HttpBindingListener接口用于指定监听HTTP会话中对象的绑定信息。他是唯一一个不需要再web.xml中设定的Listener的。HttpBindingListener接口提供以下两个方法:
valueBound(HttpSessionBindingEvent event)
方法:当有对象加入session的范围时会被自动调用。valueUnBound(HttpSessionBindingEvent event)
方法:当有对象从session的范围内移除时会被自动调用。
4.HttpSessionAttributeListener接口
HttpSessionAttributeListener接口用于监听HTTP会话中属性的设置请求,他提供了以下两种方法。
- sessionDidActivate(HttpSessionEvent event)方法:通知正在收听的对象,它的session已经变为有效状态。
- sessionWillPassivate(HttpSessionEvent event)方法:通知正在收听的对象,它的session已经变为无效状态。
5.Servlet请求监听
1.ServletRequestListener接口
ServletRequestListener接口提供以下两种方法。
- requestInitalized(ServletRequestEvent event)方法:通知正在收听的对象,ServletRequest已经被加载及初始化。
- requestDestroyed(ServletRequestEvent event)方法:通知正在收听的对象,ServletRequest已经被载出,即关闭。
2.ServletRequestAttributeListener接口
ServletRequestAttributeListener接口提供了以下3个方法:
- attributeAdded(ServletRequestAttributeEvent event)方法:当有对象加入request的范围时通知正在收听的对象。
- attributeReplaced(ServletRequestAttributeEvent event)方法:当在request的范围内有对象取代另一个对象时通知正在收听的对象。
- attributeRemoved(ServletRequestAttributeEvent event)方法:当有对象从request的范围移除时通知正在收听的对象。