SpringMVC注解备注

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

相关推荐