如何解决中文乱码
借用上一篇的登陆功能代码在里面增加将页面传递的值打印出来
@RequestMapping("/checkLogin3.do")
public String checkLogin3(String username, String password, ModelMap model, HttpSession session) {
if("root".equals(username) && "1234".equals(password)) {
model.put("user", username);
session.setAttribute("username", username);
return "ok";
}
model.put("msg", "用户名或密码错误");
System.out.println("username:"+username);
System.out.println("password:"+password);
return "login";
}
此时页面输入
控制台打印结果显示乱码
解决方案:
在web.xml增加编码设置
<filter>
<filter-name>myfilter</filter-name>
<!-- spring-web.jar中字符编码设置 -->
<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>myfilter</filter-name>
<!-- 以.do结尾的请求,都设置成此编码 -->
<url-pattern>*.do</url-pattern>
</filter-mapping>
控制台打印结果显示正确
如何处理异常
创建类,该类发出error.do请求会抛出java.lang.NullPointerException
package cn.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ExceptionController {
@RequestMapping("/error.do")
public String execute() {
String a =null;
int b= a.length();
return "ok";
}
}
现象
一、全局异常处理
在aplicationContext.xml中增加配置
<!-- 异常处理器,全局异常处理方法 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- <prop key="异常类型">视图名</prop> -->
<prop key="java.lang.Exception">error</prop>
</props>
</property>
</bean>
增加报错显示页面error.jsp,报错之后显示此页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
系统繁忙
</body>
</html>
二、自定义ExceptionResolver
这种也是全局的,但是在程序出现异常的时候可以做一些自定义的事,比如:将堆栈信息写入文件
增加自定义类MyExceptionHandler.java,此类需要继承HandlerExceptionResolver
package cn.springmvc.exception;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class MyExceptionHandler implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(
HttpServletRequest request
, HttpServletResponse respone
, Object method, Exception e) {
//将异常信息写入文件
System.out.println("将异常信息写入文件:"+e);
ModelAndView mav = new ModelAndView("error");
return mav;
}
}
在applicationContext.xml增加配置
<!-- 使用自定义的ExceptionResolver -->
<bean class="cn.springmvc.exception.MyExceptionHandler"></bean>
三、局部异常处理
增加AgeController.java
package cn.springmvc.controller;
import java.util.Calendar;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class AgeController {
@RequestMapping("/age.do")
public String age() {
return "age";
}
@RequestMapping("/agecal.do")
public String ageCal(String birth, HttpSession session) {
int now = Calendar.getInstance().get(Calendar.YEAR);
int bir = Integer.valueOf(birth.substring(0,10));
session.setAttribute("age", now-bir+"");
return "age";
}
//当前Controller异常处理,
//执行该方法后,不会再调用ExceptionResolver
@ExceptionHandler//局部异常处理方法
public String handlerException(HttpServletRequest request, Exception e) {
request.setAttribute("msg", "程序出错"+e);
return "age";
}
}
增加age.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="agecal.do" method="post">
输入生日:<input type="text" name="birth">
<input type="submit" value="开始计算">
</form>
${age }<br>
${msg }
</body>
</html>
显示效果
如何实现登录权限检查(拦截器)
实现方法:1.采用Filter;2.采用拦截器
这里介绍:2.采用拦截器
a.拦截器组件简介
拦截器组件是SpringMVC特有组件。
拦截器组件可以在Controller之前拦截;
也可以在Controller之后拦截;
还可以在JSP解析完毕给浏览器输出之前
拦截。
b.拦截器使用方法
首先编写一个拦截器组件LoginInterceptor.java(实现handlerInterceptor接口) ,在约定方法中添加要插入的逻辑
package cn.springmvc.interceptor;
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 LoginInterceptor implements HandlerInterceptor{
//controller之前做拦截
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception
{
System.out.println("----实现登陆检查----");
HttpSession session = request.getSession();
String username = (String) session.getAttribute("username");
if(username !=null && !"".equals(username)) {
return true;
}
response.sendRedirect("login.do");
return false;
}
//controller之后做拦截
public void postHandle(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse, Object obj, ModelAndView modelandview)
throws Exception
{
}
//请求处理完毕,输出之前
public void afterCompletion(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse, Object obj, Exception exception)
throws Exception
{
}
}
然后在applicationContext.xml中配置
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截那些请求 -->
<mvc:mapping path="/**"/>
<!-- 放过哪些请求 -->
<mvc:exclude-mapping path="/login.do"/>
<mvc:exclude-mapping path="/checkLogin3.do"/>
<bean class="cn.springmvc.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
启动服务,此时直接请求list.do或者age.do都会跳转到login.do,直到登陆成功之后才可以请求list.do或者age.do