1.@Controllerjava
用於指示Spring類的實例是一個控制器。Controller接口的實現類只能處理一個單一請求動做,而@Controller註解的控制器能夠支持同時處理多個請求動做,更加靈活。Spring使用掃描機制查找應用程序中全部基於註解的控制器類。分發處理器會掃描使用了該註解的類的方法,並檢測該方法是否使用了@RequestMapping註解,而使用@RequestMapping註解的方法纔是真正處理請求的處理器。爲了保證能找到控制器,須要完成兩件事情:web
在Spring MVC的配置文件中以你如spring-contextspring
使用<context:component-scan/>元素,該元素的功能爲:啓動包掃描功能,以便註冊帶有@Controller,@Service,@repository,@Component等註解的類成爲SPring的Beanapp
<context:component-scan base-package="包路徑">框架
應該 將全部控制器類都在基本包下,而且指定掃描該包jsp
http://localhost:8080/AnnotationTest/hahaui
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.jspspa
<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視圖後綴code
2.@RequestMappingcomponent
用於指示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