如何解決中文亂碼
借用上一篇的登陸功能代碼在裏面增加將頁面傳遞的值打印出來
@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