一、JavaWeb四大域对象的作用范围:
在javaWeb编程中,可以在四个不同大小的可访问范围(时间、空间)中设置属性对象,即将一个对象绑定到一个字符串上。
1、pageContext:
作用范围为jsp页面本身,是最小的一个作用范围。
对应内置对象是pageContext,EL中可以用pageScope获取此对象。
设置该范围属性的写法是:pageContext.setAttribute(String,Object);
2、HttpServletRequest request:
作用范围:只在一次请求链中有效(包括将此请求转发到其他的页面),也即是从客户端发来一次请求开始,到 服务端响应结束。
常用的几个方法:
void request.setAttribute( String,Object);
该方法把对象和一个String 型的键值绑定在一起,可以通过request.getAttribute( String);方法取出。
Object request.setAttribute( String);
该方法可以把之前设置的属性取出来。
void request.removeAttribute(String);
该方法可以移除之前绑定的对象
Enumerationrequest.getAttributeNames();
该方法返回request域中所有属性的枚举
例如:
这里设置了两个属性 username ,password ,当前servlet 转发到testRequset.jsp页面中,在testRequset.jsp页面中可以取出这里设置的值,但是直接去访问testRequset.jsp页面 的值取出来就是空值,这里就充分体现了只在一次请求链中有效。
3、HttpSession session
(1)session简单介绍:
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
(2)session和cookie的区别
.Cookie是把用户的数据写给用户的浏览器。
.Session技术把用户的数据写到用户独占的session中。
.Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
(3)浏览器和服务器:
浏览器发送一次请求到服务器,服务器首先判断,该浏览器是否携带一个sessionId值,如果这次请求没有携带
一个sessionId值,服务器就知道这是第一次访问服务器。
浏览器开始与该服务器开始建立会话,服务器会在响应请求的同时,将产一个SessionId,作为该次会话的标识,再把该sessionId发送给浏览器,浏览器就拥有一个sessionId值了,当浏览器再次访问时,将会判断出给此次请求携带sessionId,代表这不是一个新的请求。
(4)常用的方法:
session.getId();
session.setAttribute(String, Object);
session.getAttribute("String");
tomcat 默认 session的有效时间是30分钟,可在tomcat的配置文件service.xml设置
<session-config>
<session-timeout>time</session-timeout>
<session-config>该配置对服务器里运行的项目都有效。
对单个项目的配置,在单个项目中web.xml中添加:
<session-config>
<session-timeout>time</session-timeout>
<session-config>该配置对单个项目有效。
(5)session的作用范围:
作用范围是一次会话。(在没超过session的最大有效时间和没销毁session(没调用invalidate方法,或没关闭浏览器和服务器)的情况下)
(6)使session无效的方法:
a、session.invalidate()执行后,session无效。
b、session的最大等待时间过后,session无效.
c、关闭浏览器后,session无效.
d、关闭服务器后,session无效
只要浏览器和服务器都没有配对的Sessionid就表示session无效。
注:1、session中对象的有效时间是30分钟或可直接设置,那其中绑定的的各对象是先后失效的,先绑定的先失效。如果要立即销毁整个session可以调用invalidate(),其中各对象也全部清除。
2、有的服务器可以做到启动后恢复之前的session。即服务器正常关闭,再启动,Session对象会进行钝化和活化操作。同时如果服务器钝化的时间在session默认销毁时间之内,则活化后session中的一些对象还是存在的,否则认为已经被释放了
4、ServletContext:
(1) 一个Web应用程序中所有的session都共享到一个ServletContext对象,所以该对象称为application对象.
(2)ServletContext对象在web.xm中用<context-param>用来声明应用范围(整个WEB项目)内的上下文初始化参数。
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>contextConfigLocationValue></param-value>
- </context-param>
param-name 设定上下文的参数名称。必须是唯一名称
param-value 设定的参数名称的值
在Servlet里面可以获取代码如下:
//创建application对象
String contextConfigLocation= application.getInitParameter("contextConfigLocation");
//通过application对象调用getInitParameter方法来获取值
3、作用范围:整个Web程序
总结:作用范围从小到大依次为:PageContext,ServletRequest,Session,ServletContext。
二、ServletConfig:1、在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。(配置在某个servlet标签>
例如:
在SecondServlet中配置了两个两个参数 Country 和 city 在该servlet类中调用.getInitParameter("country")就可以得到存的值
ServletConfig config = this.getServletConfig();
3、常用的几个方法:
config.getInitParameter(String name)返回对应key的value
String getServletName();返回该Servlet在配置文件中的名字
enumerationgetInitParameterName()返回所有参数的名字的一个枚举。
今天的内容就到这了,明天会继续写servlet的笔记,过滤器(Filter)的内容就明天再写了。
三、过滤器(Filter)
filter翻译为过滤器。在web项目中,经常需要在正式处理请求前,做一些特殊的处理或常用的例程,于是就发明了这个filter。
filter能做的事情主要包括如下:
(1)过滤非法文字和信息;
(2)设置统一字符编码;
(3)对用户进行登录验证;
(4)改变图片文件格式;
(5)对相应内容做压缩处理;
(6)对XML的输出使用XSLT来进行转换。
步骤一
通过在web.xml中的<filter>元素和<filter-mapping>元素来配置filter,以决定用户请求的URL应被哪些filter类来处理一次。如:
<filter> <filter-name>HelloFilter</filter-name> <filter-class>com.eat.servlet.HelloFilter</filter-class> </filter>
<filter-mapping> <filter-name>HelloFilter</filter-name> <url-pattern>/eat</url-pattern> </filter-mapping> |
这个例子中,当用户输入的url和“/eat”匹配时,系统就会使用名为“HelloFilter”的filter先处理这个请求后再将请求传递下去。
n 步骤二:编写filter类
1.我们的filter类需要实现父接口javax.servlet.Filter。
2.实现父接口的各个方法。包括init(),doFilter(),destroy()。这3个方法说明如下:
(1)init()方法和destroy()方法分别用来初始化和销毁时调用。
init()方法在 Filter生命周期中仅执行一次。服务器启动时就会执行。
destory()方法在Filter的生命周期中仅执行一次,即Web容器卸载Filter对象之前调用它。主要做释放资源的操作。
(2)doFilter(req,resp,chain)方法。
它用来实现过滤,所有的处理代码都放置在该方法中。doFilter()方法接收3个参数,分别是request、response、和chain,其中request和response用来传递给下一个Filter(如果有多个Filter)或者JSP或者Servlet。chain参数则通过调用自己的doFilter方法来将请求向下传递,如果没有调用doFilter()方法,则相当于阻止了本次请求。
filter的生命周期
http服务器(如tomcat)的内部会创建出一个Filter类的对象,这个对象有它自己的创建、调用过滤方法、消亡的过程,也即它的生命周期,这个生命周期的说明如下。
1.服务器启动时就会创建出Filter对象,然后立即调用init()方法来进行一些初始化操作;
2.每当用户的请求来临时,为过滤用户请求而调用doFilter()方法;
3.当这个Filter对象要销毁时,就先调用destroy()方法后再释放此对象。(什么时候会销毁呢?一旦http服务器停止时就会销毁,但是实验中直接从eclipse中停止tomcat时可能不太容易观察到销毁时发生的现象。而是可以通过在eclipse里改变项目代码,此时项目重新发布时会引起tomcat释放以前的各个对象再重建这些对象。)
url匹配
如果我们要使所有的请求都被某个过滤器进行过滤,那么我们可以使用一个全匹配的url写法,即“/*”,示例如下:
<filter-mapping>
<filter-name>HelloFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这种情况可以用到比如一个站点要想防ddos攻击,那么这段代码就可以统一做到一个过滤器当中,而这个过滤器是应该能够针对所有的请求都起作用的,因此适合使用/*。
许多的框架也是通过配置filter,并使用/*来将所有的url请求导向到框架自己的处理例程中。