Java第十二周心得体会

1.本周思维导图

2.个人总结

会话技术

Cookie:数据存储到浏览器

  • 获取Cookie
Cookie[] cookies = request.getCookies();
    Cookie cookie = null;
    for(Cookie sonCookie : cookies){
        if("msg".equals(sonCookie.getName())){
        cookie = sonCookie;
        }
    }
    if(null != cookie){
        System.out.println("name : "+msgCookie.getName() + " , value : "+             
        msgCookie.getValue());
}
  • CookieUtils

public static Cookie getCookie(Cookie[] cookies ,String cookieName){
    if (null != cookies && 0 != cookies.length) {
        for (Cookie sonCookie : cookies) {
            if (cookieName.equals(sonCookie.getName())) {
                return sonCookie;
            }
        }
    }
    return null;
}

Session:数据存储到服务器

  • 执行流程

第一次请求DemoServlet时,根据request.getSession方法, 新建一个session对象

当第一次响应时,会将该session对象的ID作为cookie头,响应给浏览器保存

第二次请求DemoServlet时,根据request.getSession方法,请求中会有cookie头

会根据该JSESSIONID去服务器中找有没有对应的session对象,如果有直接用,没有则新建

  • 相关配置

Session 生命周期

默认有30分钟的存活时间,详情如下

 web.xml

  <session-config>
        <session-timeout>30</session-timeout>
  </session-config>
  • 可通过session.invalidate方法,立即将对应的session对象销毁,后续则会新建session对象
  • session两种销毁情况
    • 默认过了30分钟
    • 调用了invalidate方法

封装单条记录的结果集

  • 自定义DbUtils:MyBeanHandler
public class MyBeanHandler<T> implements  MyResultSetHandler<T> {

    private Class<T> clazz;//User类Class对象,也可以是Student类Class对象

    public MyBeanHandler(Class<T> clazz) {
        this.clazz = clazz;
    }

    @Override
    public T handle(ResultSet resultSet) throws Exception {
        T t = clazz.newInstance();
        //处理结果集
        while (resultSet.next()){
            //id属性值,username属性值,password属性值
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                //字段名称
                String fieldName = field.getName();
                //字段值
                Object fieldValue = resultSet.getObject(fieldName);
                //将字段值设置Class对象对应的java实体对象
                //获取字段对应set方法
                String methodName = "set" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
                Method method = clazz.getMethod(methodName, field.getType());
                if (null != method) {
                    method.invoke(t,fieldValue);
                }
            }


        }
        return t;
    }
}
  • 自定义DbUtils:MyBeanListHandler
public class MyBeanListHandler<T> implements MyResultSetHandler<List<T>> {

    private Class<? extends T> clazz;//集合中元素的Class对象

    public MyBeanListHandler(Class<? extends T> clazz) {
        this.clazz = clazz;
    }

    @Override
    public List<T> handle(ResultSet resultSet) throws Exception {
        List<T> list = new ArrayList<>();
        while (resultSet.next()) {
            //循环一次,就是一条记录,就是一个对象
            T t = clazz.newInstance();
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                String fieldName = field.getName();
                Object fieldValue = resultSet.getObject(fieldName);
                //获取set方法
                String methodName = "set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
                Method method = clazz.getMethod(methodName, field.getType());
                if (null != method) {
                    method.invoke(t,fieldValue);
                }
            }
            list.add(t);
        }
        return list;
    }
}

过滤器

  • 生命周期

随着服务器启动而初始化

随着请求的发出而过滤

随着服务器关闭而销毁

  • 执行流程

浏览器发起请求

服务器会根据请求,创建request对象及response对象

过滤器会持有request对象及response对象

只有当过滤器放行之后,request对象及response对象才会传给Serlvet

  •  根据配置顺序,遵从"先过滤,后放行"的原则
  • 相关配置
    • Filter配置初始化参数
<filter>
        <filter-name>Demo03Filter</filter-name>
        <filter-class>com.qfedu.filter.DemoFilter</filter-class>
        <!--初始化参数-->
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>root123</param-value>
        </init-param>
</filter>

 

  • Filter获取初始化参数
public class Demo03Filter implements Filter {

    public void init(FilterConfig config) throws ServletException {
        Enumeration<String> parameterNames = config.getInitParameterNames();
        while (parameterNames.hasMoreElements()) {
            //获取初始化参数名称
            String parameterName = parameterNames.nextElement();
            //获取初始化参数值
            String parameterValue = config.getInitParameter(parameterName);
            System.out.println("name : " + parameterName + " , value : " + parameterValue);
        }
    }   
}

