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){....}
}
相關文章
相關標籤/搜索