使用springMvc註解的提前是需要在springMvc的配置文件中加入註解的bean
<mvc:annotation-driven /> <!-- 支持spring3.0新的mvc註解 -->
<!-- 啓動Spring MVC的註解功能,完成請求和註解POJO的映射 ,使用ajax請求時用到-->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="cacheSeconds" value="0" />
<property name="messageConverters">
<list>
<bean
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
</list>
</property>
</bean>
1,@Controller 使用Controller註解將對應的java類定義成控制器,用來處理url中的請求,在springMvc的配置文件中加入:
<!-- 對web包中的所有類進行掃描,以完成Bean創建和自動依賴注入的功能 -->
<context:component-scan base-package="edu.hue.jk.action" /> 能夠完成控制器的自動注入
2,@RequestMapping 如果定義在類上,則將url映射到類上;如果定義在方法上,則將對應的url映射到具體的方法上,通過params來指定具體映射到哪個方法
應用一個小例子,說明其用法:
bean的定義:
@Entity
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int userId;
@Column(name="user_name")
private String userName;
@Column(name="user_pass")
private String userPass;
註冊頁面的form:<form action="register.do" method="post">
<input type="hidden" name="method" value="1">
<table>
<tr>
<td>userName:</td>
<td><input type="text" name="userName"></td>
</tr>
<tr>
<td>passWord:</td>
<td><input type="password" name="userPass"></td>
</tr>
<tr>
<td colspan="2"> <input type="submit" value="submit"></td>
</tr>
</table>
</form>
結果顯示頁面:
<body>
<p>userName:${requestScope.user.userName}</p>
<p>passWord:${user.userPass}</p>
<p>register successful</p>
</body>
控制器定義:@Controller // 使用Controller註解將對應的java類定義成控制器,用來處理url中的請求
@RequestMapping("/register.do") // 如果定義在類上,則將url映射到類上
public class UserController {
@Autowired
private UserDao userDao;
@RequestMapping(params="method=1") // 如果定義在方法上,則將對應的url映射到具體的方法上,通過params來指定具體映射到哪個方法
public String addUser(User u,ModelMap map){
userDao.addUser(u);
map.put("user", u); //將對象放入到ModelMap中,作用範圍爲request
return "home";
}
運行:結果:
3,@RequestParam 用在頁面上的屬性名與形參名不一致的時候:
上面的例子,當form中的頁面的用戶屬性名和bean中定義的屬性名不同時,則需要使用到該註解 ,例如form改成:
<form action="register.do" method="post">
<input type="hidden" name="method" value="2">
<table>
<tr>
<td>userName:</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td>passWord:</td>
<td><input type="password" name="passWord"></td>
</tr>
<tr>
<td colspan="2"> <input type="submit" value="submit"></td>
</tr>
</table>
</form>
對應的控制器應該修改成:
@RequestMapping(params="method=2")
public String addUser(@RequestParam("name") String userName,@RequestParam("passWord") String userPass,ModelMap map){
User u=new User(); //用來將頁面上的name屬性賦給參數userName,用在頁面中的屬性名與形參名不對應的時候
u.setUserName(userName);
u.setUserPass(userPass);
userDao.addUser(u);
map.put("user", u); //將對象放入到ModelMap中,作用範圍爲request
return "home2";
}
需要注意的是:此時若訪問的URL中沒有name和passWord參數時,會報404錯誤,這是因爲@RequestParam()方法中默認的required屬性爲true
其中的屬性值:
value:傳入的請求參數的名字例如(name,passWord)
required:請求的參數是否爲必須,默認爲True
defaultValue :參數的默認值
屬性寫全:
public String addUser(@RequestParam(value="name",defaultValue="123",required=false) String userName,@RequestParam("passWord") String userPass,ModelMap map)
4,@ModelAttribute 既可以用在方法上,也可以用在參數上
如果用在參數上,可以用來將請求參數(一般將form表單postt提交的數據)綁定到對象上;
如果用在方法上,可以向ModelMap中添加屬性,需要注意的是,當@ModelAttribute使用在方法上時,映射到controller時會首先調用@ModelAttribute註解的方法向ModelMap中添加屬性,之後如果再次調用有@ModelAttribute註解的參數的函數時候,如果使用了@ModelAttribute中同名的屬性,則會覆蓋原有的數據,看下面的例子:
controller中的部分方法:
@ModelAttribute("user")
public User getUser(){
User result=new User();
System.out.println("*****************************************");
result.setUserId(345);
result.setUserName("userName");
result.setUserPass("passWord");
System.out.println("userId:"+result.getUserId());
System.out.println("userName:"+result.getUserName());
System.out.println("userPass:"+result.getUserPass());
return result;
}
@RequestMapping(params="method=4")
public String addUser4(@ModelAttribute("user")User u,ModelMap map){ //將容器中的屬性賦給形參
//用來將頁面上的name屬性賦給參數userName,用在頁面中的屬性名與形參名不對應的時候
System.out.println("userId:"+u.getUserId());
System.out.println("userName:"+u.getUserName());
System.out.println("userPass:"+u.getUserPass());
map.addAttribute("user", u);
return "home3";
}
訪問的URL爲: xxx/register.do?userName=aaa&passWord=bbb&method=4
首先會調用getUser()方法向ModelMap中存放名爲‘user’的實體,ID:345,userName:“userName”,passWord:“passWord”
然後會調用addUser4方法,該方法的參數(@ModelAttribute("user")User u,使用了ModelMap中已經存在的數據,所以會跟新原有的數據
使得“user”實體的ID:345userName=aaa,passWord=bbb運行結果:
*****************************************
userId:456
userName:userName1
userPass:passWord1
userId:456
userName:aaa
userPass:bbb
5,@SessionAttributes 用來將ModelMap中的屬性放入到Session中,由於ModelMap默認是放入到Request中,所以當使用了SessionAttributes之後,對應的屬性既在Request中,也在Session中。
當使用@SessionContributes註解controller之後,首先會調用@ModelAttribute註解的方法,如果ModelMap中的數據已經存在則不執行該方法;然後執行@RequestMapping映射的方法,如果該方法的參數包含有使用@ModelAttribute註解同名數據的參數,則會跟新ModelMap中的數據;需要注意的是,使用@SessionAttributes註解控制器類之後一定是從ModelMap中取得同名的命令對象放到Session中,如果模型數據中不存在將拋出HttpSessionRequiredException Expected session attribute ‘user’(Spring3.1)
或HttpSessionRequiredException Session attribute ‘user’ required - not found in session(Spring3.0)異常。看下面的例子:
@ModelAttribute("user")
public User getUser(){
User result=new User();
System.out.println("*****************************************");
result.setUserId(345);
result.setUserName("userName");
result.setUserPass("passWord");
System.out.println("userId:"+result.getUserId());
System.out.println("userName:"+result.getUserName());
System.out.println("userPass:"+result.getUserPass());
return result;
}
@ModelAttribute("user")
public User getUser1(){
User result=new User();
System.out.println("*****************************************");
result.setUserId(456);
result.setUserName("userName1");
result.setUserPass("passWord1");
System.out.println("userId:"+result.getUserId());
System.out.println("userName:"+result.getUserName());
System.out.println("userPass:"+result.getUserPass());
return result;
}
@RequestMapping(params="method=4")
public String addUser4(@ModelAttribute("user")User u,ModelMap map){ //將容器中的屬性賦給形參
//用來將頁面上的name屬性賦給參數userName,用在頁面中的屬性名與形參名不對應的時候
System.out.println("userId:"+u.getUserId());
System.out.println("userName:"+u.getUserName());
System.out.println("userPass:"+u.getUserPass());
map.addAttribute("user", u);
return "home3";
}
訪問的URL爲: xxx/register.do?userName=aaa&passWord=bbb&method=4結果:
*****************************************
userId:345
userName:userName
userPass:passWord
userId:345
userName:aaa
userPass:bbb
說明首先調用getUser()方法將“user”放入到ModelMap中,再次調用getUser1()的時候,由於“user”已經存在,所以不執行該方法,最後執行addUser4()方法由於使用了(@ModelAttribute("user"),所以會將ModelMap中的數據更新
最後將getUser和getUser1兩個方法位置調換,則結果爲:
*****************************************
userId:456
userName:userName1
userPass:passWord1
userId:456
userName:aaa
userPass:bbb
@PathVariable用於將請求URL中的模板變量映射到功能處理方法的參數上(這個看了好多連接和資料都還沒有測試出來demo例子,待研究)。
7,@Value springMvc3.0之後提供的註解,可以用來將properties文件中的屬性值注入到controller類中,使用的時候需要在applicationContext.xml文件中配置名稱空間:
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd
"
然後需要配置properties文件的id和位置:
<util:properties id="testFile" location="WEB-INF/test.properties" />
在WEB-INF目錄下新建test.properties文件 並配置 aaa=111
@Controller
@RequestMapping("test.do")
public class ValueController {
String path;
public String getPath() {
return path;
}
@Value("#{testFile['aaa']}") //取出配置文件中id爲testFile的properties文件中的abc的值給path,可以用來設置文件路徑
public void setPath(String path) {
this.path = path;
}
@RequestMapping(params="method=1")
String show(){
System.out.println("path:"+path);
return "home";
}
8,@ResponseBody 用在ajax請求的時候,使用在任何對象上SpringMvc都會完成對象到json的轉換,註冊的例子:
controller定義:
@Controller
@RequestMapping("tt.do")
public class PathController {
@RequestMapping(params="method=2")
public @ResponseBody User test2(User u){ //返回User對象
return u;
}
}
使用jquery提供的ajax方法請求控制器的代碼:<pre name="code" class="html"><%@ 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>Insert title here</title>
<script type="text/javascript" src="Scripts/jquery-2.1.1.js"></script>
<script type="text/javascript">
$(function(){
$("#bt").click(function(){
var name=$("#name").val();
var pass=$("#pass").val();
$.ajax({
type: "post",
dataType:'json', //接受數據格式
cache:false,
data:{"userName":name,"userPass":pass,"method":"2"}, //傳遞的數據
url: "tt.do", //訪問的地址
beforeSend: function(XMLHttpRequest){
},
success: function(data){
//先清除原有的子標籤:
$("#result").empty();
//使用jquery創建元素標籤
var name=$("<p></p>").text(data.userName);
var pass=$("<p></p>").text(data.userPass);
// 在結果顯示區的後面添加標籤
$("#result").append("結果信息顯示:");
$("#result").append(name,pass);
},
error: function(){
//請求出錯處理
alert("Error!");
}
});
});
});
</script>
</head>
<body>
<table>
<tr>
<td>userName:</td>
<td><input type="text" name="userName" id="name"></td>
</tr>
<tr>
<td>passWord:</td>
<td><input type="password" name="userPass" id="pass"></td>
</tr>
</table>
<input type="button" id="bt" value="提交">
<div id="result">
</div>
</body>
</html>
結果演示: