(1). 编码问题(过滤器)
为什么会乱码
表单提交时,浏览器会对中文进行编码(会使用打开表单的页面时的字符集来编码,比如使用UTF-8来编码),而服务器默认使用ISO-8859-1来解码,所以会产生乱码
如何解决?
springmvc提供了一个过滤器(CharacterEncodingFilter),只需要配置改过滤网器即可,如下
<!-- 配置字节码过滤器 -->
<servlet>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:a.表单提交采用post提交方式
b.客户端的编码要与过滤器的编码一样
(2)拦截器
什么是拦截器
spring提供的一个特殊的组件,当DispatcherServlet收到请求之后,如果有拦截器,会先试用拦截器,然后调用相应的处理器(Controlller)
拦截器与过滤器的区别:过滤器属于Servlet的规范,而拦截器属于spring框架
怎样实现拦截器
- step1. 写一个java类,实现HandlerInterceptor接口
package com.wjh.netctoss.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class SessionInterceptor implements HandlerInterceptor {
/**
* 最后执行的方法
* 注意:只有当preHandle方法的返回值为true时,该方法才会执行
* ex:是处理器所抛出的异常,可以写一个拦截器,用来处理异常
*/
public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object arg2,Exception ex)throws Exception {
System.out.println("afterCompletion()");
}
/**
*
* 处理器(Controller)的方法已经执行完毕,正准备
* 将处理结果(ModelAndView对象)返回给DispatcherServlet之前
* 执行postHandle方法,可以在该方法里面修改处理结果
*/
public void postHandler(HttpServletRequest request,HttpServletResponse response,Object arg2,ModelAndView arg3) throws Exception{
System.out.println("postHandle()");
}
/**
*
* DispatcherServlets收到请求之后,如果该方法
* 的返回值是true,则继续向后调用;如果返回的是false,则不再向后调用
*arg2:描述的是处理器方法的一个对象
*/
public boolean preHandler(HttpServletRequest request,HttpServletResponse response, Object arg2) throws Exception {
System.out.println("preHandle()");
HttpSession session = request.getSession();
Object obj = session.getAttribute("admin");
if (obj==null) {
//没有登陆,重定向到登录页面
response.sendRedirect("toLogin.do");
}
//已经登陆过,则允许访问
return true;
}
}
- step2. 实现具体的拦截逻辑,比如session验证登陆(部分代码)
//注入参数
@Resource(name="loginService")
private LoginService service;
//登陆界面
@RequestMapping("/toLogin.do")
public String loingController(HttpSession session,HttpServletRequest req) {
String username=req.getParameter("username");
String password=req.getParameter("password");
System.out.println("name:"+username+";pw:"+password);
//调用服务层
try {
Admin admin=service.checkLogin(username, password);
//把admin对象绑定到session
//用于session的验证
session.setAttribute("admin", admin);
} catch (Exception e) {
e.printStackTrace();
if (e instanceof ApplicationException) {
//应用异常,应该明确提示用户
//采取正确操作
req.setAttribute("login_failed", e.getMessage());
return "login";
}
//系统异常,提示用户稍后重试
return "redirect:error.do";
}
return "redirect:success.do";
}
//登陆失败界面
@RequestMapping("/error.do")
public String errorController() {
System.out.println("errorController()");
return "error";
}
//登陆成功界面
@RequestMapping("/success.do")
public String successController() {
System.out.println("successController()");
return "success";
}
- step3. 在sppringmvc.xml中配置拦截器
`<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/toLogin.do" />
<mvc:exclude-mapping path="/login.do" />
<bean class="com.wjh.netctoss.interceptors.SessionInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>`
- 实现逻辑如下:
(3).异常处理
可以将异常抛给spring,由spring来处理这些异常
使用spingMVC提供的一个简单的异常处理器SimpleMappingExceptionTesolver
第一步,添加springmvc配置文件
<!-- 配置简单异常处理器 -->
<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="execptionMappings">
<props>
<prop key="java.lang.Exception">error</prop>
<prop key="com.wjh.netctoss.exception.TimeoutException">login</prop>
</props>
</property>
</bean>
第二布使用@ExceprionHandle注解
- step1.在处理器类中,添加一个异常处理的方法,该方法使用@ExceptionHandle修饰
注:在该方法里面,依据异常类型,分别进行不同的处理
- step2.添加一场处理界面
SpringJDBC
(1)Springjdbc是什么?
Spring对jdbc的封装,使用springjdbc链接数据库,可以不用再写一些重复的代码,比如获取链接、关闭等(本次使用的是Orcale数据库)
(2).如何使用
-
step1.导包:spring-webmvc,spring-jdbc,ojdbc,dbcp,junit
-
step2.添加spring配置文件
-
step3.配置JdbcTemplate文件
-
step4 调用JdbcTemplate提供的方法来访问数据库
数据库
实体
操作
测试