Web资源:web组件,静态web文件如图片

Web程序:可发布的Web资源集合

 

Web程序根目录下有个web-inf文件夹,如果只有jsp和静态资源,里面可以没有web.xml

根目录下可以直接放东西,也可以新建自定义目录

 

自动部署功能在开发完上线后要记得关闭,负责一自动重新部署,所有会话将失效

 

包javax.servlet和javax.servlet.http提供了servlet的接口和类
所有的servlet类都必须实现servlet接口,它定义了servlet的生命周期

父类可以是GenericServlet类或HttpServlet类

Web容器控制着Servlet的生命周期,当请求调用某个Servlet时
找到这个类,实例化,init()初始化,都只有一次
调用service(),传递request和response,可以反复
最后调用destroy(),一次

在生命周期中某些事件发生时,可以绑定一些监听器做一些处理
可以监听ServletContext,Session,Request

可以指定某个具体异常到某个页面处理

Web组件之间共享信息可以通过私有的javaBean属性,公开的域对象的属性,干脆数据库,或者其他Web资源

域对象有四种:
Javax.servlet.ServletContext
Javax.servlet.http.HttpSession
javax.servlet.ServletRequest的子类
Javax.servlet.jsp.PageContext

服务器总是要处理并发的情形,Servlet默认不是线程安全的,要自己编程处理

service()方法对于HttpServlet来说是通过doMethod()实现的
通常来说都是接受request,进行一些处理,产生response
对于HttpServlet,要求首先response一个头部,然后是具体内容

所有的request都实现了ServletRequest接口,它定义了参数,属性,协议信息和本地化信息
可以用request的getReader或getInputStream手动处理信息
对于HttpServlet则是一个HttpServletRequest对象,还包括URL,头部信息,查询串等等

所有的response都实现了ServletResponse接口
可以用getWriter或getOutputStream手动输出信息
HttpServletResponse还包括状态码和Cookie信息等

过滤器可以对requeset和response过滤,当然都包括头部和内容
过滤器本身并不产生response,它总是依赖于其他的Web资源
每个Web资源可以有0或多个filter,这个filterchain在Web资源被实例化的时候会被确定

Filter,FilterChain及FilterConfig接口定义在javax.servlet包中
通过实现Filter接口定义一个filter,doFilter()方法传递request,response,filterchain
filterchain的前面是n个filter,最后面是那个Web资源,会依次往后传递
不调用doFilter()也就是请求被拒绝

另外filter也有int()和destroy()
filter可以有初始参数,会通过FilterConfig对象传递到init()方法,整个filter中都可使用

filter要想修改response必须在response发送到客户端前截获它
可以传递一个标准输入流来包装response,然后那个Servlet会被阻塞
现在可以实现自己的response了
修改request同理

filter-mapping默认只会过滤request,也就是客户端发来的URL
自己内部的forward,include,errorpage不会过滤
/* 表示对所有URL都过滤
一个filter可以映射到多个web资源,一个web资源也可以映射多个filter

通过getRequestDispatcher("URL")来获得一个RequestDispatcher对象进行include或forward
可以从request调用,也可以从ServletContext调用
不同的是,request得到的可以不用/开头,ServletContext得到的要用/开头
他俩都是相对于/myWeb/根路径的
但如果URL不对的话,RequestDispatcher对象会是null,编程时要判断下

被include的web资源不能更改原来页面的头部

如果已经想用ServletOutputStream 或 PrintWriter对象输出了,再调用forward会报错
之前的那个request会作为forward之后的那个页面的request的一些属性存在

属性名为:javax.servlet.forward.[request-uri|context-path|servlet-path|path-info|query-string]

Enumeration a = req.getAttributeNames();
while(a!=null&&a.hasMoreElements()){//得到转发前的request
Object nextElement = a.nextElement();
System.out.println(nextElement+"\t"+req.getAttribute((String)nextElement));
}
System.out.println("\n");

 

request.getSession()可以得到HttpSession对象,可以附加各种属性供会话调用
客户端无法通知一个session结束,只能设置几分钟后自动过期
调用session的某个方法会让这个时间重置,所以是闲置时间
不过服务器端可以调用invalidate()让会话失效,并删除session数据

要想使用session跟踪,要调用resoonse.encodeURL(URL)方法
当cookie不可用时,会自动将sessionId添加到url后面
通常这么写,response.encodeURL(request.getContextPath()+”/catalog”);

调用destroy()也不会立即终止Servlet执行,但等待一定时间后会即刻终止
用以下措施来保证destroy时所有services都已结束:
1.

publicclassShutdownExampleextendsHttpServlet{
privateintserviceCounter=0;//设置一个字段,表示正有几个线程调用该servlet
...
//有线程进入和退出时进行记录
protected synchronized void enteringServiceMethod(){
serviceCounter++;
}
protected synchronized void leavingServiceMethod(){
serviceCounter--;
}
protected synchronized int numServices(){
returnserviceCounter;
}
}
protected void service(HttpServletRequestreq,
HttpServletResponseresp)
throwsServletException,IOException{
enteringServiceMethod();
try{
super.service(req,resp);
}finally{
leavingServiceMethod();
}
}

2.还在调用service时,资源就被destroy了,那当然不行

public class ShutdownExample extends HttpServlet{
private boolean shuttingDown;
...
//同步方法来访问
protectedsynchronizedvoidsetShuttingDown(booleanflag){
shuttingDown=flag;
}
protectedsynchronizedbooleanisShuttingDown(){
returnshuttingDown;
}
}
public void destroy(){
//还有线程在使用的话,通知其要关闭了
if(numServices()>0){
setShuttingDown(true);
}
/*等待service关闭.*/
while(numServices()>0){
try{
Thread.sleep(interval);
}catch(InterruptedExceptione){
}
}
}

