您的位置:首页 > 编程语言 > Java开发

SpringMVC注解备注

2015-12-16 15:37 302 查看

@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 定义处
,
加上 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中的哪个变量就应该这样表示。

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: