编码问题
表单提交时,浏览器会会中文进行编码(会使用打开表单所在
页面的的字符集来编码,比如使用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.配置拦截器。
图示拦截器


在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);
}
}
网友评论