`

Servlet

    博客分类:
  • Java
阅读更多

 

一、认识 Servlet

         Servlet :服务器端小程序,是 Java 实现的 CGI( 通用网管接口程序 ) ,但是与传统的 CGI 不同的是, Servlet 程序采用的是多线程的处理方式,而传统的 CGI 是使用多线程的处理方式,所以 Servlet 要比传统的 CGI 快。

         所有的 Servlet 程序必须放在 WEB 目录中执行,依靠 WEB 容器执行

         Servlet 本身就是一个类。本身不需要由主方法调用执行

         Servlet JavaBean 一样必须保存在 WEB-INF/classes 目录之中

         一个类必须继承 HttpServlet ,那么此类才称为是一个 Servlet 程序

         Servlet 程序必须放在一个包中。

 

在开发时,需要配置其环境变量,通过分析 Tomcat 的执行流程: *.jsp--->*.java--->*.class 文件,可以发现 Tomcat 中有需要的扩展包“ D:\apache-tomcat-6.0.33-windows-x64\lib\servlet-api.jar , 所以我们可以把这个 jar 包拷贝到 JDK 的编译环境下“ D:\Program Files\Java\jre6\lib\ext ”,此文件夹表示的是存放所有的扩展文件。

         前面我们说了,一个 Servlet 程序本身是不能直接使用主方法调用的,必须放在 WEB 容器中执行, WEN-INF WEB 目录中最安全的文件夹,所以外部肯定无法执行访问,所以,如果想让一个 Servlet 程序可以正常使用,则必须在 web.xml 中配置( Eclipse 中创建 Servlet 会自动在 web.xml 中配置)。

 

二、 Servlet 生命周期:

装载 --> 创建 --> 初始化 --> 服务(多次执行) --> 销毁 --> 卸载

上面的周期对于 Servlet 本身只会关心初始化、服务、销毁三个操作。

         1 、初始化:正常情况下只有一次初始化,但是如果一个 Servlet 长时间不使用之后又再次使用,则会重新初始化;

public void init(ServletConfig config) throws ServletException//可以取得初始化参数
public void init() throw ServletException//如果不需要取得初始化参数的话则使用此方法

 

 

2 、服务:一个 Servlet 肯定会服务多次,如果一个 Servlet 长时间不服务,则认为没用了,等待销毁;

public void service(ServletRequest req,ServletResponse res) throws ServletException,
java.io.IOException
//一般不会直接直接覆写此方法,而是覆写:
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
		throws ServletException, IOException {}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {}

 

3 、销毁:正常情况下也只有一次,容器关闭时销毁,当然,如果一个 Servlet 长时间不使用,则也会被自动销毁;

注:

         ·如果现在存在两个初始化方法,则肯定先使用存在 ServletConfig 对象的初始化方法,因为要取得初始化参数。

         ·默认情况下,一个 Servlet 只在第一次运行的时候初始化,也可以经过配置,让其在容器启动的时候就可以进行初始化操作,修改 web.xml 即可

<load-on-startup>1</load-on-startup>
 

 

         Servlet doGet doPost 方法定义里可以发现, doGet doPost 本身就直接存在 request response 对象,所以我们需要关心的只是如何取得 session application 对象即可。

HttpSession session= request.getSession() ServletContext application=this.getServletContext();

这里还会涉及到一个服务器端跳转和客户端跳转,简单理解是服务器端跳转地址栏内容不变,可以通过 request.getRequestDispatcher("success.jsp").forward(request,response) 实现,可以传递 request 范围值,而客户端跳转则相反,并且通过 response.sendRedirect("fail.jsp") ,详细的可以看 Get Post ,客户端跳转与服务器端跳转

 

 

我们知道 JSP 可以完成的功能 Servlet 都可以完成,但是 Servlet 有一些功能是 JSP 无法完成的,因为 Servlet 在使用的时候分为三种:

                   ·普通 Servlet :引申出来就是 MVC 设计模式: JSP+Servlet+JavaBean

                   ·过滤 Servlet :过滤器

                   ·监听 Servlet :监听器

 

三、过滤器

         如何一个程序要想实现过滤器,则直接实现 Filter 接口即可,此接口中存在:初始化、过滤、销毁三个方法。

         过滤器技术是 Servlet2.3 规范中新增的功能,它与 Servlet 有点类似,都可以通过配置截获和处理特定的 HTTP 请求与响应。

         过滤器与 Servlet 的区别在于通常 Servlet 是面向功能的用于充当控制器对单一请求进行处理,而过滤器是面向资源的,它对某一类资源的请求进行统一处理。过滤器可以在请求到达资源之前和响应返回用户前进行加工处理,也就是说它可以在用户请求被响应资源( JSP Servlet )处理前、处理后动态的修改 Request Response 对象。

其适用场景:

         1 、字符编码过滤

                   在用户请求被 Servlet 处理前,设置 Request 的字符编码以解决乱码问题;

         2 、用户登陆与权限控制

                   用户请求到达资源前判断用户是否登陆( Session , 是否对资源有权限,如果没有则请求重定位到登陆或出错页;

         3 、统一缓存控制

                   对某类资源如图片文件夹、 CSS 文件夹下的资源请求在 Response 响应头上添加缓存有效期设置,对经常变化的页面如首页、新闻在 Response

         4 、资源保护

范例:字符编码过滤 CharsetFilter.java

package org.lxh.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharsetFilter implements Filter {
	private String charset;
    	public CharsetFilter() {
   	 }
	public void destroy() {
	}
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding(charset);
		
		chain.doFilter(request, response);//如果存在多个过滤器,这里的chain就是用来传递到下一个的,这里的FilterChain表示一个过滤链,它就表示放行,而此类中存在一个doFilter方法,表示将请求转送到目的地。过滤器要执行两次,FilterChain之前执行一次,之后在执行一次
	}
	public void init(FilterConfig fConfig) throws ServletException {
		charset = fConfig.getInitParameter("charset");//读取web.xml中的配置文件下的参数值
	}

}
 

web.xml

<filter>
    <display-name>CharFilter</display-name>
    <filter-name>CharFilter</filter-name>
    <filter-class> org.lxh.util.CharsetFilter</filter-class>
    <init-param>
      <description>charset</description>
      <param-name>charset</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 

此时过滤器的映射路径“ /* ”表示对一切的请求进行过滤,从根目录下开始过滤。

 

范例 2 ,判断权限 UserFilter.java

package com.theone.control;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

/**
 * Servlet Filter implementation class UserFilter
 */
public class UserFilter implements Filter {
	
	private static Logger logger=Logger.getLogger(UserFilter.class);
    /**
     * Default constructor. 
     */
    public UserFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest requ, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request=(HttpServletRequest)requ;
		HttpServletResponse response=(HttpServletResponse)res;
		HttpSession session=request.getSession();
		if(session.getAttribute("user")==null){
			logger.info("不能访问此页面");
			//response.sendRedirect(request.getContextPath()+"/login.jsp");
			java.io.PrintWriter out = response.getWriter();  
		    out.println("<html>");  
		    out.println("<script>");  
		    out.println("window.open ('"+request.getContextPath()+"/login.jsp','_top')");  
		    out.println("</script>");  
		    out.println("</html>");  
			return;
		}
		// place your code here

		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

 

web.xml

<filter>
    <display-name>UserFilter</display-name>
    <filter-name>UserFilter</filter-name>
    <filter-class>com.theone.control.UserFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>UserFilter</filter-name>
    <url-pattern>/servlet/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>UserFilter</filter-name>
    <url-pattern>/page/*</url-pattern>
  </filter-mapping>
 

 

这里指定过滤 page 下的,一般在过滤操作中,除了编码过滤可以指定“ /* ”之外,大部分的过滤都要求指定一个具体的文件夹。

 

从上面我们可以简单总结出来过滤器的使用比 Servlet 要简单一些,是以一种组件的形式插入到程序之中的,是通过 web.xml 进行配置,只要实现 Filter 接口就可以完成过滤器操作。

 

四、监听器

         监听整个 WEB 容器的运行环境,譬如:服务器启动,服务器关闭 or 有新用户来了,在整个 WEB 中监听主要分为以下两种:对上下文和 session 监听。

1 ServletContextListener: 对一个应用进行全局监听 . 随应用启动而启动 , 随应用消失而消失主要有两个方法 :

· contextDestroyed(ServletContextEvent event) :在应用关闭的时候调用

· contextInitialized(ServletContextEvent event) :在应用启动的时候调用

2 HttpSessionListener: 这个监听器主要监听一个 Session 对象被生成和销毁时发生的事件 . 对应有两个方法 :

· public void sessionCreated(HttpSessionEvent se)

· public void sessionDestroyed(HttpSessionEvent se)

 

一般来说 , 一个 session 对象被 create , 可以说明有一个新客端进入 . 可以用来粗略统计在线人数 , 注意这不是精确的 , 因为这个客户端可能立即就关闭了 , sessionDestroyed 方法却会按一定 的策略很久以后才会发生。

事件监听器可用于:

·当部署或者关闭 web 应用时,管理数据库链接或外部资源

·实现计数器

·监测 HTTPSession 的状态和属性

 

范例: AppStatuListener.java

package org.lxh.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.apache.log4j.Logger;
public class AppStatuListener implements ServletContextListener,
		HttpSessionListener, ServletRequestListener {
	public int sessionNumber;
	public int requestNumber;
	public Date appStartTime;
	public static AppStatuListener instance;
	public static Logger logger = Logger.getLogger(AppStatuListener.class.getName());

	public String getAppStartTime() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
		return sdf.format(appStartTime);
	}
	public String getAppStartedTime() {
		long mils = System.currentTimeMillis() - appStartTime.getTime();
		long s = mils / 1000 % 60;
		long m = mils / 1000 / 60 % 60;
		long h = mils / 1000 / 60 / 24;
		return h + "小时" + m + "分" + s + "秒";
	}
	public int getSessionNumber() {
		return sessionNumber;
	}
	public int getRequestNumber() {
		logger.info("发送了一个请求!");
		return requestNumber;
	}
	public static AppStatuListener getInstance() {
		return instance;
	}
	public AppStatuListener() {
		instance = this;
	}

	public void requestDestroyed(ServletRequestEvent arg0) {

	}
	/**
	 *应用程序启动
	 * @see ServletContextListener#contextInitialized(ServletContextEvent)
	 */
	public void contextInitialized(ServletContextEvent arg0) {
		appStartTime = new Date();
	}
	public void sessionCreated(HttpSessionEvent arg0) {
		sessionNumber++;
	}
	public void sessionDestroyed(HttpSessionEvent arg0) {
		sessionNumber--;
	}
	/**
	 * 请用程序销毁
	 * @see ServletContextListener#contextDestroyed(ServletContextEvent)
	 */
	public void contextDestroyed(ServletContextEvent arg0) {
		
	}
	public void requestInitialized(ServletRequestEvent arg0) {
		requestNumber++;
	}

}

 

web.xml

  <listener>
  	<listener-class>org.lxh.util.AppStatuListener</listener-class>
  </listener>

 

可以发现监听器的配置比过滤器和简单 Servlet 都容易,而且在一个项目中,如果同时出现了过滤器、监听器、简单的 Servlet ,则 web.xml 中的配置顺序如下:

<filter><filter-mapping>

<listener>

<servlet><servlet-mapping>

如果要配置 Session 超时,则在 web.xml 文件中添加:

<session-config>
  	<session-timeout>1</session-timeout>
  </session-config>

 

 

 

 

分享到:
评论

相关推荐

    Java用注解的方式定义一个Servlet

    用注解的方式定义一个Servlet,就不用在web.xml中配置了。Servlet的访问URL是Servlet的必选属性,可以选择使用urlPatterns或者value定义。  像上面的AnnotationServlet可以描述成@WebServlet(name="Annotation...

    jakarta.servlet-api-4.0.4-API文档-中英对照版.zip

    赠送jar包:jakarta.servlet-api-4.0.4.jar; 赠送原API文档:jakarta.servlet-api-4.0.4-javadoc.jar; 赠送源代码:jakarta.servlet-api-4.0.4-sources.jar; 赠送Maven依赖信息文件:jakarta.servlet-api-4.0.4....

    javax.servlet.jar下载

    Files contained in javax.servlet.jar: META-INF/MANIFEST.MF javax/servlet/http/LocalStrings.properties javax.servlet.http.HttpSessionBindingListener.class javax.servlet....

    jakarta.servlet-api-4.0.4-API文档-中文版.zip

    赠送jar包:jakarta.servlet-api-4.0.4.jar; 赠送原API文档:jakarta.servlet-api-4.0.4-javadoc.jar; 赠送源代码:jakarta.servlet-api-4.0.4-sources.jar; 赠送Maven依赖信息文件:jakarta.servlet-api-4.0.4....

    基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统

    基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍...

    javax.servlet-api-4.0.0-API文档-中文版.zip

    赠送jar包:javax.servlet-api-4.0.0.jar; 赠送原API文档:javax.servlet-api-4.0.0-javadoc.jar; 赠送源代码:javax.servlet-api-4.0.0-sources.jar; 赠送Maven依赖信息文件:javax.servlet-api-4.0.0.pom; ...

    servlet-api。jar

    SERVLET

    javax.servlet jar包---解决找不到javax.servlet.*等问题

    javax.servlet的jar包,解决找不到javax.servlet.*等问题的!欢迎下载!!

    jersey-container-servlet-core-2.22.2-API文档-中文版.zip

    赠送jar包:jersey-container-servlet-core-2.22.2.jar; 赠送原API文档:jersey-container-servlet-core-2.22.2-javadoc.jar; 赠送源代码:jersey-container-servlet-core-2.22.2-sources.jar; 赠送Maven依赖信息...

    javax.servlet-api-4.0.1-API文档-中英对照版.zip

    赠送jar包:javax.servlet-api-4.0.1.jar; 赠送原API文档:javax.servlet-api-4.0.1-javadoc.jar; 赠送源代码:javax.servlet-api-4.0.1-sources.jar; 赠送Maven依赖信息文件:javax.servlet-api-4.0.1.pom; ...

    servlet 8个最基础demo

    我们老师教学演示的servlet例子 从简单到难文件夹有八个demo供初学者学习 servlet01 servlet02 servlet03 servlet04 servlet05 servlet06 servlet07 servlet08 servlet是在服务器上运行的小程序。这个词是在Java ...

    javax.servlet-3.0.0.v201112011016-API文档-中文版.zip

    赠送jar包:javax.servlet-3.0.0.v201112011016.jar; 赠送原API文档:javax.servlet-3.0.0.v201112011016-javadoc.jar; 赠送源代码:javax.servlet-3.0.0.v201112011016-sources.jar; 赠送Maven依赖信息文件:...

    servlet基础与servlet容器模型

    servlet基础与servlet容器模型

    servlet-api.jar

    servlet.jar ,Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。 使用 Servlet,您可以收集来自网页...

    javax.servlet 的JAR包

    javax.servlet JAR包,解决找不到 import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; jar包问题

    利用servlet技术实现一个简单的聊天室

    实验1: 利用servlet实现一个简单的聊天室 实验目的 (1) 理解servlet的工作原理 (2) 掌握servlet编程基本技能 实验内容及要求 1. 利用servlet技术实现一个简单的聊天室,实现多人同时交流。当发送聊天信息时,信息...

    Servlet项目实践 实现学生信息系统的全部代码

    Servlet项目实践 实现学生信息系统的全部代码 一、Servlet简介  Servlet是sun公司提供的一门用于开发动态web资源的技术。  Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java...

    servlet文档API中文版

    这是一份关于2.1版Java Servlet API的说明文档,作为对这本文档的补充。 1.2 谁需要读这份文档 这份文档描述了Java Servlet API的最新版本2.1版。所以,这本书对于Servlet的开发者及servlet引擎的开发者同样...

    用于servlet程序的开发的servlet-jar包

    servlet.jar.zip用于servlet程序的开发

    servlet api servlet api

    servlet apiservlet apiservlet apiservlet api

Global site tag (gtag.js) - Google Analytics