SpringMVC 支持使用 @ModelAttribute 和 @SessionAttributes 在不同的模型(model)和控制器之间共享数据。 @ModelAttribute 主要有两种使用方式,一种是标注在方法上,一种是标注在 Controller 方法参数上。
当 @ModelAttribute 标记在方法上的时候,该方法将在处理器方法执行之前执行,然后把返回的对象存放在 session 或模型属性中,属性名称可以使用 @ModelAttribute(“attributeName”) 在标记方法的时候指定,若未指定,则使用返回类型的类名称(首字母小写)作为属性名称。
@SessionAttributes("user1")
@RequestMapping("/test4.do")
public String test4(AppUser user,Model model){
System.out.println(user);
model.addAttribute("user1",user);
return "1";
}
用于在 请求的 / 后面传递参数
语法:
@PathVariable("xxx")
通过 @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)
@RequestMapping(value=”user/{id}/{name}”)
请求路径:http://localhost:8080/hello/show5/1/james
测试环境:
环境:jdk1.8 Tomcat8.5 idea2018 manven父工程子模块
步骤:
1、创建web工程、引入依赖
2、配置SpringMvc入口文件 --DispatcherServlet--为总调度、web.xml里配置
3、创建Springmvc.xml文件--理解为:适配器(这里不需要自已指定适配、springmvc会自动指定)--视图解析器
4、创建 业务处理器 Controller类
5、测试
业务处理器HelloController.java
package com.day01springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
/**
* @ Author :ShaoWei Sun.
* @ Date :Created in 20:58 2018/11/16
*/
@Controller
@RequestMapping("hello")
public class HelloController2 {
/**
*3、占位符映射
* 语法:@RequestMapping(value=”user/{userId}/{userName}”)
* 请求路径:http://localhost:8080/hello/show5/1/james
* @param ids
* @param names
* @return
*/
@RequestMapping("show5/{id}/{name}")
public ModelAndView test5(@PathVariable("id") Long ids ,@PathVariable("name") String names){
ModelAndView mv = new ModelAndView();
mv.addObject("msg","占位符映射:id:"+ids+";name:"+names);
mv.setViewName("hello2");
return mv;
}
}
@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。
参数传递
参数传递
@RequestMapping("/test1") //传递参数
public String test1(@RequestParam("param")String str){
System.out.println(str);
return "1"; //跳转的页面
}
@RequestParam 和 @PathVariable 注解都是用于从request中接收请求,两个都可以接收参数,
不同:@RequestParam 从request里面拿取值,@PathVariable 从一个URI模板里面来填充
演示:
Request URL:http://api.baidu.com/api/item/spec/groups?param1=3¶m2=4
@RequestParam 是从request里面拿取值,
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
@PathVariable 是从一个URI模板里面来填充
Request URL:http://api.baidu.com/api/item/spec/groups/79
@RestController
@RequestMapping("spec")
public class SpecificationController {
@Autowired
private SpecificationService specificationService;
@GetMapping("groups/{cid}")
public ResponseEntity> querySpecGroups(@PathVariable("cid") Long cid){
List list = this.specificationService.querySpecGroups(cid);
if(list == null || list.size() == 0){
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
return ResponseEntity.ok(list);
}
}
@RestController
public class HelloController {
@RequestMapping("/hellopv/{name}")
public String helloPV(@PathVariable String name, @RequestParam String username) {
String hello = "Hello " + username + " [" + name + "] !";
return hello;
}
}
@PathVariable是处理requet uri template中variable 的注解,实现了url入参绑定到方法参数上。
即:可以获取URL请求路径中的变量值,比如:RequestMapping("/hellopv/{name}")中的name
@RequestParam获取URL请求数据,是常用来处理简单类型的绑定注解。
通过Request.getParameter()获取入参,故此可以处理url中的参数,也可以处理表单提交的参数和上传的文件。
拓展
handler method 参数绑定常用的注解,根据处理的Request的不同内容分为四类常用类型
A、处理requet uri 部分(指uri template中variable)的注解: @PathVariable;
B、处理request header部分的注解: @RequestHeader, @CookieValue;
C、处理request body部分的注解:@RequestParam, @RequestBody;
D、处理attribute类型是注解: @SessionAttributes, @ModelAttribute;
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
$("#btn").click(function(){
var f = $("#forms").serializeArray();
$.ajax({
url:"test3.do",
data:f,
type:"post",
dataType:"json",
success:function(data){
console.log(data.success);
if(data.success){
alert("成功");
}else{
$("#forms").find("span").show();
}
}
})
})
@ResponseBody
@RequestMapping("/test3.do")
public String test3(AppUser user){
String result = "";
System.out.println(user);
if(user.getUsername().equals("dhb")&&user.getPassword().equals("123")){
result = "{\"success\":true}";
}else{
result = "{\"success\":false}";
}
return result; //把数据返回
}