【SpringMVC】@Controller和@RequestMapping注解说明
一、@Controller注解
1、说明:
用于指示Spring类的实例是一个控制器,控制器可以支持同时处理多个请求动作。
2、保证Spring能找到控制器:
(1)在SpringMVC的配置文件的头文件中引入spring-context
(2)使用<context:component-scan/>元素,启动包扫描功能。
注:<context:component-scan base-package="com.lwt.controller"/>可指定扫描包。
二、@RequestMapping注解
1、说明:
该注解用来映射一个请求。指示Spring用哪一个类或非法来处理请求动作。不属于参数绑定注解。
例如:@RequestMapping(value="/hello")
2、支持的属性:
3、常用属性示例:
(1)value属性:将URL映射到方法上。
@RequestMapping(value="/hello")
public ModelAndView hello(){
return ..;
}
地址:http://localhost:8080/context/hello
注:value属性是@RequestMapping注释的默认属性,如果只有唯一的属性,则可以省略该属性名。
value属性的值也可以是一个空字符串。
(2)method属性:该属性用来指示该方法仅仅处理哪些HTTP请求方式。
@RequestMapping(value="/hello",method=RequestMethod.POST)
表示该方法只支持POST请求。
也可以同时支持多个HTTP请求方式:
@RequestMapping(value="/hello",method={RequestMethod.POST,RequestMethod.GET})
注:如果没有指定method属性值,则请求处理方法可以处理任意的HTTP请求方式。
(3)consumes属性:指定处理请求的提交内容类型(Content-Type)
@RequestMapping(value="/hello",method=RequestMethod.POST,consumes="application/json")
表示该方法仅处理request Content-Type为"application/json"类型的请求。
(4)produces属性:指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中所包含的类型。
@RequestMapping(value="/hello" , method=RequestMethod.POST,produces="application/json")
表示该方法仅处理Request请求中请求头中包含了"application/json"的请求,同时指明了返回的内容类型为application/json
(5)params属性:指定request中必须包含某些参数值时,才让该方法处理。
@RequestMapping(value="/hello",method=RequestMethod.POST,params="myParam = myValue")
表示该方法仅处理其中名为"myParam",值为myValue的请求。
(6)hearders属性:该属性指定request中必须包含某些指定的header值,才能让该方法处理请求。
@RequestMapping(value="/hello" , method=RequestMethod.POST,headers="Referer=http://www.lwt.org/")
表示该方法仅处理request的header中包含了指定"Referer"请求头和对应值为"http://www.lwt.org/"的请求。
4、Model和ModelAndView
说明:控制器(Controller)执行业务逻辑,用于产生模型数据(Model),而视图(View),则用于渲染模型数据。
Spring提供了多种途径输出模型数据:
· Model和ModelMap
· ModelAndView
· @ModelAttribute
· @SessionAttributes
(1)Model和 ModelMap
SpringMVC使用了Model接口存储模型数据,ModelMap接口实现了Map接口。
说明:SpringMVC调用处理方法之前会创建一个隐含的模型对象,作为模型数据的存储容器。
如果处理方法为Model或ModelMap类型,则SpringMVC会将数据引用传递给这些参数。
添加模型数据方法:
addObject(String attributeName , Object attributeValue);
实例一:Model和ModelMap的使用
// Controller注解用于指示该类是一个控制器,可以同时处理多个请求动作
@Controller
public class User1Controller {
private static final Log logger = LogFactory.getLog(User1Controller.class);
// @ModelAttribute修饰的方法会先于login调用,该方法用于接收前台jsp页面传入的参数
@ModelAttribute
public void userModel(String loginname, String password, Model model) {
logger.info("userModel");
// 创建User对象存储jsp页面传入的参数
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
// 将User对象添加到Model当中
model.addAttribute("user", user);
}
@RequestMapping(value = "/login1")
public String login(Model model) {
logger.info("login");
// 从Model当中取出之前存入的名为user的对象
User user = (User) model.asMap().get("user");
System.out.println(user);
// 设置user对象的username属性
user.setUsername("测试");
return "result1";
}
}
注意:@ModelAttribute修饰的方法会先于login调用
@ModelAttribute
public void userMode2(String loginname,String password,
ModelMap modelMap){
logger.info("userMode2");
// 创建User对象存储jsp页面传入的参数
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
// 将User对象添加到ModelMap当中
modelMap.addAttribute("user", user);
}
@RequestMapping(value="/login2")
public String login2(ModelMap modelMap){
logger.info("login2");
// 从ModelMap当中取出之前存入的名为user的对象
User user = (User) modelMap.get("user");
System.out.println(user);
// 设置user对象的username属性
user.setUsername("测试");
return "result2";
}
注:将存储对象改为ModelMap
(2)ModelAndView:既包含模型数据信息,也包含视图信息。
添加模型数据:
addObject(String attributeName , Object attributeValue);
设置视图:
setViewName(String viewName);
实例二:ModelAndView的使用
private static final Log logger = LogFactory.getLog(User3Controller.class);
@ModelAttribute
public void userMode3(String loginname,String password,
ModelAndView mv){
logger.info("userMode3");
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
// 将User对象添加到ModelAndView的Model当中
mv.addObject("user", user);
}
@RequestMapping(value="/login3")
public ModelAndView login3(ModelAndView mv){
logger.info("login3");
// 从ModelAndView的Model当中取出之前存入的名为user的对象
User user = (User) mv.getModel().get("user");
System.out.println(user);
// 设置user对象的username属性
user.setUsername("测试");
// 设置返回的视图名称
mv.setViewName("result3");
return mv;
}
推荐阅读
-
springmvc注解@Controller和@RequestMapping
-
SpringMVC配置式开发、注解式开发和控制器参数说明
-
SpringMVC注解说明
-
spring和springmvc的注解总结
-
【SpringMvc学习及总结05】@RequestMapping注解
-
Spring里面的@Controller和@RestController注解的区别
-
springmvc注解RequestBody和ResponseBody
-
SpringMVC(10):实现MVC的两个示例和注解改进
-
Spring-Context注解 @Repository、@Service、@Controller 和 @Component
-
@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别