技术栈

主页 > 后端开发 >

spring-mvc注解

关键注解

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

Model/ModelAndView和ModelMap的区分

每个请求处理方法可以有多个不同类型的参数,可以出现在请求处理方法中的参数类型有:HttpServletRequest/HttpServletResponse/HttpSession/WebRequest/NativeWebRequest/Locale/InputStream/OutputStream/Principal/Map/Model/ModelMap/RedirectAttributes/Errors/BindingResult/SessionStatus/UriComponentsBuilder等。举例如下:若需要访问HttpSession

@RequestMapping("")
public String login(HttpSession session){....}

Model是一个Spring MVC类型,其中包含了Map对象用来存储数据,如果方法中添加了Model参数,则每次调用请求处理方法时,SpringMVC都会创建model对象,并将其作为参数传递给方法。

如何将模型数据传递给控制器和视图是Spring MVC的一项重要工作,Spring MVC主要提供了多种途径,下面分类进行介绍:
1.Model和ModelMap: Spring MVC在内部使用了一个Model接口存储数据模型数据,它的功能类似于Map接口,但是比map接口容易使用,而ModelMap接口实现了Map接口。Spring MVC在调用处理方法之前会创建一个隐含的模型对象,作为模型数据的存储容器,如果处理方法的参数有Model或ModelMap类型,则Spring MVC会将隐含模型的引用传递给这些参数,在处理方法内部,开发者就可以通过这些参数来引用模型数据,当然也可以向模型中添加新的属性。
2.ModelAndView :其和Model差不多,但是其不仅包含模型数据,还包含视图信息,可以通过ModelAndView设置其视图路径:举例如下:

@RequestMapping("")
public ModelAndView login(ModelAndView mv){
    mv.setViewName("视图路径");
    return mv;
}

参数绑定

@RequestParam举例如下:
注意:一旦使用了@RequestParam注解,就要求前台必须传递@RequestParam要求的参数,否则后台就不会响应

@RequestMapping("")
public ModelAndView login(@RequestParam("loginname") String loginname,
                          @RequestParam("password") String password){
    ..........
}

@PathVariable
用于获取URL中的动态参数

URL:http://localhost:8080/pathtest/1
@RequestMapping("/pathtest/{userId}")
public ModelAndView login(@PathVariable Integer userId){
    ..........
}
//上例中userId就是动态参数

@RequestHeader
用于将请求头中的信息映射到处理方法的参数中,举例如下:

@RequestMapping("/pathtest")
public ModelAndView login(@RequestHeader("User-Agent") String userAgent){
    ..........
}

@CookieValue
用于将请求的Cookie数据映射到功能处理的方法参数上。

@RequestMapping("/pathtest")
public ModelAndView login(@CookieValue("JSESSIONID") String sessionId){
    ..........
}

@SessionAttribute
允许我们有选择地指定Model中哪些属性需要存储到HttpSession对象中
注意@SeesionAttribute只能声明在类上,不能声明在方法上

@Controller
@SessionAttribute('user')
public class SessionController{......}

@ModelAttribute

@ModelAttribute注解的方法,会在请求进入处理方法之前,先拦截请求,做过处理后再将请求转发给具体的处理方法,举例如下:

@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){....}
}
责任编辑:admin     二维码分享:
本文标签: java