註解驅動的控制器,將請求對映到處理器

duruiyang603發表於2015-09-18
即使用 DefaultAnnotationHandlerMapping
WEB-INF/ name-servlet.xml中需要:
<!-- 自動掃描的包名 -->
<context:component-scan base-package="com.gome.memberFront.web" />
<mvc:annotation-driven />



對於@Controller標註的類,以及這種類裡的方法,可以使用@RequestMapping("url路徑")註解來指定其處理來自何url的請求 。

例如:
@Controller
@RequestMapping("complaint")
public class MyController {
@RequestMapping("getComplaintList")
 public Object getComplaintList(HttpServletRequest request, HttpServletResponse response) {
    }
}
則該類處理來自 web應用部署路徑/complaint的請求,該方法處理來自 web應用部署路徑/complaint/getComplaintDiffs的請求。
類處的引數("value")可以省略,讓方法處的引數改為("complaint/getComplaintList")即可。


@RequestMapping不但支援標準的URL,還支援帶?、 * 、** 、{xxx}佔位符的URL,例如:

/user/*/createUser      匹配/user/aaa/createUser  
/user/**/createUser       匹配/user/aaa/bbb/createUser 、 /user/createUser  
/user/createUser??       匹配/user/createUseraa
/user/{userId}       匹配user/123
在對應方法中,形參位置,可以使用(@PathVariable("userId"),將url中的實參與形參進行繫結

在處理類中,最後要返回ModelAndView,準備下一步通過ViewResolver解析

處理方法簽名(view向controller傳值)
1,使用@RequestParam繫結請求引數值,RequestParam有三個引數,value(引數名)、required(是否必須)、defaultValue(預設引數名,不常用):
@Controller
@RequestMapping("complaint")
public class MyController {
      @RequestParam(value="userName",required=false)String userName;
}

2,使用@CookieValue繫結請求中的Cookie值
public class MyController {
      @CookieValue(value="sessionId",required=false)String sessionId;
}

3,使用@RequestHeader繫結請求報文頭的屬性值
public class MyController {
      @RequestHeader(value="Accept-Encoding")String encoding;
}

controller向view傳值
在controller的函式引數中增加一個 Model m,在函式體中使用m.addAttribute("key",value),可以將值傳入view


使用json作為資料傳輸媒介:
不再需要向view層傳ModelAndView,而是需要配置好json相應的型別轉換器等,如下
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jsonHttpMessageConverter" />
            </list>
        </property>
    </bean>

    <bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>application/json;charset=UTF-8</value>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>

然後可以在controller最後使用@ResponseBody,表示該方法的返回結果直接寫入HTTP response body中,方法的返回值也不再是ModelAndView,而是String或者Object
由此,便可以將Map或者物件以json的形式返回前端。



相關文章