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();


//一个线程一个栈。

* getResourceAsStreamClassLoader提供的一个方法,负责读取配置文件的内容,并提供一个输入流

: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元素制定实体类的属性名与表的字段名的对应关系。



1 0
原创粉丝点击