springMvc常用註解

使用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

 6.@PathVariable  

@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>



結果演示:




 

 

 


 

發佈了47 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章