Web的四大作用域和装饰设计模式(通过拦截器来实现)

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];
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛像话

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值