spring-mvc注解

关键注解

springmvc的关键注解主要有@Controller/@RequestMapping/@RequestParam/@PathVariable/@RequestHeader/@CookieValue/@SessionAttributes/@ModelAttribute
其中@Controller主要是用于标记该类是一个控制器,@RequestMapping用于指示spring的哪个类或方法来处理请求动做,即用于标识具体的处理器。html

Model/ModelAndView和ModelMap的区分

每一个请求处理方法能够有多个不一样类型的参数,能够出如今请求处理方法中的参数类型有: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

@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>

Json数据转换

若是要想使用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){....}
}
相关文章
相关标签/搜索