SSM框架(Spring + SpringMVC + MyBatis)學習筆記(2),第二課:SpringMVC

如何解決中文亂碼

借用上一篇的登陸功能代碼在裏面增加將頁面傳遞的值打印出來

	@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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章