SSM搭建-Spring mvc基於註解的配置(13)
Spring2.5引入註解式處理器支援,通過@Controller和@RequestMapping註解定義我們的處理器類。並且提供了一組強大的註解需要通過處理器對映DefaultAnnotationHandlerMapping和處理器介面卡AnnotationMethodHandlerAdapter來開啟支援@Controller和@RequestMapping註解的處理器。
@Controller:用於標識是處理器類;
@RequestMapping:請求到處理器功能方法的對映規則;
@RequestParam:請求引數到處理器功能處理方法的方法引數上的繫結;
@ModelAttribute:請求引數到命令物件的繫結;
@InitBinder:自定義資料繫結註冊支援,用於將請求引數轉換到命令物件屬性的對應型別;
一、檢視返回
1、返回String物件
[java] view plain copy print?- @RequestMapping(value ="/index")//相對於根目錄的路徑
- public String test(ModelMap model) {
- model.addAttribute("message", "呼叫FirstController的test方法");
- return"index";//指定頁面要跳轉的view檢視路徑
- }
直接返回檢視的名稱,結果:@RequestMapping(value ="/index")//相對於根目錄的路徑 public String test(ModelMap model) { model.addAttribute("message", "呼叫FirstController的test方法"); return "index";//指定頁面要跳轉的view檢視路徑 }
2、返回ModelAndView物件
[java] view plain copy print?- @RequestMapping("/index1")
- public ModelAndView test2() {
- ModelAndView modelAndView = new ModelAndView();
- ///modelAndView.setView(new RedirectView("index1"));
- modelAndView.setViewName("index1");//指定頁面要跳轉的view檢視路徑
- modelAndView.addObject("message"
- return modelAndView;
- }
@RequestMapping("/index1")
public ModelAndView test2() {
ModelAndView modelAndView = new ModelAndView();
///modelAndView.setView(new RedirectView("index1"));
modelAndView.setViewName("index1");//指定頁面要跳轉的view檢視路徑
modelAndView.addObject("message", "呼叫FirstController的test1方法");//第二個引數:指定了要項前臺傳遞的引數,在前臺可以這樣取值 ${sp_ids }
return modelAndView;
}
結果:
其中
[java] view plain copy print?- modelAndView.setViewName("index1");
modelAndView.setViewName("index1");
也可以寫成:
[java]
view plain
copy
print?
- modelAndView.setView(new RedirectView("index1"));
modelAndView.setView(new RedirectView("index1"));
ModelAndView()
這個構造方法構造出來的ModelAndView不能直接使用,應為它沒有指定view,也沒有繫結對應的model物件。當然,model物件不是必須的,但是view確實必須的。
用這個構造方法構造的例項主要用來在以後往其中加view設定和model物件。
給ModelAndView
例項設定view的方法有兩
個:setViewName(String viewName) 和 setView(View view)。前者是使用view
name,後者是使用預先構造好的View物件。其中前者比較常用。事實上View是一個介面,而不是一個可以構造的具體類,我們只能通過其他途徑來獲取
View的例項。對於view
name,它既可以是jsp的名字,也可以是tiles定義的名字,取決於使用的ViewNameResolver如何理解這個view name。
如何獲取View的例項以後再研究。
而對應如何給ModelAndView
例項設定model則比較複雜。有三個方法可以使用:
[html] view plain copy print?
- addObject(Object modelObject)
- addObject(String modelName, Object modelObject)
- addAllObjects(Map modelMap)
addObject(Object modelObject)
addObject(String modelName, Object modelObject)
addAllObjects(Map modelMap)
二、@RequestMapping
對於各種註解而言,排第一的當然是“@Controller”,表明某類是一個controller。“@RequestMapping”請求路徑對映,如果標註在某個controller的類級別上,則表明訪問此類路徑下的方法都要加上其配置的路徑;最常用是標註在方法上,表明哪個具體的方法來接受處理某次請求。
@RequestMapping 引數說明
- value
- 定義處理方法的請求的 URL 地址。
- method
- 定義處理方法的 http method 型別,如 GET、POST 等。
- params
- 定義請求的 URL 中必須包含的引數。
- headers
- 定義請求中 Request Headers 必須包含的引數
2.1 攔截路徑設定
(1) 方法上的攔截
[java] view plain copy print?- @Controller
- publicclass FirstController {
- @RequestMapping(value ="/index")//相對於根目錄的路徑
- public String test(ModelMap model) {
- model.addAttribute("message", "呼叫FirstController的test方法");
- return"index";//指定頁面要跳轉的view檢視路徑
- }
- }
@Controller
public class FirstController {
@RequestMapping(value ="/index")//相對於根目錄的路徑
public String test(ModelMap model) {
model.addAttribute("message", "呼叫FirstController的test方法");
return "index";//指定頁面要跳轉的view檢視路徑
}
}
表示攔截:http://localhost:8080/SpringMVCLearningChapter2/index1
(2)類上的攔截
[java] view plain copy print?- @Controller
- @RequestMapping("/user")
- publicclass SecondController {
- @RequestMapping(value ="/index")
- public String test(ModelMap model) {
- model.addAttribute("message", "呼叫SecondController 的test方法");
- return"index";//指定頁面要跳轉的view檢視路徑
- }
- @RequestMapping("/index1")
- public ModelAndView test2() {
- ModelAndView modelAndView = new ModelAndView();
- ///modelAndView.setView(new RedirectView("index1"));
- modelAndView.setViewName("index1");//指定頁面要跳轉的view檢視路徑
- modelAndView.addObject("message", "呼叫SecondController 的test1方法");//第二個引數:指定了要項前臺傳遞的引數,在前臺可以這樣取值 ${sp_ids }
- return modelAndView;
- }
- }
@Controller
@RequestMapping("/user")
public class SecondController {
@RequestMapping(value ="/index")
public String test(ModelMap model) {
model.addAttribute("message", "呼叫SecondController 的test方法");
return "index";//指定頁面要跳轉的view檢視路徑
}
@RequestMapping("/index1")
public ModelAndView test2() {
ModelAndView modelAndView = new ModelAndView();
///modelAndView.setView(new RedirectView("index1"));
modelAndView.setViewName("index1");//指定頁面要跳轉的view檢視路徑
modelAndView.addObject("message", "呼叫SecondController 的test1方法");//第二個引數:指定了要項前臺傳遞的引數,在前臺可以這樣取值 ${sp_ids }
return modelAndView;
}
}
表示攔截:http://localhost:8080/SpringMVCLearningChapter2/user/index
和http://localhost:8080/SpringMVCLearningChapter2/user/index1
即攔截:根目錄/user/index和根目錄/user/index1
請求對映- 普通URL路徑對映
@RequestMapping(value={"/login.do","/user/login.do"}):多個URL路徑可以對映到同一個處理器的功能處理方法。
- URL模板模式對映
@RequestMapping(value="/users/{userId}"):{xxx}佔位符,請求的URL可以是"/users/123456"或"/users/abcd"。
@RequestMapping(value="/users/{userId}/login.do"):這樣也是可以的,請求的URL可以是"/users/123/login.do"。
@RequestMapping(value="/users/{userId}/channel/{channelId}"):這樣也是可以的,請求的URL可以是"/users/123/channel/456"。
- Ant風格的URL路徑對映
@RequestMapping(value="/users/**"):可以匹配"/users/abc/abc"。
@RequestMapping(value="/model?"):可匹配"/model1"或"/modela" ,但不匹配"/model"或"/modelaa";
@RequestMapping(value="/model*"):可匹配"/modelabc"或"/model",但不匹配"/modelabc/abc";
@RequestMapping(value="/model/*"):可匹配"/model/abc",但不匹配"/modelabc";
@RequestMapping(value="/model/**/{modelId}"):可匹配"/model/abc/abc/123”或"/model/123",
也就是Ant風格和URI模板變數風格可混用;
- 正則表示式風格的URL路徑對映
從Spring3.0開始支援正則表示式風格的URL路徑對映,格式為{變數名:正則表示式}
@RequestMapping(value="/login/{userId://d+}.do"):可以匹配
"/login/123.do",但不能匹配"/login/abc.do",這樣可以設計更加嚴格的規則。
- 組合使用是"或"的關係
如@RequestMapping(value={"/login.do","/user/login.do"})組合使用是或的關係,即"/login.do"或
"/user/login.do"請求URL路徑都可以對映到@RequestMapping指定的功能處理方法。
2、param引數
如果想給一個頁面設定傳遞的引數,可以寫成如下:
[java] view plain copy print?- @Controller
- @RequestMapping("/third")
- publicclass ThirdController {
- @RequestMapping(value ="/index",params="name")//要求傳遞引數name,瀏覽器中輸入name後,控制器會自動把引數傳遞給test中的name
- public String test(ModelMap model,String name) {
- model.addAttribute("message", name);
- return"index";
- }
- }
因為它要求你一定要傳遞一個name引數,所以得這樣寫:
當然,這裡也可以把需要的引數註解到方法的引數上去
[java] view plain copy print?- @RequestMapping(value ="/index")//要求傳遞引數name,瀏覽器中輸入name後,控制器會自動把引數傳遞給test中的name
- public String test(ModelMap model,@RequestParam("name")String name) {
- model.addAttribute("message", name);
- return"index";
- }
@RequestMapping(value ="/index")//要求傳遞引數name,瀏覽器中輸入name後,控制器會自動把引數傳遞給test中的name
public String test(ModelMap model,@RequestParam("name")String name) {
model.addAttribute("message", name);
return "index";
}
效果和上面和一樣的。這時如果還是想訪問http://localhost:8080/SpringMVCLearningChapter2/third/index,把required=false加上 [java] view plain copy print?
- @RequestMapping(value ="/index")
- public String test(ModelMap model,@RequestParam(value="name",required=false)String name) {
- model.addAttribute("message", name);
- return"index";
- }
- @RequestMapping(value ="/index1",method = RequestMethod.GET,params="name")
- public ModelAndView test2() {
- ModelAndView modelAndView = new ModelAndView();
- ///modelAndView.setView(new RedirectView("index1"));
- modelAndView.setViewName("index1");//指定頁面要跳轉的view檢視路徑
- modelAndView.addObject("message", "呼叫SecondController 的test1方法");//第二個引數:指定了要項前臺傳遞的引數,在前臺可以這樣取值 ${sp_ids }
- return modelAndView;
- }
@RequestMapping(value ="/index1",method = RequestMethod.GET,params="name")
public ModelAndView test2() {
ModelAndView modelAndView = new ModelAndView();
///modelAndView.setView(new RedirectView("index1"));
modelAndView.setViewName("index1");//指定頁面要跳轉的view檢視路徑
modelAndView.addObject("message", "呼叫SecondController 的test1方法");//第二個引數:指定了要項前臺傳遞的引數,在前臺可以這樣取值 ${sp_ids }
return modelAndView;
}
表明只能通過GET來訪問,或要POST,改成
[java]
view plain
copy
print?
- method = RequestMethod.POST
@RequestMapping(headers)
headers 的作用也是用於細化對映。只有當請求的 Request Headers 中包含與 heanders 值相匹配的引數,處理方法才會被呼叫。
@RequestMapping(value = "/specify", headers = "accept=text/*")
public String specify(){
return "example_specify_page";
}
請求的 Request Headers 中 Accept 的值必須匹配 text/* ( 如 text/html ),方法才會被呼叫。
三、其它常用註解
handler method 引數繫結常用的註解,我們根據他們處理的Request的不同內容部分分為四類:(主要講解常用型別)
A、處理requet uri 部分(這裡指uri template中variable,不含queryString部分)的註解: @PathVariable;
B、處理request header部分的註解: @RequestHeader, @CookieValue;
C、處理request body部分的註解:@RequestParam, @RequestBody;
D、處理attribute型別是註解: @SessionAttributes, @ModelAttribute;1、 @PathVariable
當使用@RequestMapping URI template 樣式對映時, 即 /fourth/{num}, 這時的num可通過 @Pathvariable註解繫結它傳過來的值到方法的引數上。
示例程式碼:
[java] view plain copy print?- @Controller
- @RequestMapping("/fourth/{num}")
- publicclass FourthController {
- @RequestMapping(value ="/index/{string}")
- public String test(ModelMap model,@PathVariable("num") int num,@PathVariable("string") String string) {
- model.addAttribute("message", "num="+String.valueOf(num)+" string="+string);
- return"index";
- }
- }
@Controller
@RequestMapping("/fourth/{num}")
public class FourthController {
@RequestMapping(value ="/index/{string}")
public String test(ModelMap model,@PathVariable("num") int num,@PathVariable("string") String string) {
model.addAttribute("message", "num="+String.valueOf(num)+" string="+string);
return "index";
}
}
瀏覽器輸入:http://localhost:8080/SpringMVCLearningChapter2/fourth/1234/index/linbingwen
上面程式碼把URI template 中變數num的值和string的值,繫結到方法的引數上。若方法引數名稱和需要繫結的uri template中變數名稱不一致,需要在@PathVariable("num")指定uri template中的名稱。
2、 @RequestHeader、@CookieValue
@RequestHeader 註解,可以把Request請求header部分的值繫結到方法的引數上。
[java] view plain copy print?- @RequestMapping(value = "six/index4")
- public String getHello(@RequestHeader ("host") String hostName,
- @RequestHeader ("Accept") String acceptType,
- @RequestHeader ("Accept-Language") String acceptLang,
- @RequestHeader ("Accept-Encoding") String acceptEnc,
- @RequestHeader ("Cookie") String cookie,
- @RequestHeader ("User-Agent") String userAgent)
- {
- System.out.println("Host : " + hostName);
- System.out.println("Accept : " + acceptType);
- System.out.println("Accept Language : " + acceptLang);
- System.out.println("Accept Encoding : " + acceptEnc);
- System.out.println("Cookie : " + cookie);
- System.out.println("User-Agent : " + userAgent);
- return"index4";
- }
@RequestMapping(value = "six/index4")
public String getHello(@RequestHeader ("host") String hostName,
@RequestHeader ("Accept") String acceptType,
@RequestHeader ("Accept-Language") String acceptLang,
@RequestHeader ("Accept-Encoding") String acceptEnc,
@RequestHeader ("Cookie") String cookie,
@RequestHeader ("User-Agent") String userAgent)
{
System.out.println("Host : " + hostName);
System.out.println("Accept : " + acceptType);
System.out.println("Accept Language : " + acceptLang);
System.out.println("Accept Encoding : " + acceptEnc);
System.out.println("Cookie : " + cookie);
System.out.println("User-Agent : " + userAgent);
return "index4";
}
執行後輸入:http://localhost:8080/SpringMVCLearningChapter2/six/index4
執行結果:
注:@RequestHeader 與@RequestParam 一樣也有3個引數,其含義與的@RequestParam 引數含義相同。
@CookieValue 可以把Request header中關於cookie的值繫結到方法的引數上。
引數繫結的程式碼:
[java] view plain copy print?- @RequestMapping("six/index3")
- public String test3(Model model,@CookieValue(value="JSESSIONID", defaultValue="") String jsessionId) {
- model.addAttribute("jsessionId", jsessionId);
- return"index3";
- }
- <%@ page language="java"contentType="text/html; charset=gb2312"
- pageEncoding="gb2312"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <metahttp-equiv="Content-Type"content="text/html; charset=gb2312">
- <title>Insert title here</title>
- </head>
- <body>
- 採用String返回檢視jsessionId=:${jsessionId}
- </body>
- </html>
<%@ page language="java" contentType="text/html; charset=gb2312"
pageEncoding="gb2312"%>
<!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=gb2312">
<title>Insert title here</title>
</head>
<body>
採用String返回檢視jsessionId=:${jsessionId}
</body>
</html>
結果:
即把JSESSIONID的值繫結到引數cookie上
注:@CookieValue 與@RequestParam 一樣也有3個引數,其含義與的@RequestParam 引數含義相同
3、@RequestParam, @RequestBody
@RequestParam
A) 常用來處理簡單型別的繫結,通過Request.getParameter() 獲取的String可直接轉換為簡單型別的情況( String--> 簡單型別的轉換操作由ConversionService配置的轉換器來完成);因為使用request.getParameter()方式獲取引數,所以可以處理get 方式中queryString的值,也可以處理post方式中 body data的值;
B)用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容,提交方式GET、POST;
C) 該註解有兩個屬性: value、required; value用來指定要傳入值的id名稱,required用來指示引數是否必須繫結;@RequestBody
該註解常用來處理Content-Type: 不是application/x-www-form-urlencoded
編碼的內容,例如application/json, application/xml等;
它是通過使用HandlerAdapter 配置的HttpMessageConverters
來解析post data body,然後繫結到相應的bean上的。
因為配置有FormHttpMessageConverter,所以也可以用來處理 application/x-www-form-urlencoded
的內容,處理完的結果放在一個MultiValueMap<String, String>裡,這種情況在某些特殊需求下使用,詳情檢視FormHttpMessageConverter api;
示例程式碼:
[java] view plain copy print?- @RequestMapping(value = "/something", method = RequestMethod.PUT)
- publicvoid handle(@RequestBody String body, Writer writer) throws IOException {
- writer.write(body);
- }
4、@SessionAttributes, @ModelAttribute
@SessionAttributes:
該註解用來繫結HttpSession中的attribute物件的值,便於在方法中的引數裡使用。
該註解有value、types兩個屬性,可以通過名字和型別指定要使用的attribute 物件;
示例程式碼:
[java] view plain copy print?- @Controller
- @RequestMapping("/editPet.do")
- @SessionAttributes("pet")
- publicclass EditPetForm {
- // ...
- }
@ModelAttribute
該註解有兩個用法,一個是用於方法上,一個是用於引數上;
用於方法上時: 通常用來在處理@RequestMapping之前,為請求繫結需要從後臺查詢的model;
用於引數上時: 用來通過名稱對應,把相應名稱的值繫結到註解的引數bean上;要繫結的值來源於:
A) @SessionAttributes 啟用的attribute 物件上;
B) @ModelAttribute 用於方法上時指定的model物件;
C) 上述兩種情況都沒有時,new一個需要繫結的bean物件,然後把request中按名稱對應的方式把值繫結到bean中。
用到方法上@ModelAttribute的示例程式碼:
[java] view plain copy print?- @ModelAttribute("string1")
- public String preRun() {
- System.out.println("Test Pre-Run");
- String string="linbingwen";
- return string;
- }
@ModelAttribute("string1")
public String preRun() {
System.out.println("Test Pre-Run");
String string="linbingwen";
return string;
}
這種方式實際的效果就是在呼叫@RequestMapping的方法之前,為request物件的model裡put(“string1”, string);
JSP中可以這樣來獲取
[html] view plain copy print?- <%@ page language="java"contentType="text/html; charset=gb2312"
- pageEncoding="gb2312"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <metahttp-equiv="Content-Type"content="text/html; charset=gb2312">
- <title>Insert title here</title>
- </head>
-
相關推薦
SSM搭建-Spring mvc基於註解的配置(13)
Spring2.5引入註解式處理器支援,通過@Controller和@RequestMapping註解定義我們的處理器類。並且提供了一組強大的註解需要通過處理器對映DefaultAnnotationHandlerMapping和處理器介面卡AnnotationMethodHandlerA
Spring MVC 配置及應用 註解配置(2)
SpringMVC 註解應用 /login.do 具體的步驟 -->DispatcherServlet -->HandlerMapping -->LoginController -->ViewReslover -->login.jsp (1)&
Spring 註解配置(2)——@Autowired
Spring 註解配置(2)——@Autowired 轉自- 部落格地址:http://www.cnblogs.com/caoyc/p/5626365.html @Autowired 註釋,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。 通過 @Aut
spring mvc @Transactional 註解 配置 步驟 及 @Transactional 事物無效 注意事項
spring-context.xml檔案配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xs
spring mvc web.xml配置(攔截資源)
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.o
Spring mvc基於註解方式實現簡單HelloWorld
實現spring MVC有兩種不同的方式:基於XML配置檔案和基於註解。 上篇部落格介紹了基於XML配置檔案的方式,這裡我們使用基於註解的方式來實現。 下面只重點介紹與XML配置檔案方式不同的兩個地方:Spring配置檔案(springmvc-servlet.xml)
Spring MVC -- 基於註解的控制器
產品 click 視圖 form hid result lock security ext 在Spring MVC -- Spring MVC入門中,我們創建了兩個采用傳統風格控制器的Spring MVC應用程序,其控制器是實現了Controller接口。Spring 2.
Spring MVC 框架結構介紹(二)
指定 let url 16px () isp -s 一個 ping Spring MVC框架結構 Spring MVC是圍繞DispatcherServlet設計的,DispatcherServlet向處理程序分發各種請求。處理程序[email prot
Java 系列之spring學習--springmvc註解方式(五)
internal fault .org blank port imp handle scan html 一、springmvc註解方式 註解方式使用的更多,更加靈活。在上一篇的博客的基礎上修改springmvc-servlet.xml配置文件。 <?xml ve
spring boot之入門配置(一)
麻煩 config src 符號 pos files 分享圖片 PE strong yml、properties配置文件 yml相比properties配置文件,yml可以省略不必要的前綴,並且看起來更加的有層次感。推薦使用yml文件。 @Value 根據
Spring MVC 靜態資源處理 (三)
完整的專案案例: springmvc.zip 目錄 例項 專案結構: 一、配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.
Spring Boot多資料來源配置(一)durid、mysql、jpa整合
目前在做一個統計專案。需要多資料來源整合,其中包括mysql和mongo。本節先講mysql、durid、jpa與spring-boot的整合。 引入Durid包 <dependency> <groupId>com.a
[Spring] Spring 探祕 之 事務配置(一)
目錄 [Spring] Spring 探祕 之 事務配置(一) 準備工作 資料庫事務簡介 Spring宣告式事務管理 事務管理器的配置 Spring配置事務管理器和策略 Spring 事務傳播規則 RE
利用Maven搭建Spring+SpringMVC+Mybatis框架專案(二)
上次寫到將Spring和Mybatis整合到了一起,這次便將SpringMVC整合進去,SpringMVC只負責controller和頁面之間的跳轉,也就是隻負責和使用者互動 3.2 整合SpringMVC框架 3.2.1 建立spring-mvc.xml
spring boot 新增spring mvc 訊息轉化器 (五)
com.heimeiqiu.config.CommonConfig 訊息轉化器 package com.heimeiqiu.config; import org.springframework.context.annotation.Bean; import org.sp
Spring+Mybatis多資料來源配置(四)——AbstractRoutingDataSource實現資料來源動態切換
有時候需要在程式中動態切換資料來源,那麼這個系列的之前的博文所闡述的方法就不再使用了,總不能通過程式更改config.properties檔案的dataSource的值,然後再重啟web伺服器以便載入applicationContext.xml檔案。這裡講訴的是如何利用Ab
spring mvc主流程原始碼閱讀(剖析)
第一步,通過web.xml的配置可以知道,使用者訪問url第一次先走到DispatchServlet,(預設你學過基本的java的
Spring Boot 外部化配置(一)- Environment、ConfigFileApplicationListener
目錄 前言 1、起源 2、外部化配置的資源型別 3、外部化配置的核心 3.1 Environment 3.1.1、ConfigFileApplicationListener
Spring Boot 外部化配置(二) - @ConfigurationProperties 、@EnableConfigurationProperties
目錄 3、外部化配置的核心 3.2 @ConfigurationProperties 3.2.1 註冊 Properties 配置類 3.2.2 繫結配置屬性 3.1.3 Configurat
Spring學習(穀粒學院spring4課程)第四節 基於註解配置bean
元件掃描(component scanning): Spring 能夠從 classpath 下自動掃描, 偵測和例項化具有特定註解的元件. 特定元件包括: @Component: 基本註解, 標識了一個受 Spring 管理的元件 @Respository: 標識