springmvc的关键注解主要有@Controller/@RequestMapping/@RequestParam/@PathVariable/@RequestHeader/@CookieValue/@SessionAttributes/@ModelAttribute
其中@Controller主要是用于标记该类是一个控制器,@RequestMapping用于指示spring的哪个类或方法来处理请求动做,即用于标识具体的处理器。html
每一个请求处理方法能够有多个不一样类型的参数,能够出如今请求处理方法中的参数类型有:HttpServletRequest/HttpServletResponse/HttpSession/WebRequest/NativeWebRequest/Locale/InputStream/OutputStream/Principal/Map/Model/ModelMap/RedirectAttributes/Errors/BindingResult/SessionStatus/UriComponentsBuilder等。举例以下:若须要访问HttpSessionweb
@RequestMapping("") public String login(HttpSession session){....}
Model是一个Spring MVC类型,其中包含了Map对象用来存储数据,若是方法中添加了Model参数,则每次调用请求处理方法时,SpringMVC都会建立model对象,并将其做为参数传递给方法。spring
如何将模型数据传递给控制器和视图是Spring MVC的一项重要工做,Spring MVC主要提供了多种途径,下面分类进行介绍:
1.Model和ModelMap: Spring MVC在内部使用了一个Model接口存储数据模型数据,它的功能相似于Map接口,可是比map接口容易使用,而ModelMap接口实现了Map接口。Spring MVC在调用处理方法以前会建立一个隐含的模型对象,做为模型数据的存储容器,若是处理方法的参数有Model或ModelMap类型,则Spring MVC会将隐含模型的引用传递给这些参数,在处理方法内部,开发者就能够经过这些参数来引用模型数据,固然也能够向模型中添加新的属性。
2.ModelAndView :其和Model差很少,可是其不只包含模型数据,还包含视图信息,能够经过ModelAndView设置其视图路径:举例以下:json
@RequestMapping("") public ModelAndView login(ModelAndView mv){ mv.setViewName("视图路径"); return mv; }
@RequestParam举例以下:
注意:一旦使用了@RequestParam注解,就要求前台必须传递@RequestParam要求的参数,不然后台就不会响应session
@RequestMapping("") public ModelAndView login(@RequestParam("loginname") String loginname, @RequestParam("password") String password){ .......... }
@PathVariable
用于获取URL中的动态参数mvc
URL:http://localhost:8080/pathtest/1 @RequestMapping("/pathtest/{userId}") public ModelAndView login(@PathVariable Integer userId){ .......... } //上例中userId就是动态参数
@RequestHeader
用于将请求头中的信息映射处处理方法的参数中,举例以下:app
@RequestMapping("/pathtest") public ModelAndView login(@RequestHeader("User-Agent") String userAgent){ .......... }
@CookieValue
用于将请求的Cookie数据映射到功能处理的方法参数上。ui
@RequestMapping("/pathtest") public ModelAndView login(@CookieValue("JSESSIONID") String sessionId){ .......... }
@SessionAttribute
容许咱们有选择地指定Model中哪些属性须要存储到HttpSession对象中
注意@SeesionAttribute只能声明在类上,不能声明在方法上编码
@Controller @SessionAttribute('user') public class SessionController{......}
@ModelAttribute注解的方法,会在请求进入处理方法以前,先拦截请求,作过处理后再将请求转发给具体的处理方法,举例以下:url
@Controller public class ModelAttributeController{ @ModelAttribute("loginname") public String userModel(RequestParam(loginname) String loginname){ //使用@ModelAttribute注释的value属性,来指定model属性的名称,model属性的值就是方法的返回值 return loginname; } @RequestMapping("/login") public String loing1(){ return "result" } } 上例中,在请求进入login1方法以前,请求会先进入userModel方法 @Controller public class ModelAttributeController{ @ModelAttribute public String userModel(String loginname,Model model){ //model中将会存储一个参数(String=loginname) return loginname; } @RequestMapping("/login") public String loing1(Model model){ return "result" } } @Controller public class ModelAttributeController{ @ModelAttribute("username") @RequestMapping("/login") public String loing1(Model model){ return "result" } } 上述示例中,@ModelAttribute和@RequestMapping同时注释一个方法,loing1的返回值再也不是视图名称,而是model的属性值,视图名称是@RequestMapping的value值“login” @Controller public class ModelAttributeController{ @ModelAttribute("user") public User userModel5(){ .... } @RequestMapping("/login") public String login5(@ModelAttribute("user") User user){ return "result" } } //上例中userModel5(...)方法先于login5(...)方法调用,userModel5(...)方法会在Model中添加一个属性,key是@ModelAttribute的值“user”,value是userModel5(...)方法的返回值。 login5(...)方法中的@ModelAttribute的意思是将Model中的user属性赋值给login5(...)的方法参数。
Spring3.0 新增长了一个重要信息转换接口HttpMessageConverter<T>,该接口负责将请求信息转换为一个对象,对象类型为T,并将转换后的对象绑定到请求方法的参数中。DispatcherServlrt默认已经装配了RequeestMappingHandlerAdapter做为HandlerAdapter组件的实现类,而HttpMessageConverter由RequestMappingHandlerAdapter使用,将请求信息转换为对象。
HttpMessageConverter接口的具体实现类有:StringHttpMessageConverter ,FormHttpMessageConverter ,XmlAwareFormHttpMessageConverter ,ResourceHttpMessageConverter ,SourceHttpMessageConverter ,ByteArrayHttpMessageConverter等。
RequestMappingHandlerAdapter能够默认已经安装了几个HttpMessageConverter,若是须要装配其余类型的HttpMessageConverter,须要自定义一个RequestMappingHandlerAdapter,举例以下:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingAdapter"> <property name="messageConverter"> <list> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"> ...... </list> </property> </bean>
若是要想使用SpringMVC处理JSON格式的数据,首先须要在RequestMappingAdapter上配置JSONX信息转换器,以下所示:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingAdapter"> <property name="messageConverter"> <list> <bean class="org.springframework.http.converter.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html</value> <value>application/json</value> </list> </property> </bean> ...... </list> </property> </bean>
@Requestbody注解用于读取Request请求中的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,而后把相应的数据绑定到Controller中方法的参数上。当前台页面使用GET或POST方法提交数据时,数据编码格式由请求头的ContentType指定,能够分为如下几种状况:
1.application/x-www-form-urlencoded,这种状况能够由@RequestBody处理也能够由其余注解处理;
2.multipart/form-data,@RequestBody不能处理这种格式;
3.application/json、application/xml等格式的数据,必须使用@RequestBody来处理;
在实际开发中可使用@RequestBody注解很方便地接收JSON格式的数据,并将其转换为对应的数据类型。@RequestBody的使用举例以下:
@Controller public class JsonController{ @RequestMapping("/json") @ResponseBody public Map<String,String> testJson(@RequestBody Book book){....} }