3.需要长时间执行的方法要经常判断该servlet是否要关闭了

public void doPost(...){
...
for(i=0;((i<lotsOfStuffToDo)&&
!isShuttingDown());i++){
try{
partOfLongRunningOperation(i);
}catch(InterruptedExceptione){
...
}
}
}

 

JavaEE5 Tutorial_Servlet的更多相关文章

  1. JavaEE5 Tutorial_Jsp,EL

      Jsp的各种元素在转化为servlet时处理是不一样的:指令,控制web容器如何处理页面脚本,被插入到生成的servlet里EL表达式,作为参数传递到解析器get/set Property,变成方 ...

  2. JavaEE5种常见的设计模式

    1.工厂模式:比如你写了个应用,里面用到了数据库的封装,你的应用可以今后需要在不同的数据库环境下运行,可能是oracle,db2,sql server等, 那么连接数据库的代码是不一样的,你用传统的方 ...

  3. JavaEE5 Tutorial_JavaBean,JSTL

    <jsp:useBean id="beanName" class="fully_qualified_classname" scope="scop ...

  4. 浅入tomcat

    前言:学习笔记,以供参考 1.什么是服务器 所谓的服务器其实就是一段别人写好的程序,服务器有两个能力. a.可以帮助我们来管理资源. b.可以将资源向外界发布以便于外界来访问这个资源. 2.资源有哪些 ...

  5. 【MongoDB for Java】Java操作MongoDB

    上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...

  6. JPA学习笔记1——JPA基础

    1.JPA简介: Java持久化规范,是从EJB2.x以前的实体Bean(Entity bean)分离出来的,EJB3以后不再有实体bean,而是将实体bean放到JPA中实现.JPA是sun提出的一 ...

  7. J2EE中使用jstl报http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar错

    一.发现问题 运行引用了jstl的jsp页面 报http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or th ...

  8. 较全的IT方面帮助文档

    http://www.shouce.ren/post/d/id/108632 XSLT参考手册-新.CHMhttp://www.shouce.ren/post/d/id/108633 XSL-FO参考 ...

  9. MyEclipse8.5快速搭建SSH框架

    来源于:http://jingyan.baidu.com/article/a378c960a78125b3282830cc.html MyEclipse8.5快速搭建SSH框架 使用版本: Strut ...

随机推荐

  1. 【转载】String、StringBuffer与StringBuilder之间区别

    文章来源:http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html 这两天在看Java编程的书,看到String的时候将之前没有弄懂的 ...

  2. [转载]深入理解JAVA的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  3. Careerdesign@foxmail.com

    Careerdesign@foxmail.com 相关文章 32岁了,我还有没有机会转行做程序员吗? 如何有效渡过充满迷茫的大学生活 毕业了,我是先择业,还是先就业? 程序员创业,不要把风险带给家人! ...

  4. Hibernate4.2.2使用Annotation配置

    1.在hibernate官网下载hibernate-release-4.2.2.Final.zip并解压 2.新建一个java project工程(20130619_Hibernate4.2.2_An ...

  5. JDBC 事务控制

    一.简介: 前面一遍提到了jdbc事务相关的概念.从中了解到事务应具有ACID特性.所以对于javaweb开发来说,某一个service层的方法,应该是一个事务,应该是具有原子性的.特别是当一个ser ...

  6. hdu4576 概率dp n^2的矩阵

    这个题目看网上好多题解都是直接O(n*m)卡过.我是这么做的. 对于m次操作,统计每个w的次数.然后对每个w做矩阵乘法. 这样直接做矩阵乘法是会TLE的. 又由于这里的矩阵很特殊,一次乘法可以降维成O ...

  7. 发布mvc3的项目时system.web.mvc 版本 为3.0.0.1高于服务器版本3.0.0.0 升级到3.0.0.1

    下载地址在这里: http://www.microsoft.com/zh-cn/download/details.aspx?id=44533&WT.mc_id=rss_alldownloads ...

  8. windows2003 IIS6网络负载平衡设置

    问题 随着计算机技术的不断发展,单台计算机的性能和可靠性越来越高.但现实中还是有许多应用是单台计算机难以达到,例如: 1.银行存储用户数据的数据库服务器必须保证24小时不间断的运转,并在发生严重硬件故 ...

  9. android Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)

    在Android群里,经常会有人问我,Android Log是怎么用的,今天我就把从网上以及SDK里东拼西凑过来,让大家先一睹为快,希望对大家入门Android Log有一定的帮助. android. ...

  10. 如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问。

    由于 web api 项目通常是被做成了一个独立站点,来提供数据,在做web api 项目的时候,不免前端会遇到跨域访问接口的问题. 刚开始没做任何处理,用jsonp的方式调用 web api 接口, ...