过滤器注解开发

  • @WebFilter注解
    • WebInitParam[] initParams() default {};配置初始化参

    • String filterName() default "";配置过滤器名称

    • String[] servletNames() default {};配置过滤的Servlet

    • String[] urlPatterns() default {};配置过滤路径

@WebFilter(filterName = "Demo04Filter" ,
        urlPatterns = "/demo01",
        servletNames = "Demo01Servlet" ,
        initParams = {
                @WebInitParam(name = "username",value = "root"),
                @WebInitParam(name = "password",value = "root123")
        })
public class Demo04Filter implements Filter {


    public void init(FilterConfig config) throws ServletException {
        Enumeration<String> parameterNames = config.getInitParameterNames();
        while (parameterNames.hasMoreElements()) {
            String parameterName = parameterNames.nextElement();
            String parameterValue = config.getInitParameter(parameterName);
            System.out.println(parameterName + " , " + parameterValue);
        }
    }
}

 

  • 执行顺序
    • 按照过滤器的类名的字典顺序决定谁先过滤,谁先放行

过滤器解决中文乱码

public class EncodingFilter implements Filter {

    private String encoding = null;

    public void init(FilterConfig config) throws ServletException {
        encoding = config.getInitParameter("encoding");
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //处理响应中文乱码
        resp.setContentType("text/html;charset="+encoding);
        //处理请求中文乱码
        req.setCharacterEncoding(encoding);
        chain.doFilter(req, resp);//放行
    }
}
<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>com.qfedu.filter.EncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>

</filter>

<filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

过滤器屏蔽敏感词

@WebFilter(
        filterName = "SensitiveWordsFilter" ,
        urlPatterns = "/*",
        initParams = {
                @WebInitParam(name = "word1", value = "山寨"),
                @WebInitParam(name = "word2", value = "水货"),
                @WebInitParam(name = "word3", value = "盗版"),
                @WebInitParam(name = "word4", value = "刻录")
        })
public class SensitiveWordsFilter implements Filter {

    //敏感词
    List<String> sensitiveWords = new ArrayList<>();

    public void init(FilterConfig config) throws ServletException {
        Enumeration<String> parameterNames = config.getInitParameterNames();
        while (parameterNames.hasMoreElements()) {
            String sensitiveWord = config.getInitParameter(parameterNames.nextElement());
            sensitiveWords.add(sensitiveWord);
        }
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("SensitiveWordsFilter doFilter");
        HttpServletRequest request = (HttpServletRequest) req;
        //增强request下的getParameter方法
        HttpServletRequest requestPrxoy = (HttpServletRequest) Proxy.newProxyInstance(
                request.getClass().getClassLoader(),
                request.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //增强getParameter方法
                        Object returnValue = null;
                        String methodName = method.getName();
                        if ("getParameter".equals(methodName)) {
                            //returnValue就是getParameter方法的返回值,可能会存在敏感词
                            String returnValue1 = (String)method.invoke(request, args);
                            //开始处理敏感词
                            for (String sensitiveWord : sensitiveWords) {
                                if (returnValue1.contains(sensitiveWord)) {
                                    //getParameter方法的返回值包含敏感词
                                    returnValue1 = returnValue1.replace(sensitiveWord,"***");
                                }
                            }
                            return returnValue1;
                        } else {
                            returnValue = method.invoke(request, args);
                        }
                        return returnValue;
                    }
                });
        chain.doFilter(requestPrxoy, resp);
    }
}

监听器

监听器分类

  • 一类监听器
    • 监听域对象的创建、销毁
  • 二类监听器
    • 监听域对象中的属性变更(属性设置、属性替换、属性移除)
  • 三类监听器
    • 监听域对象的Java对象的绑定

一类监听器

  • ServletRequestListener : 监听ServletRequest域对象的创建、销毁
  • HttpSessionListener :监听HttpSession域对象的创建、销毁
  • ServletContextListener : 监听ServletContext域对象的创建、销毁

二类监听器

  • ServletRequestAttributeListener :监听ServletRequest域对象中属性变更
  • HttpSessionAttributeListener :监听HttpSession域对象中属性变更
  • ServletContextAttributeListener :监听ServletContext域对象中属性变更

三类监听器

  • HttpSessionBindingListener
    • 监听session域中的java对象的状态(绑定和解绑)
    • HttpSessionBindingListener不需要配置 web.xml

监听器注解开发

  • @WebListener 通等于配置web.xml绑定监听器
@WebListener
public class MyServletContextLIstener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext创建");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext销毁");
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值