1 requestMapping-method:使用method属性指定用户的请求方式:
get:
//指定some.do只能使用get请求方式
//405 - Request method 'POST' not supported
@RequestMapping(value="/some.do",method=RequestMethod.GET)
public ModelAndView doSome(){ 方法体 }
post:
//指定first.do只能使用post方式
//HTTP Status 405 - Request method 'GET' not supported
@RequestMapping(value="/first.do",method=RequestMethod.POST)
public ModelAndView doFist(){ 方法体 }
2.receiveParameter-property:接收请求的参数
(1)逐个接收
逐个接收请求参数:要求是处理器方法的形参名和请求中参数名一样
框架接收参数:
.执行处理器方法时,名称传递参数
* doSome(strName,Integer.parseInt(strAge));
* 框架可以实现String-int, long ,float,double等的类型转换。
( 2 )更改参数名接收
receiveParameter-requestParam:在逐个接收参数中, 如果请求中参数名和形参名不一样,
需要在处理器方法的形参前面加入@RequestParam(value=“请求中参数名”)
/**
* 逐个接收请求参数:要求是处理器方法的形参名和请求中参数名一样
* 使用RequestParam解决参数名称不一样的问题
* @RequestParam
* 属性: value 请求中参数名
* required 是boolean类型的
* true,默认值,表示请求中必须有此参数
* false,可以没有参数
*
*/
@RequestMapping(value="/some.do")
public ModelAndView doSome(@RequestParam(value="rname",required=false) String name,
@RequestParam(value="rage",required=false) Integer age){ 方法体 }
//value="rname" 中rname 为request中传递的参数名
(3)改为自创的对象接收
receiveParameter-object:使用对象接收请求的多个参数。
要求是:请求中参数名和对象的属性名一样。
1 实体类 ,Student(name ,age)
2 /**
* 请求传递的参数 name age
* 用对象接收请求的参数:要求对象的属性名和请求中参数名一样
*/
@RequestMapping(value="/some.do")
public ModelAndView doSome(Student student){
//Student 实体类中的 数据类型 和request请求中传递的参数一致
}
3 返回不同的视图
returnString-viewName:处理器方法的返回值表示请求的处理结果。
处理器方法返回String , 这个String表示视图。
视图可以是:
1.逻辑视图,需要配置视图解析器
2.完整视图路径, 不能配置视图解析器。
springmvc.xml 中代码 :
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀:表示视图的目录位置 -->
<property name="prefix" value="/WEB-INF/view/" />
<!-- 后缀:表示视图文件的扩展名 -->
<property name="suffix" value=".jsp" />
</bean>
(1)完整视图路径
@RequestMapping(value="/some.do")
public String doSome(HttpServletRequest request, String name,Integer age){
*****
//框架对视图执行 forward
return "/WEB-INF/view/show.jsp";
}
产生结果:HTTP Status 404 - /
11-returnString-viewName/WEB-INF/view/WEB-INF/view/show.jsp.jsp 地址错误
(2)视图逻辑名称
@RequestMapping(value = "/some2.do")
public String doSome2(HttpServletRequest request, String name, Integer age) {
// 框架对视图执行 forward
return "show";
}
4 forward:转发操作,使用forward:
转发有两个目的地:
1.视图页面,语法forward:视图完整路径
2.其他处理器,语法 forward:xxx.do
列1
/**
* 处理器方法返回ModelAndView,实现转发到视图页面
* 语法 mv.setViewName("forward:视图完整路径")
*
* forward的特点是不和视图解析器一同工作,就当项目中没有视图解析器。
*/
@RequestMapping(value="/some.do")
public ModelAndView doSome( String name,Integer age){
ModelAndView mv = new ModelAndView();
/**
* 使用forward:显示指定转发操作,不和视图解析器一同工作
* 语法 mv.setViewName("forward:视图完整路径")
*/
//mv.setViewName("forward:/WEB-INF/view/show.jsp");
mv.setViewName("forward:/first.jsp");
return mv;
}
列2
处理器方法返回String,使用forward:转发到视图
@RequestMapping("/other.do")
public String doOther(String name,Integer age){
return "forward:/first.jsp";
}
列3
/**
* 使用forward:转发到其他的处理器方法,由其他的处理器方法继续处理请求。
* 语法,forward:xxx.do
*/
``@RequestMapping(value="/forward.do")
public ModelAndView doForward( String name,Integer age){`
ModelAndView mv = new ModelAndView();
mv.setViewName("forward:process.do");
return mv;
}
//继续处理请求的处理器方法
@RequestMapping("process.do")
public String doProcess(){
System.out.println("=====执行了doProcess=====");
//逻辑视图
return "show";
}
5 redirect:重定向操作,使用redirect:
重定有两个目的地:
1.视图页面,语法redirect:视图完整路径
2.其他处理器,语法 redirect:xxx.do
/**
* 处理器方法返回ModelAndView,实现重定向到视图页面
* 语法 mv.setViewName("redirect:视图完整路径")
*
* redirect的特点是不和视图解析器一同工作,就当项目中没有视图解析器。
*
* redirect的操作:
* 1.不能访问受保护的/WEB-INF资源
* 2.放入到Model中的简单类型的数据可被转为String作为get请求的参数传递。
* 对象类型不能转为String,不能作为参数传递。
* 3.在目标页面中,使用${param.参数名}获取数据。 实现两次请求中间的数据传递。
*/
列1
@RequestMapping(value="/some.do")
public ModelAndView doSome( String name,Integer age){
/**
* 使用redirect:重定向操作,不和视图解析器一同工作
* 语法 mv.setViewName("redirect:视图完整路径")
*/
ModelAndView mv = new ModelAndView();
//不能访问/WEB-INF/资源
//mv.setViewName("redirect:/WEB-INF/view/show.jsp");
mv.setViewName("redirect:/first.jsp");
return mv;
}
列2 处理器方法返回String,使用redirect:重定向到视图
@RequestMapping("/other.do")
public String doOther(String name,Integer age){
System.out.println("执行处理器的doOther() name:"+name+"|age:"+age);
return "redirect:/first.jsp";
}
列3
/**
* 使用redirect:重定向到其他的处理器方法,由其他的处理器方法继续处理请求。
* 语法,redirect:xxx.do
*/
@RequestMapping(value="/redirect.do")
public ModelAndView doForward( String name,Integer age){
System.out.println("执行处理器的doSome() name:"+name+"|age:"+age);
//调用Service处理请求,把结果放到ModelAndView
ModelAndView mv = new ModelAndView();
mv.addObject("myname",name);
mv.addObject("myage",age);
//重定向到其他的处理器,redirect:xxx.do
mv.setViewName("redirect:process.do");
//http://localhost:8080/myweb/process.do?myname=zs&myage=20
return mv;
}
//继续处理请求的处理器方法
@RequestMapping("process.do")
public String doProcess(String myname,Integer myage){
System.out.println("=====执行了doProcess=====myname:"+myname+" myage:"+myage);
//逻辑视图
return "show";
}
6 customExceptionHandler:自定义异常处理器。
springmvc框架处理异常的模型(方式):集中的方式处理异常,把异常的处理逻辑放到一个公共的位置(class)
框架把能处理的类叫做异常处理器, 所有的异常处理器必须实现HandlerExceptionResolver接口
在异常处理器类实现异常的处理, 当处理器类发生异常时,中央调度器对象会调用异常处理器类处理异常。
(1)定义三个异常类:NameException、AgeException、MyUserException。其中 MyUserException
是另外两个异常的父类。
(2) 修改 Controller
(3) 定义异常处理器 : 当一个类实现了 HandlerExceptionResolver 接口后,只要有异常发生,
无论什么异常,都会自动执行接口方法 resolveException()
(4) 注册异常处理器
springmvc.xm中
7 annotationExceptionHandler:使用注解处理异常
/**
* 全局异常处理器
* @ControllerAdvice:控制器增强,把处理器方法中的异常处理逻辑做为切面使用。
* 位置:类定义的上面
*
*/
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* @ExceptionHandler
* 属性:value 是异常类的class
* 位置:方法的上面
*/
@ExceptionHandler(value=NameException.class)
public ModelAndView doNameException(Exception ex){ }
//处理其他异常
@ExceptionHandler
public ModelAndView doOtherException(Exception ex){ }
}