美文网首页
Spring 编码问题,拦截器,处理异常,Springmvc-j

Spring 编码问题,拦截器,处理异常,Springmvc-j

作者: 两分与桥 | 来源:发表于2018-09-01 23:34 被阅读13次

编码问题

表单提交时,浏览器会会中文进行编码(会使用打开表单所在
页面的的字符集来编码,比如使用utf-8来编码)
而服务器端默认使用iso-8859-1来解码,所以会产生乱码。

解决:
    springmvc提供了一个过滤器(CharacterEncodingFilter)
    只需要配置该过滤器即可。
    1.表单提交要使用post方式提交
    2.客户端的编码与过滤器的编码要一致

或者使用:request.setCharacterEncoding("utf-8")

在web.xml文件中配置过滤器,指定编码格式,这样就行了

<filter>
    <filter-name>encodingFilter</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>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

拦截器

- 什么是拦截器?
spring提供的一个特殊的组件,当DispatcherServlet收到请求后,
如果有拦截器,会先调用拦截器,然后调用相应的处理器(Controller)。

注:过滤器属于Servlet规范,而拦截器属于spring框架。

如何写一个拦截器
1.写一个java类,实现HandleInterceptor接口。
2.实现具体的拦截处理逻辑,比如session验证,记录日志等。
3.配置拦截器。

图示拦截器


拦截器.png 拦截器参数.png

在springmvc.xml中配置拦截器

