1,新建一個web項目,按照【springmvc項目一】的方式搭建好即可。本項目講解關於springmvc的@RequestMapping註解。
2,在新項目的WEB-INF的文件夾中新建一個views的文件夾,然後在views中新建一個success.jsp文件。
在工程目錄下(eclipse默認爲WebContent)新建一個index.jsp。當前的兩個jsp文件暫時沒有其它內容,後面的操作中將逐一添加需要的代碼。
3,新建一個TestRequestMapping的java類(我們將不斷的往該類中添加新的測試方法)。
添加一個testRM()的測試方法。類和方法的代碼如下。
在WEB-INF目錄下新建一個index.jsp文件(後面所有添加的鏈接或者提交都在該頁面中,相應的也會對應類的方法,我們將成對的講述)。
代碼中可以看出,@RequestMapping可以註解類,也可以註解方法。
其註解的意思表示可以通關過類似http://127.0.0.1:8080/web/testRequestMapping/testRM的鏈接來訪問該類的該方法。
其對應的jsp代碼如下,也就是運行本項目,點擊該鏈接就可以調用到testRM()方法。
注意:如果類上沒有給與@RequestMapping註解,那麼訪問是直接跟方法的註解地址即可。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/testRequestMapping")
public class TestRequestMapping {
@RequestMapping("/testRM")
public String testRM(){
System.out.println("testRM()...");
return "success";
}
}
<a href="testRequestMapping/testRM">test R M</a>
4,@RequestMapping註解的value和method屬性。相關的java代碼和jsp代碼如下。
value屬性是和上面一樣表示映射的地址,只是如果不用其它的屬性value可以省略不寫。
method屬性的表示,只接受什麼類型的請求。
如下面的案例所示一個get的請求,一個post請求,而註解的方法只接受post的請求。所以當點擊get請求的時候,會反饋給頁面一個405的請求。
關於method的其它請求,我們在REST風格的項目中在行講述。
<span style="white-space:pre"> </span>@RequestMapping(value="/testMethod",method=RequestMethod.POST)
public String testMethod(){
System.out.println("testMethod()...");
return "success";
}
<a href="testRequestMapping/testMethod">testMethod get</a>
<form action="testRequestMapping/testMethod" method="post">
<input type="submit" value="testMethod post">
</form>
5,params屬性
params 支持簡單的表達式:
param1: 表示請求必須包含名爲 param1 的請求參數。
!param1: 表示請求不能包含名爲 param1 的請求參數。
param1 != value1: 表示請求包含名爲 param1 的請求參數,但其值 不能爲 value1。
使用get和post請求均有效。
案例中表示請求中必須包含name和age的請求參數,而且age不能等於0。
@RequestMapping(value="/testParams",params={"name","age!=0"})
public String testParams(){
System.out.println("testParams()..");
return "success";
}
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 18px;"></span><pre name="code" class="html"><a href="testRequestMapping/testParams?name=tom&age=18">test Params</a>
<form action="testRequestMapping/testParams" method="post">
<input type="text" name="name">
<input type="text" name="age">
<input type="submit" value="test Params">
</form>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 18px;">5,</span><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:14px">headers屬性</span></span>
headers與params一樣也支持上面的表達式。
案例中表示請求頭的Accpet-Encoding和Accept-Language的參數必須與註解的一樣才能相應其請求(案例中是複製chrome的請求頭信息)。
@RequestMapping(value="/testHeaders"
,headers={"Accept-Encoding=gzip, deflate, sdch","Accept-Language=zh-CN,zh;q=0.8"})
public String testHeaders(){
System.out.println("testHeaders()...");
return "success";
}
<a href="testRequestMapping/testHeaders">test Headers</a>
6,Ant風格的資源地址
Ant 風格資源地址支持 3 種匹配符:
?:匹配文件名中的一個字符
*:匹配文件名中的任意字符
**:** 匹配多層路徑
@RequestMapping 還支持 Ant 風格的 URL:
/user/*'/'createUser: 匹配 /user/aaa/createUser、 /user/bbb/createUser 等
/user/**'/'createUser: 匹配/user/createUser、 /user/aaa/bbb/createUser 等
/user/createUser??: 匹配 /user/createUseraa、/user/createUserbb 等 URL
@RequestMapping("/testAntStyle/**/before")
public String testAntStyle(){
System.out.println("testAntStyle()...");
return "success";
}
<a href="testRequestMapping/testAntStyle/**/before">test AntStyle</a>
7,佔位符參數 @PathVariable
通過案例中的方式可以在請求地址中帶入佔位的參數,在方法中使用@PathVariable註解該佔位符即可。(由於是在請求地址中的佔位符,所以必須用GET請求方式)
@RequestMapping(value="/testPathVariable/{id}",method=RequestMethod.GET)
public String testPathVariable(@PathVariable(value="id")Integer id){
System.out.println("testPathVariable()... id = "+id);
return "success";
}
<a href="testRequestMapping/testPathVariable/23">test PathVariable</a>
8,通過@RequestParam請求來映射方法的請求參數。
①RequestParam的參數含義
value:映射請求的參數名稱,必須兩方保持一致(頁面,映射參數)
required:表示value的參數是否爲必須,默認爲true。
defaultValue:賦值給請求參數的默認值(對於post請求基本無效)。
②如果參數使用的是int(long、double等等)類型的參數時:
--如果使用post請求,而又沒有值的話,則會報錯,配置defaultValue也無效。
--如果使用get請求,如果沒有defaultValue="0"參數也會報錯,如果有則不會報錯。
③如果參數使用的是Intger,如果沒有傳輸參數時不容易出錯,值爲null(建議使用Integer等包裝類來代替基本數據類型)。
案例中演示了post請求的方式,你可以自行驗證一下上述的結論。
@RequestMapping(value="/testRequestParam")
public String testRequestParam(@RequestParam(value="name")String name
,@RequestParam(value="age",required=true)/*int*/Integer age){
System.out.println("testRequestParam()... name="+name+";age="+age);
return "success";
}
<span style="white-space:pre"> </span><form method="post" action="testRequestMapping/testRequestParam">
name:<input type="text" name="name"><br>
age :<input type="text" name="age"><br>
<input type="submit" value="test RequestParam">
</form>
9,關於如果接受 請求頭和cookie信息的方法
在方法中使用@RequestHeader註解和@Cookievalue註解,然後標註其value屬性即可得到參數(value可以省略)。
<span style="white-space:pre"> </span>@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader("Accept-Language")String language){
System.out.println("testRequestHeader()..."+language);
return "success";
}
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value="JSESSIONID")String jessionId){
System.out.println("testCookieValue()..."+jessionId);
return "success";
}
<span style="white-space:pre"> </span><a href="testRequestMapping/testRequestHeader">test RequestHeader</a>
<br><br>
<a href="testRequestMapping/testCookieValue">test CookieValue</a>