五,手写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