Spring
1.@service
@Service對應的是業務層Bean,在spring配置文件裏配置bean差不多的功能,就是讓spring自動掃描管理組件,例如:
1 @Service("userService") 2 public class UserServiceImpl implements UserService { 3 ……… 4 }
@Service("userService")對應控制層中的@Resource,name可有可無
1 // 注入userService 2 @Resource(name = "userService") 3 private UserService userService;
使用此註解需要在spring配置文件里加上這個<context:component-scan base-package=""/>
注意:如果沒有Spring,那麼當Action需要使用UserServiceImpl時,必須通過“UserService userService = new UserServiceImpl();”主動去創建實例對象,但使用了Spring之後,只需要加入註解@Resource,不需要創建對象,只依靠spring來自動實例化對象,這就是所謂的“依賴注入”。
2.@Resource@Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource默認按
byName自動注入罷了。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。
@Resource裝配順序
1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常
2. 如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常
3. 如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常
4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退爲一個原始類型進行匹配,如果匹配則自動裝配;
3、@ Repository
@Repository對應數據訪問層Bean ,例如:
1 @Repository(value="userDao") 2 public class UserDaoImpl extends BaseDaoImpl<User> { 3 ……… 4 }
@Repository(value="userDao")註解是告訴Spring,讓Spring創建一個名字叫“userDao”的UserDaoImpl實例。
當Service需要使用Spring創建的名字叫“userDao”的UserDaoImpl實例時,就可以使用@Resource(name = "userDao")註解告訴Spring,Spring把創建好的userDao注入給Service即可。
1 // 注入userDao,從數據庫中根據用戶Id取出指定用戶時需要用到 2 @Resource(name = "userDao") 3 private BaseDao<User> userDao;
4.@RequestMapping
使用 @RequestMapping 來映射請求,也就是通過它來指定控制器可以處理哪些URL請求,@RequestMapping可以作用在類上,也可以在方法上
@RequestMapping
中的 value 和 path 屬性(這兩個屬性作用相同,可以互換,如果僅有這一個屬性,則可以省略,下面兩個例子均採用省略的方式)
1)將 @RequestMapping 註解在 login 方法上,而UserController上不添加 @RequestMapping 註解,這時的請求 URL 是相對於 Web 根目錄
1
2
3
4
5
6
7
8
|
@Controller public class UserController { @RequestMapping ( "/login" ) public String login() { return "success" ; } } |
這時的方法 login() 能處理的 URL 請求路徑是基於 Web 應用的,也就是 http://localhost/項目名/login,而在jsp 頁面中的 User Login 鏈接地址應該是:
<
a
href
=
"login"
>User Login</
a
>
1
|
< a href = "login" >User Login</ a > |
2)將 @RequestMapping 註解在 UserController 類上,這時類的註解是相對於 Web 根目錄,而方法上的是相對於類上的路徑
1
2
3
4
5
6
7
8
9
|
@Controller @RequestMapping ( "/user" ) public class UserController { @RequestMapping ( "/login" ) public String login() { return "success" ; } } |
這時的方法login()能處理的 URL 請求路徑則是 http://localhost/項目名/user/login,在jsp 頁面中的 User Login 鏈接地址應該是:
1
|
< a href = "user/login" >User Login</ a >
|
method
屬性
測試 @RequestMapping 的 method 屬性
1)簡介:@RequestMapping 中的 method 主要用來定義接收瀏覽器發來的何種請求。在Spring中,使用枚舉類
org.springframework.web.bind.annotation.RequestMethod來定義瀏覽器請求的方式。
Http規範定義了多種請求資源的方式,最基本的有四種,分別爲:GET(查)、POST(增)、PUT(改)、DELETE(刪),而URL則用於定位網絡上的資源相當於地址的作用,配合四種請求方式,可以實現對URL對應的資源的增刪改查操作。
在實際應用中,很多人並沒有按照這個規範做,因爲使用GET/POST同樣可以完成PUT和DELETE操作,甚至GET也可以完成POST操作,因爲GET不需要用到form表單,而POST卻需要通過表單來發送。
2)通過 @RequestMapping(value="/login",method=RequestMethod.GET) 來指定 login()方法 僅處理通過 GET 方式發來的請求
1
2
3
4
5
6
7
8
9
|
@Controller @RequestMapping (path = "/user" ) public class UserController { @RequestMapping (path = "/login" , method=RequestMethod.GET) public String login() { return "success" ; } } |
這時,如果瀏覽器發來的請求不是GET的話,將收到瀏覽器返回的錯誤提示,也就是得通過鏈接的方式而不是表單的方式:
1
|
< a href="user/login>User Login</ a > |
3)通過 @RequestMapping(value="/login",method=RequestMethod.POST) 來指定 login()方法 僅處理通過 POST 方式發來的請求
1
2
3
4
5
6
7
8
9
|
@Controller @RequestMapping (path = "/user" ) public class UserController { @RequestMapping (path = "/login" , method=RequestMethod.POST) public String login() { return "success" ; } } |
這時,必須通過表單的方式發送請求,否則將收到瀏覽器返回的錯誤提示
1
2
3
|
< form action = "user/login" method = "post" > < input type = "submit" value = "使用Post發送請求" /> </ form > |
4)由於在 RequestMapping 註解類中 method() 方法返回的是 RequestMethod 數組,所以可以給 method 同時指定多個請求方式,例如:
1
2
3
4
5
6
7
8
9
|
@Controller @RequestMapping (path = "/user" ) public class UserController { // 該方法將同時接收通過GET和POST方式發來的請求 @RequestMapping (path = "/login" , method={RequestMethod.POST,RequestMethod.GET}) public String login() { return "success" ; } } |
params 屬性
該屬性表示請求參數,也就是追加在URL上的鍵值對,多個請求參數以&隔開,例如:
1
|
http://localhost/SpringMVC/user/login?username=kolbe&password=123456 |
1
|
http://localhost/SpringMVC/user/login?username=kolbe&password=123456 |
則這個請求的參數爲username=kolbe以及password=123456,@RequestMapping 中可以使用 params 來限制請求參數,來實現進一步的過濾請求,舉個例子:
1
2
3
4
5
6
7
8
9
10
|
@Controller @RequestMapping (path = "/user" ) public class UserController { // 該方法將接收 /user/login 發來的請求,且請求參數必須爲 username=kolbe&password=123456 @RequestMapping (path = "/login" , params={ "username=kolbe" , "password=123456" }) public String login() { return "success" ; } } |
該例中則表示 UserController 中的 login() 方法僅處理 /user/login 發來的請求,且必須帶有 username=kolbe&password=123456 的請求參數,否則瀏覽器將返回HTTP 404的錯誤, 對應的jsp 中的鍵接地址爲:
1
|
< a href = "user/login?username=kolbe&password=123456" >User Login</ a > |
1
|
< a href = "user/login?username=kolbe&password=123456" >User Login</ a > |
headers 屬性
該屬性表示請求頭
用於HTTP協義交互的信息被稱爲HTTP報文,客戶端發送的HTTP報文被稱爲請求報文,服務器發回給客戶端的HTTP報文稱爲響應報文,報文由報文頭部和報文體組成。
請求頭部(Request Headers):請求頭包含許多有關客戶端環境和請求正文的信息,例如瀏覽器支持的語言、請求的服務器地址、客戶端的操作系統等。
響應頭部(Rsponse Headers):響應頭也包含許多有用的信息,包括服務器類型、日期、響應內容的類型及編碼,響應內容的長度等等。
如果你安裝的是Chrome瀏覽器,可以通過在網頁中 右擊鼠標---->審查元素---->Network---->Name中點擊網頁---->右側查看Headers即可,如果Name中沒有出現網頁,可以刷新一下即可,下邊是我電腦中的一個請求頭部示例:
1
2
3
4
5
6
7
8
9
10
|
Request Headers Accept:text/html,application/xhtml+xml,application/xml;q= 0.9 ,image/webp,*/*;q= 0.8 Accept-Encoding:gzip, deflate, sdch Accept-Language:zh-CN,zh;q= 0.8 Cache-Control:max-age= 0 Connection:keep-alive Cookie:JSESSIONID=210075B5E521CWE3CDE938076295A57A Host:localhost: 8080 Upgrade-Insecure-Requests: 1 User-Agent:Mozilla/ 5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/ 45.0 . 2454.93 |
回規正題,通過 @RequestMapping 中的 headers 屬性,可以限制客戶端發來的請求
1
2
3
4
5
6
7
8
9
|
@Controller @RequestMapping (path = "/user" ) public class UserController { // 表示只接收本機發來的請求 @RequestMapping (path = "/login" , headers= "Host=localhost:8080" ) public String login() { return "success" ; } |