org.springframework.stereotype.Controller註解類型用於指示Spring類的實例是一個控制器,使用該註解不須要繼承特定的類或實現特定的接口,相比較配置文件而言更加簡單。html
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Controller { String value() default ""; }
org.springframework.web.bind.annotation.RequestMapping註解用來指示Spring用哪個類或者方法來處理請求動做,該註解可用於類或方法。當@RequestMapping註解在類上時候,全部的方法都將映射爲相對於類級別的請求,表示該控制器處理的全部的請求都將被映射到value屬性指示的路徑下
源碼以下java
package org.springframework.web.bind.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.util.concurrent.Callable; import org.springframework.core.annotation.AliasFor; @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping { /** * 給映射地址一個別名 */ String name() default ""; /** * 用於將指定的請求的實際地址映射到方法上 */ @AliasFor("path") String[] value() default {}; @AliasFor("value") String[] path() default {}; /** * 映射指定的請求的方法類型: * GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE. */ RequestMethod[] method() default {}; /** * 指定request中必須包含某些參數值,才讓該方法處理 */ String[] params() default {}; /** * 指定request中必須包含某些指定的header值,才讓該方法處理 */ String[] headers() default {}; /** * 指定處理請求提交的內容(Content-Type),例如application/json、text/html等 */ String[] consumes() default {}; /** * 指定返回的內容類型,返回的內容類型必須是request請求頭(Accept)中所包含的類型 */ String[] produces() default {}; }
SpringMVC在內部使用一個org.springframework.ui.Model接口存儲模型數據,相似Map接口。SpringMVC在調用處理方法以前會建立一個隱含的模型對象,做爲模型數據的存儲器。若是處理方法的參數爲Model和ModelMap類型,則springMVC會將隱含模型的引用傳遞給這些參數。在處理方法內部,開發者就能夠經過這個參數隊形訪問模型中的全部數據,也能夠像模型中添加新的屬性數據。
UserController.javaweb
package com.rookie.bigdata.controller; import com.rookie.bigdata.domain.User; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; /** * Created by dell on 2019/6/15. */ @Controller public class UserController { private static final Log LOG = LogFactory.getLog(UserController.class); /** * @param loginname * @param password * @param model * @ModelAttribute修飾的方法會先於login調用,該方法用於接受前臺jsp頁面傳入的參數,該方法 public void userNodel(String loginname, String password, Model model)能夠直接改成 public void userNodel(String loginname, String password, ModelMap modelMap) */ @ModelAttribute public void userNodel(String loginname, String password, Model model) { LOG.info("該方法執行啦"); //用於存儲JSP頁面傳入的參數 User user = new User(); user.setLoginname(loginname); user.setPassword(password); //將user添加到Model中 model.addAttribute("user", user); } @RequestMapping(value = "/login1") public String login(Model model) { //從Model中取出user對象 User user = (User) model.asMap().get("user"); System.out.println(user); //設置user對象的屬性 user.setUsername("張三"); return "result1"; } }
loginForm1.jspspring
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>測試Model</title> </head> <body> <h3>測試Model</h3> <form action="login1" method="post"> <table> <tr> <td><label>登陸名: </label></td> <td><input type="text" id="loginname" name="loginname" ></td> </tr> <tr> <td><label>密碼: </label></td> <td><input type="password" id="password" name="password" ></td> </tr> <tr> <td><input id="submit" type="submit" value="登陸"></td> </tr> </table> </form> </body> </html>
控制器處理方法的返回值若是是ModelAndView,則其既包含模型數據信息,也包含視圖信息。
以下代碼跟上面的效果相同apache
package com.rookie.bigdata.controller; import com.rookie.bigdata.domain.User; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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; /** * Created by dell on 2019/6/15. */ @Controller public class User1Controller { private static final Log LOG = LogFactory.getLog(User1Controller.class); /** * @param loginname * @param password * @param modelAndView */ @ModelAttribute public void userNodel(String loginname, String password, ModelAndView modelAndView) { LOG.info("該方法執行啦"); //用於存儲JSP頁面傳入的參數 User user = new User(); user.setLoginname(loginname); user.setPassword(password); //將user添加到Model中 modelAndView.addObject("user", user); } @RequestMapping(value = "/login1") public ModelAndView login(ModelAndView modelAndView) { //從ModelAndView的Model中取出user對象 User user = (User) modelAndView.getModel().get("user"); System.out.println(user); //設置user對象的屬性 user.setUsername("張三"); modelAndView.setViewName("result1"); return modelAndView; } }