一. Controller方法的返回值:
1、 返回的ModelAndView
ModelAndView 存放數據, addObject(),往model(request域)添加數據
ModelAndView 添加邏輯視圖名, setViewName(), 經過視圖解析器,得到物理視圖, 轉發到物理視圖
@RequestMapping("/getUser.action") public ModelAndView getUser(@RequestParam(name="userId",required = true)Integer id) throws Exception{ System.out.println("id="+id); ModelAndView modelAndView = new ModelAndView(); User user = userService.queryOne(id); modelAndView.addObject("user", user); modelAndView.setViewName("userinfo"); return modelAndView; }
2、 String類型, 返回的視圖
a. 邏輯視圖名, 經過視圖解析器,得到物理視圖, 轉發
@RequestMapping("/index.action") public String toIndex() { return "index";
b. redirect:資源路徑, 不經過視圖解析器,要求這個資源路徑寫完整的路徑: /開頭, 表示/項目名 重定向到資源
@RequestMapping("/index.action") public String toIndex() { //重定向到index.jsp, 完整的路徑 return "redirect:/jsp/index.jsp";
c. forward:資源路徑, 不經過視圖解析器,要求這個資源路徑寫完整的路徑: /開頭,表示/項目名 轉發向到資源
@RequestMapping("/index.action") public String toIndex() { return "forward:/jsp/index.jsp";
d.響應給前端的字符串,(數據),需要結合@ResponseBody
//將user對象以json的格式響應給前端頁面 @RequestMapping("/queryUserByCondition.action") @ResponseBody public User queryUserByCondition(User user) throws Exception{ return user; }
3、Java對象
需要結合@ResponseBody, 發生的數據,(json)
主要用來接收前端傳遞給后端的json字符串中的數據的(請求體中的數據的),只能是post提交,get沒有請求體
@RequestMapping("/queryUserByCondition.action") @ResponseBody public User queryUserByCondition( @RequestBody User user) throws Exception{ return user; }
4、 void, 默認邏輯視圖名
controller的@RequestMapping() 前綴+ 方法名, 很少使用
二. Controller方法的參數類型
1、直接注入Servlet API相關的類
- 1) HttpServletRequest 通過request對象獲取請求信息
- 2) HttpServletResponse 通過response處理響應信息
- 3) HttpSession 通過session對象得到session中存放的對象
//使用Servlet API 對象 @RequestMapping("/fun2.action") public String fun2(HttpServletRequest request, HttpServletResponse response, HttpSession session) { System.out.println("fun2()....."); request.setAttribute("hello", "request_hello"); session.setAttribute("hello", "session_hello"); Cookie cookie = new Cookie("haha","xixi"); //把cookie保存客戶端 response.addCookie(cookie); return "hello"; }
2、 Model/ModelMap 往model存放/取數據, request域
如果我們只是往request域存放數據, 推薦使用Model, Controller類與ServletAPI 解耦
//推薦寫法 @RequestMapping("/fun3.action") public String fun3(Model model) { System.out.println("fun3()....."); // SpringMVC 框架幫我們把model中的數據, 一個一個添加到request域 // Model 不能替換Request對象, model.addAttribute("hello","model_hello"); model.addAttribute("xx", 123); return "hello"; }
3、 接收請求參數
a、基本數據類型
參數名與請求參數名一樣,自動進行映射
如果參數名與請求參數名不一樣, 使用@RequestParam 來進行映射
b、參數是java對象,是一個pojo對象
案例添加用戶:Pojo對象的屬性名與請求參數的name一樣, 自動映射
@RequestMapping(value="/addUser.action",method=RequestMethod.POST) public String addUser(User user,Model model) { userService.saveUser(user); model.addAttribute("msg", "添加成功"); return "msg"; }
前端頁面:

<body> <h1>添加用戶:</h1> <form action="${pageContext.request.contextPath }/user/addUser.action" method="post"> 用戶名:<input type="text" name="username" /> <hr /> 密 碼:<input type="text" name="password" /> <hr /> 性 別:<input type="radio" name="sex" value="男" id="man" checked /><label for="man">男</label> <input type="radio" name="sex" value="女" id="woman" /><label for="woman">女</label> <hr /> 生 日:<input type="text" name="brithday" readonly id="brithday"/> <hr /> 地 址:<input type="text" name="address" /> <hr /> <button>添加</button> </form> </body>
String類型,SpringMVC 不能自動轉換為Date類型 , 需要手動配置
1、局部的轉換器, @DateTimeFormat(日期格式)
只對某一個屬性進行轉換 ,只需要在日期類型的屬性上添加
@DateTimeFormat(pattern = "yyyy-MM-dd") private Date brithday;
2、 全局的轉換器, 對整個項目的所有的date類型進行轉換
第一步: 編寫一個轉換器類, 實現Converter接口
public class MyDateConverter implements Converter<String, Date>{ private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //轉換的方法 @Override public Date convert(String source) { try { return sdf.parse(source); } catch (ParseException e) { e.printStackTrace(); throw new RuntimeException("日期格式不對,日期格式:yyyy-MM-dd"); } } }
第二步: 在springmvc的配置文件進行配置
<!-- 基於注解的處理器映射器,處理器適配器 --> <mvc:annotation-driven conversion-service="conversionService"/> <!-- 配置全局轉換器 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <!--內部bean: 這個bean 只能在包括他的bean內部使用 --> <bean class="spring09.converter.MyDateConverter"/> <!-- 配置多個轉換器類的bean --> </set> </property> </bean>
對整個項目的Date類型進行轉換
c、參數是集合屬性
Controller參數寫法: 需要封裝成一個類, 作為這個類的屬性(list集合)
//批量添加 @RequestMapping(value="/bathAddUser.action",method=RequestMethod.POST) public String bathAddUser(UserVo userVo,Model model) { model.addAttribute("msg", "添加成功"); return "msg"; }
UserVo類:
public class UserVo { private List<User> users = new ArrayList<>(); public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; }
前端頁面:name="users[0].password"
UserVo中的users屬性,list數組,里面的對象下標從0開始,可以使用js賦值,以下頁面作為顯示效果

<h1>批量添加用戶:</h1> <form action="${pageContext.request.contextPath }/user/bathAddUser.action" method="post"> <h1>第一個用戶:</h1> 用戶名:<input type="text" name="users[0].username" /> <hr /> 密 碼:<input type="text" name="users[0].password" /> <hr /> 性 別:<input type="radio" name="users[0].sex" value="男" id="man" checked /><label for="man">男</label> <input type="radio" name="users[0].sex" value="女" id="woman" /><label for="woman">女</label> <hr /> 生 日:<input type="text" name="users[0].brithday" readonly class="brithday"/> <hr /> 地 址:<input type="text" name="users[0].address" /> <hr /> <h1>第二個用戶:</h1> 用戶名:<input type="text" name="users[1].username" /> <hr /> 密 碼:<input type="text" name="users[1].password" /> <hr /> 性 別:<input type="radio" name="users[1].sex" value="男" id="man" checked /><label for="man">男</label> <input type="radio" name="users[1].sex" value="女" id="woman" /><label for="woman">女</label> <hr /> 生 日:<input type="text" name="users[1].brithday" readonly class="brithday"/> <hr /> 地 址:<input type="text" name="users[1].address" /> <hr /> <button>添加</button>
數組類型:
JSP頁面端:
Controller:
Map集合
JSP頁面端:
包裝類:
Controller: