@Controller控制层
@Service业务逻辑层
@Repository持久层(也就是dao层)
@Entity实体
@PathVariable
@RequestParam
@RequestMapping
@Autowired
@SuppressWarning废弃警告
@ModelAttribute注释的值在此Controller中每个方法执行前被执行,因此对于一个Controller映射多个URL的用法来说需谨慎使用(此注释的value值就是Model的属性的名称)
@SessionAttributes作用就是在Controller中共享Model属性
public String test1(@ModelAttribute("user") UserModel user)
只是此处多了一个注解@ModelAttribute("user"),
它的作用是将该绑定的命令对象以“user”为名称
@ModelAttribute可以在方法上使用和在方法参数上使用还有方法和参数上同时使用
(1)方法参数上使用
@requestMapping("b")
public String add(@ModelAttribute "a"){
return "result";
}
会先从model中获取key为a的对象,如果获取不到就反射实例化一个对象
(2)方法上使用
@ModelAttribute("user2")
public User addUser(User user){
user.setName("meihf");
return user;
}
这样的话在Controller中使用@RequestMapping方法前都会执行这个方法,而且会添加两个对象到Model先添加key为user的对象,再添加key为user1的对象
(3)在方法和方法参数上都有
@ModelAttribute("user1")
public User addUser(User user) {
return new User(520,"I love U");
}
@RequestMapping("/save")
public String save(@ModelAttribute User user) {
user.setUsername("U love me");
userService.save(user);
return "result";
}
假设要执行保存用户操作,根据一分析可知,先执行完会产生两个User类型的对象(一个key是"user",另一个key是"user1")添加到model,
再执行save方法,此时会先从model去找key为"user"的对象,能找到再从request取值set到这个User对象.最后返回到jsp页面,model里也只有两个User类型对象.
@Controller
@RequestMapping("user")
@SessionAttributes("test")
public class UserController {
@RequestMapping(value = "test1")
public String test1(HttpServletRequest request) {
User user = new User("xiejx618");
request.getSession().setAttribute("test",user);
return "user/list";
}
@RequestMapping(value = "test2")
public String test2(@ModelAttribute("test") User user,SessionStatus sessionStatus) {
System.out.println(user.getUsername());
sessionStatus.setComplete();
return "user/list";
}
}
Session 属性的 controller 上加上 @SessionAttributes,然后在 action 需要的 User 参数上加上
@ModelAttribute,并保证两者的属性名称一致。
SpringMVC 就会自动将 @SessionAttributes 定义的属性注入到 ModelMap 对象,
使用这种方案,还需要在 SpringMVC 配置文件的 ViewResolver 定义处
![搜索](https://i-blog.csdnimg.cn/blog_migrate/2e2e8c3e741e87eb578b229da420b61e.png)
,
加上 p:allowSessionOverride="true"
@Controller
public class GameController {
@Autowired
public void setGameService(GameService gameService) {
this.gameService = gameService;
}
@RequestMapping("{level}/ShowPrize")
public String getPrizeByLevel(@PathVariable int level,HttpServletRequest request){
System.out.println(level+"Controller");
int prize=gameService.getPrizeByLevel(level);
request.setAttribute("prize",prize);
return "ShowPrize";
}
}
重点讲一下PathVariable和RequestParam:
他们都有共同的特点像上面没有指明参数的时候PV会默认从url中找与变量名同名的值,RP是从request请求中寻找:完整的应是:@PathVariable("level") int level如果方法参数的名称跟RequestMapping中定义的访问路径中的变量名不一样,或者我要利用PathVariable明确指定后面接的方法参数是对应于URL中的哪个变量就应该这样表示。