1.@Controller
用於指示Spring類的實例是一個控制器。Controller接口的實現類只能處理一個單一請求動作,而@Controller注解的控制器可以支持同時處理多個請求動作,更加靈活。Spring使用掃描機制查找應用程序中所有基於注解的控制器類。分發處理器會掃描使用了該注解的類的方法,並檢測該方法是否使用了@RequestMapping注解,而使用@RequestMapping注解的方法才是真正處理請求的處理器。為了保證能找到控制器,需要完成兩件事情:
在Spring MVC的配置文件中以你如spring-context
使用<context:component-scan/>元素,該元素的功能為:啟動包掃描功能,以便注冊帶有@Controller,@Service,@repository,@Component等注解的類成為SPring的Bean
<context:component-scan base-package="包路徑">
應該 將所有控制器類都在基本包下,並且指定掃描該包
http://localhost:8080/AnnotationTest/haha
package com.game.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { @RequestMapping(value="/haha") public String hello(Model model) { model.addAttribute("message", "騰飛新星"); return "haha"; } }
發送haha請求,將model的message賦值"騰飛新星",再返回給haha.jsp
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/content/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean>
prefix視圖前綴,suffix視圖后綴
2.@RequestMapping
用於指示Spring用哪一個類或者哪一個方法來處理請求動作。
package com.game.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping(value="/user") public class UserController { @RequestMapping(value="/register") public String register() { return "register"; } @RequestMapping(value="/login") public String login() { return "login"; } }
由於UserController前面加上@RequestMapping(value="/user"),所以相關的請求都要加上/user
創建register.jsp和login.jsp
http://localhost:8080/AnnotationTest/user/register
http://localhost:8080/AnnotationTest/user/login
即可訪問成功
package com.game.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class HelloController { @RequestMapping(value="/haha",method=RequestMethod.GET,params="myParam=nidaye") public String hello(Model model) { model.addAttribute("message", "騰飛新星"); return "haha"; } }
http://localhost:8080/AnnotationTest/haha?myParam=nidaye
僅處理請求中包含了名為“myParam”,值為“nidaye”的請求;
3.Model和ModelAndView
在請求處理方法可出現和返回的參數類型中,最重要就是Model和ModelAndView了,對於MVC框架,控制器Controller執行業務邏輯,用於產生模型數據Model,而視圖View用於渲染模型數據。
SpringMVC在內部使用了一個Model接口存儲數據模型,它的功能類似java.util.Map,但是比Map容易使用。ModelMap接口實現了Map
package com.game.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.game.model.User; @Controller public class User1Controller { /**ModelAttribute會優先於login調用,把請求的參數賦值給對應的變量,可以向方法中的model添加對象*/ @ModelAttribute public void userModel(String loginName,String password,Model model) { User user = new User(); user.setLoginName(loginName); user.setPassword(password); model.addAttribute("user", user); } @RequestMapping("/userlogin") public String login(Model model) { User user = (User)model.asMap().get("user"); model.addAttribute("name", user.getLoginName()); model.addAttribute("password", user.getPassword()); return "result1"; } @RequestMapping("/userlogin2") public String login(ModelMap model) { User user = (User)model.get("user"); model.addAttribute("name", user.getLoginName()); model.addAttribute("password", user.getPassword()); return "result1"; } }
ModelAttribute會優先於login調用,把請求的參數賦值給對應的變量,可以向方法中的model添加對象
http://localhost:8080/AnnotationTest/userlogin1?loginName=haha&password=123
User user = (User)model.asMap().get("user");Model
User user = (User)model.get("user");ModelMap
下邊看看ModelAndView
package com.game.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.game.model.User; @Controller public class User2Controller { /**ModelAttribute會優先於login調用,把請求的參數賦值給對應的變量,可以向方法中的model添加對象*/ @ModelAttribute public void userModel(String loginName,String password,ModelAndView model) { User user = new User(); user.setLoginName(loginName); user.setPassword(password); model.addObject("user", user); } @RequestMapping("/userlogin3") public ModelAndView login(ModelAndView mv) { User user = (User)mv.getModel().get("user"); mv.addObject("name", user.getLoginName()); mv.addObject("password", user.getPassword()); mv.setViewName("result1"); return mv; } }
添加模型數據用addObject
設置視圖setViewName
http://localhost:8080/AnnotationTest/userlogin3?loginName=hehe&password=123