spring拦截器&过滤器&springjdbc&mybatis
来源:互联网 发布:怎么联系网络推手 编辑:程序博客网 时间:2024/05/17 07:25
DispatcherServlet
@Controller
String ModelAndView
@RequestMapping
1. 读请求参数
request
@RequestParam
javabean 将类做参数
2. 页面传值
request
session
ModelMap addAttribute 放入request
ModelAndView
3. 重定向
Return redirect:toIndex.do
ModelAndView
RedirectView
RedirectView rv = new RedirectView("toIndex.do");
returnnew ModelAndView(rv);
<!-- 读取config.properties的内容 -->
<util:propertiesid="config"location="classpath:config.properties"/>
<!-- 配置连接池DataSource -->
<beanid="ds"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
<propertyname="driverClassName"value="#{config.className}"/>
<propertyname="url"value="#{config.url}"/>
<propertyname="username"value="#{config.username}"/>
<propertyname="password"value="#{config.password}"/>
</bean>
一. 拦截器
(1) 什么是拦截器
拦截器在DispatcherServlet和Controller之间进行拦截。
spring定义的一种特殊的组件,前端你控制器在收到请求之后,会先调用拦截器的方法,然后再调用处理器(controller)。
注:过滤器是servlet规范当中定义的组件。
//过滤器是在xxx.do和DispatcherServlet之间进行拦截。
(2) 如何写一个拦截器?
a) 写一个java类,实现HandlerInterceptor接口。
b) 将拦截处理逻辑写在相应的接口方法里面
preHandle: 在DispatcherServlet和Controller之间最先执行,前端控制器收到请求之后会先调用拦截器的preHandle方法,如果该方法的返回值为true,表示继续向后调用,如果返回值为false,表示请求处理完毕,不会向下执行。
postHandle: 处理器方法已经执行完毕,准备将处理结果(ModelAndView对象)返回给前端控制器之前执行该方法。可以在该方法里面,修改处理结果。
afterCompletion:最后执行的方法。
注意:只有当preHandle方法返回值为true的时候才会执行。
(3) 配置拦截器
<!-- 配置拦截器
注:如果有多个拦截器满足拦截要求,则依据配置的先后顺序依次执行
>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mappingpath="/**"/>
<beanclass="interceptors.SomeInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
//可以处理多层路径的拦截,类似于
@RequestMapping("/abc/hello2.do")
public String hello2(){
returnHELLO;
}
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mappingpath="/**"/>
<mvc:exclude-mappingpath="/toLogin.do"/>
<mvc:exclude-mappingpath="/login.do"/>
<beanclass="com.link.netctoss.interceptors.SessionInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Objecthandler)
throws Exception {
Admin admin = (Admin)request.getSession().getAttribute("admin");
if(admin ==null){
//没有登录,重定向到登录页面
response.sendRedirect("toLogin.do");
returnfalse;
}
returntrue;
}
//前台用户名中文过滤
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
//让spring框架来处理异常
将异常抛给spring,由spring框架依据相应的配置,来处理异常。
方式一:使用简单异常处理器
http://localhost:8000/springmvc03/hello1.do?num=10a
可以get方式传参。
//配置简单异常处理器
<!-- 配置简单异常处理器 -->
<beanclass="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<propertyname="exceptionMappings">
<props>
<propkey="java.lang.NumberFormatException">hello_error</prop>
</props>
</property>
</bean>
@RequestMapping("/hello2.do")
public String hello2(Stringstr) {
str.charAt(10);
return HELLO_ERROR;
}
方式二:
1. 在处理器类当中,添加一个用来处理异常的方法,该方法必须添加@ExceptionHandler
2. 在异常处理方法里面,依据异常类型,分别进行不同的处理。
@ExceptionHandler
public String execute(Exception ex,HttpServletRequestrequest){
if(exinstanceof NumberFormatException){
request.setAttribute("msg","类型转化异常");
}
return HELLO ERROR;
}
二. spring jdbc
spring jdbc是什么?
spring框架对jdbc的封装
//如何使用spring jdbc
使用JdbcTemplate(模板)
提供了JdbcTemplate类,提供了大量的模板,然后调用方法即可。
<!-- 配置JdbcTemplate -->
<beanid="jt"class="org.springframework.jdbc.core.JdbcTemplate">
<propertyname="dataSource"ref="ds"></property>
</bean>
@Repository("EmpDAO")
public class EmpDao {
@Resource(name = "jt")
private JdbcTemplatejt;
public void save(Emp emp) {
Stringsql = "INSERT INTO empvalues(seq_emp.nextval,?,?)";
Object[]param = new Object[] { emp.getName(), emp.getAge() };
jt.update(sql,param);
}
public List<Emp> findAll(){
Stringsql = "select * fromemp";
returnjt.query(sql,new EmpRowMapper());
}
public Emp findById(intid) {
Stringsql = "select * from empwhere id=?";
Object[]param = new Object[] {id};
returnjt.queryForObject(sql,param,new EmpRowMapper());
}
}
class EmpRowMapperimplements RowMapper<Emp> {
public Emp mapRow(ResultSetrst, intindex) throws SQLException {
Emp emp = new Emp();
Stringname = rst.getString("name");
intage = rst.getInt("age");
intid = rst.getInt("id");
emp.setName(name);
emp.setAge(age);
emp.setId(id);
returnemp;
}
}
public class TestCase {
@Test
public void test1(){
ApplicationContextac =new ClassPathXmlApplicationContext("applicationContext.xml");
EmpDaodao = ac.getBean("EmpDAO",EmpDao.class);
Emp emp = new Emp();
emp.setName("yannis");
emp.setAge(12);
dao.save(emp);
}
@Test
public void test2(){
ApplicationContextac =new ClassPathXmlApplicationContext("applicationContext.xml");
EmpDaodao = ac.getBean("EmpDAO",EmpDao.class);
Emp emp =new Emp();
List<Emp>list = dao.findAll();
System.out.println(list);
}
@Test
public void test3(){
ApplicationContextac =new ClassPathXmlApplicationContext("applicationContext.xml");
EmpDaodao = ac.getBean("EmpDAO",EmpDao.class);
dao.findById(1);
}
}
//mybatis
mybatis是什么?
是一个开源的持久层框架。
jdbc、
hibernate:移出之后就冬眠,会生成复杂的sql,不好优化
mybatis:速度适中,需要些sql,代码量少
编程步骤:
1. 导包
2. 添加配置文件
3. 写一个实体类
4. 写一个映射文件(内容主要是sql语句)
<!-- 返回Map类型的结果 -->
<selectid="findById2"parameterType="int"resultType="java.util.Map">
select* from emp where id=#{id1}
</select>
@Test
//返回Map类型的结果,ORACLE会将字段名转换为大写形式
public void test2(){
Mapdata =session.selectOne("test.findById2", 6);
System.out.println(data.get("NAME"));
}
//符合映射文件的要求
1. 方法名必须与sql语句的id一样
2. 方法的返回类型与sql语句的返回类型一致
3. 方法的参数类型与sql语句参数类型一致
此外,映射文件的namespace等于dao层的例如EmpDao。
Mapper映射器,就是一个DAO
拦截器:
what?
拦截前端控制器。
1. java类实现HandlerInterceptor
a) preHandle:有返回值。false表示请求处理结束。
b) postHandle:controller返还给DispatcherServlet的时候执行,此阶段可以修改视图。
c) afterCompletion:最后执行。
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mappingpath="/**"/>
<mvc:exclude-mappingpath="/toLogin.do"/>
<mvc:exclude-mappingpath="/login.do"/>
<mvc:exclude-mappingpath="/checkcode.do"/>
<beanclass="com.link.netctoss.interceptors.SessionInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
// IOC/DI(依赖注入)
spring容器创建对象:无参构造器,静态工厂方法,实例工厂方法。
// springmvc
项目(AOP面向切面编程)
//spring异常处理
1. springmvc提供的SimpleMappingExceptionResolver
a) 在配置中添加简单异常处理器
b) 添加对应的异常处理页面
2. 实现接口
使用@ExceptionHandler
a) 在处理器中添加一个异常处理方法,在该方法前添加@ExceptionHandler
b) 在异常处理方法当中,依据异常类型,分别进行不同的处理
c) 添加对应的异常处理界面
//写统一的basicException然后controller去继承。
//表单中文参数值如何处理
(1) 乱码问题产生的原因
提交表单时,浏览器会对表单中的中文参数值进行编码(浏览器会按照打开表单所在的页面时所使用的字符集来解码),而服务器端默认使用”iso-8859-1”解码。
contentType=”text/html” 消息头,用来浏览器解码。
(2) 如何解决
配置一个过滤器
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3. spring jdbc
spring对jdbc的封装,通过使用spring jdbc来访问数据库,就不再需要考虑获取连接与关闭连接等问题。
<!-- 配置JdbcTemplate -->
<beanid="jt"class="org.springframework.jdbc.core.JdbcTemplate">
<propertyname="dataSource"ref="ds"></property>
</bean>
//如何使用spring jdbc?
a) 导包 spring-webmvc spring-jdbc
b) 添加spring配置文件
a) 注:连接池的配置
b) JdbcTemplate的配置(封住了常见的数据库操作,增删改查),需要将连接池注入到JdbcTemplate。
c) 将JdbcTemplate注入,调用即可。
import javax.annotation.Resource;
@Resource(name = "jt")
private JdbcTemplatejt;
//提示注解扫描一般化的情况是没有实例化bean,也就是没有注解扫描
public Emp findById2(int id){
List<Emp>emps = jt.query("select * from empwhere id=?",new Object[]{id},new EmpRowMapper());
if(emps!=null &&emps.size()>0){
returnemps.get(0);
}
returnnull;
}
解决了return jt.queryForObject("select * from empwhere id=?",new Object[] {id},new EmpRowMapper());如果查询不到会报错的问题,放入集合中,如果list有得话就取第一组元素,如果没有的话,就返回空。
1. 异常处理
a) 配置简单异常处理器
b) @ExceptionHandler
2. 表单中文参数值
配置过滤器
request.setCharacterEncoding
3. spring jdbc
JdbcTemplate的配置-->DAO
一. mybatis
jdbc性能最好,代码繁琐。
(1) mybatis是什么?
是一个开源的持久层框架,性能适中 写sql
(2) hibernate 冬眠
不用写sql 代码简洁,性能不好,对于复杂的sql语句的优化很麻烦。
如何使用mybatis
1. mybatis,ojdbc
2. 添加配置文件
3. 写实体类
注:实体类的属性名与表的字段名要求一致(大小写可以不一样)
entity
* 实体类
* 属性名要与表的字段名一致(大小写可以不一样)
*/
4. 写映射文件
命名空间为了区分同名。
5. 调用SqlSession提供的方法来访问数据库
Students = new Student(“libai”);
s.study();
//一个线程一个栈。
* getResourceAsStream是ClassLoader提供的一个方法,负责读取配置文件的内容,并提供一个输入流
注:ClassLoader(类加载器):负责读取类的字节码文件的内容,并将这些内容转换成方法区中的class对象。
SqlSessionFactoryssf= newSqlSessionFactoryBuilder().build(TestCase.class.
getClassLoader().getResourceAsStream("SqlMapConfig.xml"));
<!—id属性:sql的名称,要求唯一
parameterType属性:参数类型,要求写类的完整的名称。-->
<insertid="save"parameterType="entity.Emp">
INSERTINTO emp VALUES(seq_emp.nextval,#{name},#{age})
</insert>
<!-- ResultType属性:返回类型,要求写类的完整的名称 -->
<selectid="findAll"resultType="entity.Emp">
SELECT* FROM emp
</select>
返回Map类型的查询结果
//mybatis会将查询到的记录先放到Map对象里面(一条记录对应一个Map对象),接下来,将Map对象中的数据放到实体对象里面。
Emp
id
name
age
<!-- 返回Map类型的查询结果也可以填写map-->
<selectid="findById2"parameterType="int"resultType="java.util.Map">
SELECT* FROM emp WHERE id = #{id}
</select>
@Test
public void test6(){
//name必须是大写,oracle会将字段名都转换成大写形式
Mapmap = session.selectOne("test.findById2", 25);
System.out.println(map.get("NAME"));
session.close();
}
//如果实体类的属性和表的字段名不一样的情况下?
别名可以
1. 在映射文件当中,使用ResultMap元素制定实体类的属性名与表的字段名的对应关系。
- spring拦截器&过滤器&springjdbc&mybatis
- Spring 拦截器与过滤器
- spring拦截器和spring过滤器
- Spring +Mybatis 拦截器配置
- Spring拦截器与过滤器的区别
- Servlet监听器、过滤器与Spring拦截器
- spring mvc拦截器与过滤器
- Spring Boot (九):过滤器、拦截器、监听器
- Spring拦截器与过滤器等总结
- 过滤器和spring拦截器的区别
- Spring过滤器filter拦截服务
- mybatis-interceptor:Spring动态拦截器
- ssm(spring + springMVC + mybatis)拦截器
- spring 拦截器和过滤器的访问顺序
- 14. Spring Boot 定义过滤器、监听器、拦截器
- Servlet的过滤器与Spring拦截器详解
- Spring Boot 过滤器、监听器和拦截器使用
- spring过滤器和拦截器的区别和联系
- 归并排序 迭代版
- Android 自定义View(二)
- 图片的像素操作、添加文本
- 【面试题】实现单链表的逆序
- (二十一)java多线程之Executors
- spring拦截器&过滤器&springjdbc&mybatis
- 【PAT甲级】1061. Dating (20)
- GDOI2017模拟11.3 总结
- Android产品研发(十二)-->App长连接实现
- LinearLayout和RelativeLayout绘制过程的对比
- 二级缓存和QBC查询
- 开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
- Mini-Notes: LaTex的相关工具和文档
- Android Service完全解析,关于服务你所需知道的一切(下)