Web的四大作用域
- ServletContext:
生命周期:
一个web应用只有一个ServletContext,web应用第一次被创建的时候,ServletContext也随时创建。当服务器关闭,web应用销毁时,随着web应用的销毁而销毁
获取servletcontext的方法:
在servlet中通过this.getServletContext()获取
servletcontext sc=this.getServletContext()
servletcontext的功能:
- 1.从配置文件中获取配置的参数:
在web/WEB-INF/web.xml中配置初始化参数
<context-param>
<param-name>myKey1</param-name>
<param-value>myValue1</param-value>
</context-param>
可以通过sc.getInitParameter(String key);获取到value值。
-
2.作为域对象共享数据:
生命周期:和web应用一样长
作用范围:整个web应用
使用方法:
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name) -
3.返回web应用的实际路径:
sc.getRealPath(String path),通过客户端发来的请求路径,来获取web应用在服务器中的位置,path就是客户端发来的请求路径。
- session作用域:
生命周期:
第一次调用request.getSession()方法时创建session对象,如果服务器中有session,则直接拿来使用。
销毁的三种方式:
超时死亡——session默认30分钟不使用就会超时销毁,可以通过web.xml配置超时时间,单位为分钟。
<session-config>
<session-timeout>1</session-timeout>
</session-config>
主动杀死——调用session.invalidate()方法,会立刻杀死session。
意外身亡——当服务器意外关闭时,session也会销毁,如果服务器是正常关闭,session会被钝化,当服务器启动时再活化
作为域对象共享数据:
作用范围:整个会话
使用方法:
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
- Requset作用域:
生命周期:
一次请求链,也就是请求的开始和结束,整个过程中共享数据
作为域对象共享数据:
作用范围:整个请求链
使用方法:
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
- PageContext作用域:
生命周期:
访问jsp页面的时候创建,访问结束的时候销毁,代表当前jsp页面的运行对象
获取其他八大隐式对象:
getPage():获取page隐式对象
getRequest():获取request隐式对象
getResponse():获取response隐式对象
getServletConfig():获取config隐式对象
getServletContext():获取application隐式对象
getSession():获取session隐式对象
getException():获取exception隐式对象
getOut():获取out隐式对象
其他八大隐式对象可以在jsp中直接使用,但是在el表达式中,只能通过pageContext获取
pageContext域对象:
共享当前JSP界面的数据
作用范围:当前jsp界面
使用方法:
setAttribute(String name,Object value)
getAttribute(String name)
removeAttribute(String name)
通过装饰设计模式来实现拦截器解决乱码
首先来解释一下什么是装修设计模式,简单来说,就是把一个类里的函数需要加强的加强,不需要加强的就调用原来的。
实现过程:
a.首先写一个装饰类,该类需要和被装饰类实现或继承相同的接口或父类。
b.装饰类中保存被装饰类的对象,通过构造方法给他赋值
c.对于需要改造的方法进行改造,不需要的就调用原来的方法
下图就是拦截器使用装饰类解决乱码的图片:
代码如下:
//装饰类,用来装饰request,这样就可以修改request里的参数
class MyRequest extends HttpServletRequestWrapper{
private ServletRequest request;
private boolean flag=true;
public MyRequest(HttpServletRequest request){
super(request);
this.request=request;
}
@Override
public Map<String, String[]> getParameterMap() {
Map<String,String[]> map=request.getParameterMap();
if(flag){
for (Map.Entry<String,String[]> entry:map.entrySet()
) {
//是把entry里value 的地址给到了values,所以后面修改values里就相当于修改了map中的值
String[] values=entry.getValue();
for(int i=0;i<values.length;i++){
try{
values[i]=new String(values[i].getBytes("iso8859-1"),encode);
}catch (Exception e){
e.printStackTrace();
}
}
}
flag=false;
}
return map;
}
@Override
public String[] getParameterValues(String name) {
//返回的map调用get方法,通过name(key)获取到对应的value
return getParameterMap().get(name);
}
@Override
public String getParameter(String name) {
//-------------------------
String[] values=getParameterMap().get(name);
return values==null?null:values[0];
}
}