!-- 配置拦截器,如果有多个拦截器,会按照配置的先后顺序来执行。 -->
!-- 匹配路径,/*只能拦截只有一个/的路径,/**拦截所有路径 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="interceptors.SomeInterceptor"/>
      </mvc:interceptor>
</mvc:interceptors>

定义拦截器

package interceptors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class SomeInterceptor implements HandlerInterceptor{

     * DispatcherServlet收到请求之后,会先调用perHandle方法,
     * 如果该方法的返回值是true,则继续向后调用:
     * 如果返回值是false,则不再向后调用。
     * handler:是描述处理器方法的一个对象。
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("preHandler()");
        return true;
    }

     * 处理器(Controller)的方法已经执行完毕,正准备将处理结果
     * (ModelAndView)返回给DispatcherServlet之前执行postHandle
     * 方法,可以在该方法中修改处理结果。
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle()");
    }

     * 最后执行的方法
     * 注意:只有当preHandle方法返回值为true时,
     * 该方法才会执行。
     * ex:是处理器所抛出的异常,可以写一个拦截器,
     * 用来处理这些异常。
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("afterCompletion()");
    }   
}

当我访问hello.do时,控制台会有如下打印:
preHandler()
hello()
postHandle()
afterCompletion()


spring处理异常

异常处理
- 可以将异常抛给spring,由spring来处理这些异常。

具体有两种方式:
    1. - 配置简单异常处理器。
       - 添加异常处理页面。
    
    2. - 在处理器类中,添加一个异常处理方法,该方法必须使用@ExceptionHandler修饰。
         注:在该方法里面,依据异常类型,分别进行不同的处理。
       - 添加异常处理页面。

第一种,配置简单异常处理器



web.xml中配置就行了,另外需要添加异常处理页面

<!-- 配置简单异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="java.lang.Exception">error</prop>
        </props>
    </property>
</bean>

第二种,可以很方便的处理抛出的异常,也就是说,页面的中的所有try-catch都不必写了,全部向上抛出异常(除了特定抛出异常信息外),由下面这个函数来捕获接收。

     * 这是一个异常处理方法。
     * ex:是其他方法所抛出的异常。
     * 
     * 依据异常类型的不同,分别进行相应的处理。
    @ExceptionHandler
    public String exHandle(Exception ex, HttpServletRequest request) {
        System.out.println("exHandle()");
        if(ex instanceof NumberFormatException) {
            request.setAttribute("errorMsg", "数字转换错误");
            return "error";
        }else if(ex instanceof StringIndexOutOfBoundsException) {
            request.setAttribute("errorMsg", "下标越界");
            return "error";
        }else {
            return "system_error";
        }
    }   

springmvc-jdbc,其对JDBC一般的繁琐操作进行了封装

- 1.springmvcjdbc是什么?
    spring对jdbc的封装,使用spring jdbc访问数据库,可以不用
    写一些重复性的代码,比如获取连接,关闭连接等。

- 2.如何使用?JdbcTempate
    a.导包:spring-webmvc,spring-jdbc,mysqljdbc,dbcp,
    b.添加spring配置文件
    c.配置JdbcTemplate
    注:JdbcTemplate提供了一些方法,用来访问数据库。
    d.调用JdbcTemplate提供的方法来访问数据库。
    注:通常将JdbcTemplate注入到DAO。     

下面是我的pom.xml文件,springmvc-jdbc还是基于JDBC来操作的,肯定也需要导入JDBC jar包,junit 是用来测试接口的

  <dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>3.2.8.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>3.2.8.RELEASE</version>
    </dependency>
  </dependencies>

在resource文件夹中建立数据库连接配置文件db.properties,用spring的配置文件来读取

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/test
jdbc.username=root
jdbc.password=root

initialSize=2
maxActive=2

springmvc.xml文件配置,读取数据库配置文件db.properties

    <context:component-scan base-package="dao"/>

    <!-- 配置连接池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="#{config['jdbc.driver']}"/>
        <property name="url" value="#{config['jdbc.url']}"/>
        <property name="username" value="#{config['jdbc.username']}"/>
        <property name="password" value="#{config['jdbc.password']}"/>
    </bean>
    
    <util:properties id="config" location="classpath:db.properties">
    </util:properties>
    
    <bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

利用springmvc-jdbc来查询emp表格,建立实体类Emp

package entity;

public class Emp {
    private Integer id;
    private String name;
    private Double age;
}
省略一堆的get/set方法

对emp表格的增删改查操作

package dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import entity.Emp;

@Repository("empDAO")
public class EmpDAO {
    
    @Resource(name="jt")
    private JdbcTemplate template;
    
    public void save(Emp emp) {
        String sql = "INSERT INTO emp(name,age) VALUES(?,?)";
        Object[] args = new Object[] {emp.getName(),emp.getAge()};
        template.update(sql,args);
    }
    
    public List<Emp> findAll(){
        String sql = "SELECT * FROM emp";
        List<Emp> emps = template.query(sql,new EmpRowMapper());
        return emps;
    }
    
     * 告诉JdbcTemplate如何将ResultSet中的一条记录转换成相应的Entity对象。
     * rs:要处理的结果集(ResultSet)
     * rowNum:当前正在处理的记录的下标(从0开始)
    class EmpRowMapper implements RowMapper {
        public Emp mapRow(ResultSet rs, int rowNum) throws SQLException {
            Emp emp = new Emp();
            emp.setId(rs.getInt("id"));
            emp.setName(rs.getString("name"));
            emp.setAge(rs.getDouble("age"));
            return emp;
        }
    }
    
    public Emp findById(int id) {
        Emp emp = null;
        String sql = "SELECT * FROM emp WHERE id=?";
        Object[] args = new Object[]{id};
        emp = template.queryForObject(sql, args, new EmpRowMapper());
        return emp;
    }
    
    public void modify(Emp emp) {
        String sql = "UPDATE emp SET name=?,age=? WHERE id=?";
        Object[] args = new Object[] {emp.getName(),emp.getAge(),emp.getId()};
        template.update(sql, args);
    }
    
    public void delete(int id) {
        String sql = "DELETE FROM emp WHERE id=?";
        Object[] args = new Object[] {id};
        template.update(sql, args);
    }
}

相关文章

网友评论

      本文标题:Spring 编码问题,拦截器,处理异常,Springmvc-j

      本文链接:https://www.haomeiwen.com/subject/cydpwftx.html