虽然网址上传递了参数,但name和age取不到参数,因为重定向是两次请求,参数在第一次请求的作用域里面,无法直接传递到第二个作用域。此时修改hello.jsp,直接访问第一次请求作用域里面的参数。
hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>show.jsp</h3><br/>
<h3>name数据:${param.name}</h3>
<h3>age数据:${param.age}</h3>
<!--使用request对象中的getParameter方法,可以访问到第一次request作用域-->
<h3>取参数数据:<%=request.getParameter("name")%></h3>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
成功取到参数,如下图
异常处理
springmvc框架采用的是统一,全局的异常处理。把controller中的所有异常处理都集中到一个地方,采用的是aop思想,把业务逻辑和异常处理代码分开。也叫解耦(ou)合。
使用两个注解:1、ExceptionHandler 2、ControllerAdvice
异常处理主要步骤:
1 新建一个自定义异常类 MyUserException,再定义它的子类 NameException,AgeException
2 在 controller 抛出 NameException,AgeException
3 创建一个普通类,作为 全局异常处理类
1> 类上面加上 @ControllerAdvice
2> 类中方法上面加上 @ExceptionHandler
4 创建对应视图。创建组件扫描器扫描,扫描全局变量处理程序。创建注解驱动。
1
2
3
4
5
6
7
8
项目结构如下
springmvc.xml,加入组件扫描器和注解驱动
<!--处理异常两个步骤-->
<!--1、组件扫描器:扫描全局异常处理程序-->
<context:component-scan base-package="com.zh.handler"/>
<!--2、注解驱动-->
<mvc:annotation-driven/>
1
2
3
4
5
6
7
MyController.java,控制器方法,向 MyUserException 抛出异常
@Controller
public class MyController {
@RequestMapping(value = "/some.do")
public ModelAndView doSome(String name,Integer age) throws MyUserException {
ModelAndView mv = new ModelAndView();
//根据请求抛出异常
if (!"zs".equals(name)){
throw new NameException("姓名不正确");
}
if (age <= 0 || age >= 99){
throw new AgeException("年龄输入有误");
}
mv.addObject("name",name);
mv.addObject("age",age);
mv.setViewName("show");
return mv;
}
}
自定义异常类 MyUserException.java,继承 Exception
public class MyUserException extends Exception{
public MyUserException() {
super();
}
public MyUserException(String message) {
super(message);
}
}
子类 NameException.java
//表示当前用户姓名有异常,抛出NameException
public class NameException extends MyUserException {
public NameException() {
super();
}
public NameException(String message) {
super(message);
}
}