標籤:style http java 使用 io strong 檔案 資料
Spring mvc 注釋全解
核心原理
1. 使用者發送請求給伺服器。url:user.do
2. 伺服器收到請求。發現Dispatchservlet可以處理。於是調用DispatchServlet。
3. DispatchServlet內部,通過HandleMapping檢查這個url有沒有對應的Controller。如果有,則調用Controller。
4、 Control開始執行
5. Controller執行完畢後,如果返回字串,則ViewResolver將字串轉化成相應的視圖對象;如果返回ModelAndView對象,該對象本身就包含了視圖對象資訊。
6. DispatchServlet將執視圖對象中的資料,輸出給伺服器。
7. 伺服器將資料輸出給用戶端。
spring3.0中相關jar包的含義
|
org.springframework.aop-3.0.3.RELEASE.jar |
spring的aop面向切面編程 |
|
org.springframework.asm-3.0.3.RELEASE.jar |
spring獨立的asm位元組碼產生程式 |
|
org.springframework.beans-3.0.3.RELEASE.jar |
IOC的基礎實現 |
|
org.springframework.context-3.0.3.RELEASE.jar |
IOC基礎上的擴充服務 |
|
org.springframework.core-3.0.3.RELEASE.jar |
spring的核心包 |
|
org.springframework.expression-3.0.3.RELEASE.jar |
spring的運算式語言 |
|
org.springframework.web-3.0.3.RELEASE.jar |
web工具包 |
|
org.springframework.web.servlet-3.0.3.RELEASE.jar |
mvc工具包 |
@Controller控制器定義
和Struts1一樣,Spring的Controller是Singleton的。這就意味著會被多個請求線程共用。因此,我們將控制器設計成無狀態類。
在spring 3.0中,通過@controller標註即可將class定義為一個controller類。為使spring能找到定義為controller的bean,需要在spring-context設定檔中增加如下定義:
|
<context:component-scan base-package="com.sxt.web"/> |
註:實際上,使用@component,也可以起到@Controller同樣的作用。
@RequestMapping
在類前面定義,則將url和類綁定。
在方法前面定義,則將url和類的方法綁定
@RequestParam
一般用於將指定的請求參數付給方法中形參。範例程式碼如下:
|
@RequestMapping(params="method=reg5")
public String reg5(@RequestParam("name")String uname,ModelMap map) {
System.out.println("HelloController.handleRequest()");
System.out.println(uname);
return"index";
} |
這樣,就會將name參數的值付給uname。當然,如果請求參數名稱和形參名稱保持一致,則不需要這種寫法。
@SessionAttributes
將ModelMap中指定的屬性放到session中。範例程式碼如下:
|
@Controller
@RequestMapping("/user.do")
@SessionAttributes({"u","a"}) //將ModelMap中屬性名稱字為u、a的再放入session中。這樣,request和session中都有了。
publicclass UserController {
@RequestMapping(params="method=reg4")
public String reg4(ModelMap map) { System.out.println("HelloController.handleRequest()");
map.addAttribute("u","uuuu"); //將u放入request範圍中,這樣轉寄頁面也可以取到這個資料。
return"index";
}
} |
|
<body>
<h1>**********${requestScope.u.uname}</h1>
<h1>**********${sessionScope.u.uname}</h1>
</body> |
註:名字為”user”的屬性再結合使用註解@SessionAttributes可能會報錯。
@ModelAttribute
這個註解可以跟@SessionAttributes配合在一起用。可以將ModelMap中屬性的值通過該註解自動賦給指定變數。
範例程式碼如下:
|
package com.sxt.web;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
@Controller
@RequestMapping("/user.do")
@SessionAttributes({"u","a"})
publicclass UserController {
@RequestMapping(params="method=reg4")
public String reg4(ModelMap map) {
System.out.println("HelloController.handleRequest()");
map.addAttribute("u","尚學堂高淇");
return"index";
}
@RequestMapping(params="method=reg5")
public String reg5(@ModelAttribute("u")String uname ,ModelMap map) {
System.out.println("HelloController.handleRequest()");
System.out.println(uname);
return"index";
}
} |
先調用reg4方法,再調用reg5方法。
Controller類中方法參數的處理
Controller類中方法傳回值的處理
1. 返回string(建議)
a) 根據傳回值找對應的顯示頁面。路徑規則為:prefix首碼+傳回值+suffix尾碼組成
b) 代碼如下:
|
@RequestMapping(params="method=reg4")
public String reg4(ModelMap map) {
System.out.println("HelloController.handleRequest()");
return"index";
} |
|
首碼為:/WEB-INF/jsp/ 尾碼是:.jsp
在轉寄到:/WEB-INF/jsp/index.jsp |
2. 也可以返回ModelMap、ModelAndView、map、List、Set、Object、無傳回值。一般建議返回字串!
請求轉寄和重新導向
程式碼範例:
|
package com.sxt.web;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
@Controller
@RequestMapping("/user.do")
publicclass UserController {
@RequestMapping(params="method=reg4")
public String reg4(ModelMap map) {
System.out.println("HelloController.handleRequest()");
// return "forward:index.jsp";
// return "forward:user.do?method=reg5"; //轉寄
// return "redirect:user.do?method=reg5"; //重新導向
return"redirect:http://www.baidu.com"; //重新導向
}
@RequestMapping(params="method=reg5")
public String reg5(String uname,ModelMap map) {
System.out.println("HelloController.handleRequest()");
System.out.println(uname);
return"index";
}
} |
訪問reg4方法,既可以看到效果。
獲得request對象、session對象
普通的Controller類,範例程式碼如下:
|
@Controller
@RequestMapping("/user.do")
publicclass UserController {
@RequestMapping(params="method=reg2")
public String reg2(String uname,HttpServletRequest req,ModelMap map){
req.setAttribute("a", "aa");
req.getSession().setAttribute("b", "bb");
return"index";
}
} |
ModelMap
是map的實現,可以在其中存放屬性,範圍同request。下面這個樣本,我們可以在modelMap中放入資料,然後在forward的頁面上顯示這些資料。通過el運算式、JSTL、java代碼均可。代碼如下:
|
package com.sxt.web;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
@Controller
@RequestMapping("/user.do")
publicclass UserController extends MultiActionController {
@RequestMapping(params="method=reg")
public String reg(String uname,ModelMap map){
map.put("a", "aaa");
return"index";
}
} |
|
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head></head>
<body>
<h1>${requestScope.a}</h1>
<c:out value="${requestScope.a}"></c:out>
</body>
</html> |
將屬性u的值賦給形參uname