Servlet技术

2020-08-27 17:50:14 浏览数 (1)

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。 其语法格式如下:
代码语言:javascript复制
requestDispather.forward(HttpServletRequest request,
					HttpServletResponse response);
  • include()方法 include()方法用于把服务器上的另一个资源(Servlet、JSP、HTML)包含到响应中。 其语法格式如下:
代码语言:javascript复制
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">
	留&nbsp;言&nbsp;人:
	<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="提交"/>&nbsp;
	<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容器实现,这个接口只有一个方法,其语法声明如下:
代码语言:javascript复制
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的范围移除时通知正在收听的对象。

0 人点赞