- 浏览: 663224 次
- 性别:
- 来自: 安徽
文章分类
- 全部博客 (252)
- Html/Div+CSS (12)
- Js/Jquery (34)
- Flex (2)
- Ajax (3)
- Java (35)
- C# (15)
- Spring (16)
- Hibernate (13)
- Struts2 (12)
- Struts1 (7)
- DWR (1)
- iBatis/myBatis (9)
- Tag(JSTL、EL) (1)
- Android (44)
- SQL (7)
- SEO (7)
- Exception (3)
- Tool (10)
- Other (3)
- WebService (9)
- Apache (7)
- Ext (0)
- Utils (12)
- thinking in programme (2)
- Hadoop (0)
- ActiveMQ (0)
- HTML5/CSS3 (0)
- WPF (1)
- NodeJs (1)
- 设计模式 (0)
- 程序人生 (1)
- 随笔 (1)
- Linux (1)
- Load Balance (0)
最新评论
-
drinkjava2:
太复杂了而且不通用,利用ThreadLocal可完美解决这一问 ...
JDBC的多条件动态查询 -
u013107014:
multipartRequest.getFiles(" ...
多文件上传 by MultipartFile and Multiple -
liyys:
可惜没讲你mysql数据库的表的设计
iBatis入门 -
Mapple_leave:
效果还是挺不错的,谢谢了。
中文简体与繁体的转换 -
arcpad:
JS禁用浏览器退格键
一、认识 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>
发表评论
-
log4j xml配置详解
2014-06-18 10:37 1099<?xml version="1.0&qu ... -
test
2013-07-29 09:16 0private static CacheImpl insta ... -
多文件上传 by MultipartFile and Multiple
2012-12-03 09:13 14297最近的一个项目中,需要用到 ... -
布局框架-SiteMesh
2012-11-30 08:57 2545最近在一个项目中使用 ... -
连接池
2012-12-10 08:42 1396... -
忆Java String
2012-11-15 08:38 1222平时 .NET 写多了, Java ... -
Eclipse中右键快速定位文件资源的工具
2012-11-09 08:43 1951当你开发.NET项目后,使用VS习惯了再来使用Java和Ecl ... -
Java中MessageFormat对象实现格式化字符串输出,类似C#中的string.format方法
2012-09-29 11:39 3624平时.NET做多了,再做Java时,总会进行一些比较,比如说J ... -
byte[]与InputStream互转
2012-09-29 11:39 1529InputStream转byte[] private ... -
统一中英文长度问题
2012-07-20 00:17 1894最近因为在做一个项目要求很多都是英文,所以这就涉及到在页 ... -
Java中Process的waitFor()阻塞问题
2012-07-21 01:00 8845在做视频转换时,调用外部的 exe 去进行一些视频 ... -
Tomcat注册成系统服务
2012-07-17 00:00 1514为了部署项目后不出现黑色的 doc 命令框,所以很 ... -
urlrewrite实现伪静态化
2012-07-25 00:41 3174产生背景 静态网页与动态网页比较: ... -
Java中java.util.Date时间和java.sql.Date时间的相互转化
2012-01-30 22:49 2908刚刚写用 JS 禁用退格键时( http ... -
使用BeanUtils类简化request和resultset转换
2012-01-21 20:23 2888当提交表单时,如果没有使用Struts等框架的话,你的代 ... -
JDBC的多条件动态查询
2012-01-19 11:05 7100前面我已经提到了现在的项目无非就是列表里的分页加多条件查 ... -
JDBC分页
2012-01-19 10:15 5473不知道大家做项目做到最后有什么感觉没有,其实大家做来做去 ... -
Java农历(阴历)工具类
2012-01-20 11:30 2302在真实的项目开发中会可能会遇到项目需要对阴历即我们所说的农历节 ... -
Eclipse中java项目引用dll库的路径设置(System.loadLibrary()调用Dll路径问题)
2012-01-16 14:13 4202右击项目名|选择属性properties|在左边列表内选择“J ... -
联系人导出(msn、邮箱)
2012-01-16 11:48 8308在项目开发中,不知道大家有没有涉及到导出邮箱或msn的联系人( ...
相关推荐
用注解的方式定义一个Servlet,就不用在web.xml中配置了。Servlet的访问URL是Servlet的必选属性,可以选择使用urlPatterns或者value定义。 像上面的AnnotationServlet可以描述成@WebServlet(name="Annotation...
赠送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....
Files contained in javax.servlet.jar: META-INF/MANIFEST.MF javax/servlet/http/LocalStrings.properties javax.servlet.http.HttpSessionBindingListener.class javax.servlet....
赠送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 学生宿舍...
赠送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
javax.servlet的jar包,解决找不到javax.servlet.*等问题的!欢迎下载!!
赠送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依赖信息...
赠送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例子 从简单到难文件夹有八个demo供初学者学习 servlet01 servlet02 servlet03 servlet04 servlet05 servlet06 servlet07 servlet08 servlet是在服务器上运行的小程序。这个词是在Java ...
赠送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.jar ,Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。 使用 Servlet,您可以收集来自网页...
javax.servlet JAR包,解决找不到 import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; jar包问题
实验1: 利用servlet实现一个简单的聊天室 实验目的 (1) 理解servlet的工作原理 (2) 掌握servlet编程基本技能 实验内容及要求 1. 利用servlet技术实现一个简单的聊天室,实现多人同时交流。当发送聊天信息时,信息...
Servlet项目实践 实现学生信息系统的全部代码 一、Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术。 Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java...
这是一份关于2.1版Java Servlet API的说明文档,作为对这本文档的补充。 1.2 谁需要读这份文档 这份文档描述了Java Servlet API的最新版本2.1版。所以,这本书对于Servlet的开发者及servlet引擎的开发者同样...
servlet.jar.zip用于servlet程序的开发
servlet apiservlet apiservlet apiservlet api