Spring MVC與Struts從原理上很類似(都是基於MVC架構),都有一個控制頁面請求的Servlet,處理完後跳轉頁面。看以下代碼(註解):java
[java] view plaincopyweb
package controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import entity.User; @Controller //相似Struts的Action public class TestController { @RequestMapping("test/login.do") // 請求url地址映射,相似Struts的action-mapping public String testLogin(@RequestParam(value="username")String username, String password, HttpServletRequest request) { // @RequestParam是指請求url地址映射中必須含有的參數(除非屬性required=false) // @RequestParam可簡寫爲:@RequestParam("username") if (!"admin".equals(username) || !"admin".equals(password)) { return "loginError"; // 跳轉頁面路徑(默認爲轉發),該路徑不須要包含spring-servlet配置文件中配置的前綴和後綴 } return "loginSuccess"; } @RequestMapping("/test/login2.do") public ModelAndView testLogin2(String username, String password, int age){ // request和response沒必要非要出如今方法中,若是用不上的話能夠去掉 // 參數的名稱是與頁面控件的name相匹配,參數類型會自動被轉換 if (!"admin".equals(username) || !"admin".equals(password) || age < 5) { return new ModelAndView("loginError"); // 手動實例化ModelAndView完成跳轉頁面(轉發),效果等同於上面的方法返回字符串 } return new ModelAndView(new RedirectView("../index.jsp")); // 採用重定向方式跳轉頁面 // 重定向還有一種簡單寫法 // return new ModelAndView("redirect:../index.jsp"); } @RequestMapping("/test/login3.do") public ModelAndView testLogin3(User user) { // 一樣支持參數爲表單對象,相似於Struts的ActionForm,User不須要任何配置,直接寫便可 String username = user.getUsername(); String password = user.getPassword(); int age = user.getAge(); if (!"admin".equals(username) || !"admin".equals(password) || age < 5) { return new ModelAndView("loginError"); } return new ModelAndView("loginSuccess"); } @Resource (name = "loginService") // 獲取applicationContext.xml中bean的id爲loginService的,並注入 private LoginService loginService; //等價於spring傳統注入方式寫get和set方法,這樣的好處是簡潔工整,省去了沒必要要得代碼 @RequestMapping("/test/login4.do") public String testLogin4(User user) { if (loginService.login(user) == false) { return "loginError"; } return "loginSuccess"; } }
以上4個方法示例,是一個Controller裏含有不一樣的請求url,也能夠採用一個url訪問,經過url參數來區分訪問不一樣的方法,代碼以下:spring
[java] view plaincopy架構
package controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("/test2/login.do") // 指定惟一一個*.do請求關聯到該Controller public class TestController2 { @RequestMapping public String testLogin(String username, String password, int age) { // 若是不加任何參數,則在請求/test2/login.do時,便默認執行該方法 if (!"admin".equals(username) || !"admin".equals(password) || age < 5) { return "loginError"; } return "loginSuccess"; } @RequestMapping(params = "method=1", method=RequestMethod.POST) public String testLogin2(String username, String password) { // 依據params的參數method的值來區分不一樣的調用方法 // 能夠指定頁面請求方式的類型,默認爲get請求 if (!"admin".equals(username) || !"admin".equals(password)) { return "loginError"; } return "loginSuccess"; } @RequestMapping(params = "method=2") public String testLogin3(String username, String password, int age) { if (!"admin".equals(username) || !"admin".equals(password) || age < 5) { return "loginError"; } return "loginSuccess"; } } 其實RequestMapping在Class上,可看作是父Request請求url,而RequestMapping在方法上的可看作是子Request請求url,父子請求url最終會拼起來與頁面請求url進行匹配,所以RequestMapping也能夠這麼寫: [java] view plaincopy package controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/test3/*") // 父request請求url public class TestController3 { @RequestMapping("login.do") // 子request請求url,拼接後等價於/test3/login.do public String testLogin(String username, String password, int age) { if (!"admin".equals(username) || !"admin".equals(password) || age < 5) { return "loginError"; } return "loginSuccess"; } }