五,手写SpringMVC框架,过滤器的使用

8. 过滤器

8.1 编写字符过滤器 CharacterEncodingFilter

复制项目mymvc4,新建项目mymvc5

package com.hy.filter;

 

import java.io.IOException;

 

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.annotation.WebFilter;

import javax.servlet.annotation.WebInitParam;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import com.hy.utils.StringUtil;

 

@WebFilter(urlPatterns = { "*.do" },

initParams = {

@WebInitParam(name = "encoding", value = "UTF-8")

})

public class CharacterEncodingFilter implements Filter {

private String encoding = "UTF-8";

 

@Override

public void init(FilterConfig filterConfig) throws ServletException {

String encoding = filterConfig.getInitParameter("encoding");

System.out.println("encoding="+encoding);

if(StringUtil.isNotEmpty(encoding)) {

this.encoding = encoding;

}

}

 

@Override

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;

HttpServletResponse response = (HttpServletResponse) resp;

request.setCharacterEncoding(encoding);

response.setCharacterEncoding(encoding);

response.setContentType("text/html;charset="+encoding);

chain.doFilter(request, response);

return;

}

 

@Override

public void destroy() {

}

}

 

 

 

create table worker(

       wid int primary key,

       wname varchar2(20),

       age int       

)

 

select * from user_tables;

select * from user_col_comments where table_name = 'WORKER'

 

 

select * from worker;

 

insert into worker values(1,'fbb',10);

 

commit;

rollback;

 

##Oracle 自动开启事务但是需要手动的 提交事务或回滚事务

## mysql 默认自动开启事务自动提交事务失败自动回滚

 

 

 

9,事务案例代码:jsp07 ,jsp77

 

9.1 如果通过dao方法中传参,那么我们需要修改方法的签名。

当我们需要手动提交事务,调用 conn.setAutoCommit(false); 但是,我们的conn到底用的是哪个connection?我们三个dao代码中,应该使用同一个Connection对象,才能让三个dao操作处于同一个事务。如果用面向对象的思想来写,那么我们需要在dao中传参。

 

9.2 如下图所示:

 

 

 

9.3 案例代码:jsp77

9.4 问题:代码非常丑陋。

 

9.5 如何解决

事务前置到XxxFilter中,进行”所谓的”事务管理的操作。 Service还是正常的Service,不要XxxServiceImpl代码中获取Connection对象,XxxDao的方法也不要传递Connection对象。

 

 

 

但是如何解决三个dao操作要共享同一个Connection对象的问题呢?

9.6 如何解决Connection对象共享的问题?

有一个工厂,有三个员工相当于三个dao方法。

 

 

 

这个纽带叫ThreadLocal

 

posted @ 2022-08-17 21:48  雾里看瓜  阅读(111)  评论(0编辑  收藏  举报