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

发布了23 篇原创文章 · 获赞 5 · 访问量 1478

猜你喜欢

转载自blog.csdn.net/zj499063104/article/details/97892675