Servlet是一种独立于平台和协议的服务器端的Java技术,他使用Java语言编写,可以用来生成动态的Web页面。
Servlet对象、ServletConfig对象与Serializable对象是接口对象,其中Serializable是java.io包中的序列化接口,Servlet对象、ServletConfig对象是javax.servlet包中定义的对象,这两个对象定义了Servlet的基本方法并封装了Servlet的相关配置信息。GenericServlet对象是一个抽象类,他分别实现了上述的3个接口,此对象为Servlet接口及ServletConfig接口提供了部分实现,但他并没有对HTTP请求处理进行实现,这一操作由它的子类HttpServlet进行实现。这个对象为HTTP请求中的POST\GET等类型提供了具体的操作方法,所以通常情况下,我们所编写的Servlet对象都继承于HttpServlet,在开发之中所使用的具体的Servlet对象就是HttpServlet对象,因为HttpServlet对Servlet做出了实现,并提供了HTTP请求的处理方法。
Servlet主要应用于B/S接口的开发中,B/S结构指浏览器与服务器的网络开发模式。在这一模式中,Servlet充当一个请求控制处理的角色,当浏览器发送一个请求时,由Servlet进行接收并对其进行相应的业务逻辑处理,最后对浏览器做出回应,可见Servlet的重要性。
配置的目的是将创建的Servlet注册到Servlet容器之中,以方便Servlet容器对Servlet的调用。在Servlet3.0之后,除了可以在web.xml文件中配置外,还可以利用注解来配置Servlet。 (1)在web.xml文件中配置com.mingrisoft包中的FirstServlet。 具体代码如下:
<!--注册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。 具体代码如下:
import javax.servlet.annotation.WebServlet;
@WebServlet("/FirstServlet")
public class FirstServlet extends HttpServlet{
......
}
在Servlet中实现页面转发主要是利用RequestDispatcher接口实现的。RequestDispatcher接口可以把一个请求转发到另一个JSP页面。该接口包括以下两个方法。
requestDispather.forward(HttpServletRequest request,
HttpServletResponse response);
requestDispatcher.include(HttpServletRequest request,
HttpServletResponse response);
例:应用Servlet处理表单提交的数据。 (1)编写index.jsp页面,在该页面中添加用于收集留言信息的表单集表单元素。 具体代码如下:
<%@ 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()方法中获取表单数据并输出。 其具体代码如下:
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();
}
}
过滤器的实质是在web应用服务器上的一个web应用组件,用于拦截客户端与目标文件的请求,并对这些请求进行一定的过滤处理再发送给目标资源。过滤器的处理方式如下图所示:
过滤器对象放置在javax.servlet包中,其名称为Filter,它是一个接口。除这个接口外,与过滤器相关的对象还有FilterConfig对象与FilterChain对象。这两个对象也同样是接口对象,位于javax.servlet包中,分别是过滤器的配置对象和过滤器的传递工具。
方法声明 | 说明 |
---|---|
public void init(FilterConfig filterConfig) throws ServletException | 过滤器初始化方法,此方法在过滤器初始化时调用 |
public void doFilter(ServletRequest request,ServletResponse reponse,FilterChain chain)throws IOException,ServletException | 对请求进行过滤处理 |
public void destroy() | 销毁方法,以便释放资源 |
方法声明 | 说明 |
---|---|
public String getFilterName() | 用于获取过滤器的名字 |
public ServletContext getServletContext() | 获取Servlet上下文 |
public String getInitParameter(String name) | 获取过滤器的初始化参数值 |
public Enumeration getInitParameterName() | 获取过滤器的所有初始化参数 |
public void doFilter(ServletRequest request,
ServletResponse response)
throws IOException,ServletException
该方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器已经是过滤器链中的最后一个过滤器,那么请求将传递给目标资源。
过滤器与Servlet十分相似,在创建之后同样需要对其进行配置。Servlet3.0中提供了采用注解的方式配置过滤器,其具体实现方法比较简单,只需要在创建类的代码上方采用以下语法格式进行配置就可以。
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{
...
}
监听器的作用是监听Web容器的有效期事件,因此它是有容器管理的。利用Listener接口监听在容器中的某个执行程序,并根据其应用程序的需求做出适当的适应。
Listener接口 | Event类 |
---|---|
ServletContextListener | ServletContextEvent |
ServletContextAttributeListener | ServletContextAttributeEvent |
HttpSessionListener | HttpSessionEvent |
HttpSessionActivationListener | HttpSessionEvent |
HttpSessionAttributeListener | HttpSessionBindingEvent |
HttpSessionBindingListener | HttpSessionBindingEvent |
ServletRequestListener | ServletRequestEvent |
ServletRequestAttributeListener | ServletRequestAttributeEvent |
Servlet监听器的功能比较接近Java的GUI程序的监听器,可以监听由于Web应用中状态改变而引起的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的范围移除时,通知正在收听的对象。HTTP会话监听(HttpSession)主要用于监听信息,有4个接口可以进行监听。
HttpSessionListener接口用于监听HTTP会话的创建、销毁,他提供了以下两个方法:
sessionCreated(HttpSessionEvent event)
方法:通知正在收听的对象session已经被加载及初始化。sessionDestroyed(HttpSessionEvent event)
方法:通知正在收听的对象session已经被载出。说明:HttpSessionEvent类的主要方法是getSession()
,可以使用该方法回传一个session对象。
HttpSessionActivationListener接口用于监听HTTP会话active、passivate的情况,他提供了以下3个方法:
attributeAdded(HttpSessionBindingEvent event)
方法:当有对象加入到session的范围时通知正在收听的对象。attributeReplaced(HttpSessionBindingEvent event)
方法:当在session的范围有对象取代另一个对象时,通知正在收听的对象。attributeRemoved(HttpSessionBindingEvent event)
方法:当有对象从session的范围移除时,通知正在收听的对象。说明:HttpSessionBindingEvent类主要有3个方法:getName()、getSession()、getValues()
。
HttpBindingListener接口用于指定监听HTTP会话中对象的绑定信息。他是唯一一个不需要再web.xml中设定的Listener的。HttpBindingListener接口提供以下两个方法:
valueBound(HttpSessionBindingEvent event)
方法:当有对象加入session的范围时会被自动调用。valueUnBound(HttpSessionBindingEvent event)
方法:当有对象从session的范围内移除时会被自动调用。HttpSessionAttributeListener接口用于监听HTTP会话中属性的设置请求,他提供了以下两种方法。
ServletRequestListener接口提供以下两种方法。
ServletRequestAttributeListener接口提供了以下3个方法: