@RequestMapping注解
1. RequestMapping注解的作用是建立請求URL和處理方法之間的對應關系
2. RequestMapping注解可以作用在方法和類上
1. 作用在類上:第一級的訪問目錄
2. 作用在方法上:第二級的訪問目錄
3. 細節:路徑可以不編寫 / 表示應用的根目錄開始
4. 細節:${ pageContext.request.contextPath }也可以省略不寫,但是路徑上不能寫 /
3. RequestMapping的屬性
1. path 指定請求路徑的url
2. value value屬性和path屬性是一樣的
3. mthod 指定該方法的請求方式
4. params 指定限制請求參數的條件
5. headers 發送的請求中必須包含的請求頭
常用注解
@RequestParam
范圍:方法參數上(value = “表單屬性名”)
作用:使 由于頁面和傳入參數的變量名不同導致 的 賦值失敗情況變為成功
例子:
@RequestMapping("/param")
public String paramUser(@RequestParam("uname") String username){
System.out.println("username = " + username);
return "param" ;
}
@RequestBody
范圍:方法參數上
作用:用于獲取請求體的內容(注意:get方法不可以)以鍵值對的形式aa=AA&bb=BB
例子:
@RequestMapping("/param")
public String paramUser(@RequestBody String body){
System.out.println("body = " + body);
return "param" ;
}
@PathVaribale
范圍:方法參數上(value = “restful路徑上的占位符”)
作用:把路徑上的值取到賦值給方法上的形參
例子:
@RequestMapping("/param/{qid}")
public String paramUser(@PathVariable("qid") Integer id){
System.out.println("id = " + id);
return "param" ;
}
@RequestHeader
范圍:方法參數上value = “想要獲取值的頭名“
作用:獲取指定請求頭的值
例子:
@RequestMapping("/param")
public String paramUser(@RequestHeader("請求頭") Integer name){
System.out.println("name = " + name);
return "param" ;
}
@CookieValue
范圍:方法參數上value = “想要獲取值的Cookie名
作用:獲取指定請求頭的值
例子:
@RequestMapping("/param")
public String paramUser(@CookieValue("JSESSIONID") String jsessionid){
System.out.println("jsessionid = " + jsessionid);
return "param" ;
}
@ModelAttribute
范圍:方法上、方法參數上
作用:以頁面傳來的值為準,沒傳來的由前一個方法返回的返回值填補,@ModelAttribute標注過的方法會在@RequestMapping標注過的方法前運行
例子1:方法上
@Controller
@RequestMapping("/first")
public class HelloController {
@RequestMapping("/modelAttribute")
public String second(User userFirst){
System.out.println("userFirst = " + userFirst);
return "param" ;
}
@ModelAttribute
public User first(){
User userFirst = new User();
List<Account> accounts = new ArrayList<Account>();
Account account1 = new Account();
account1.setAccountName("setAccountName1");
account1.setAccountJob("setAccountJob1");
account1.setAccountPara("setAccountPara1");
Account account2 = new Account();
account2.setAccountName("setAccountName2");
account2.setAccountJob("setAccountJob2");
account2.setAccountPara("setAccountPara2");
accounts.add(account1);
accounts.add(account2);
userFirst.setAccounts(accounts);
return userFirst ;
}
}
例子2:方法參數上
/**
* 控制器實例類
*/
@Controller
@RequestMapping("/first")
public class HelloController {
@RequestMapping("/modelAttribute")
public String second(@ModelAttribute("user1")User userFirst) {
System.out.println("userFirst = " + userFirst);
return "param";
}
@ModelAttribute
public void first(Map<String,User> userMap) {
User userFirst = new User();
List<Account> accounts = new ArrayList<Account>();
Account account1 = new Account();
account1.setAccountName("setAccountName1");
account1.setAccountJob("setAccountJob1");
account1.setAccountPara("setAccountPara1");
accounts.add(account1);
userFirst.setAccounts(accounts);
userMap.put("user1",userFirst);
return;
}
}
@SessionAttribute
范圍:
作用:用于多次執行控制器方法間的參數共享
例子:
/**
* 控制器實例類
*/
@Controller
@RequestMapping("/first")
/**
* 把數據存入到session域對象中
*/
@SessionAttributes(value = {"username", "password", "age"}, types = {String.class, Integer.class})
public class HelloController {
/**
* 向session中存入值
*
* @return
*/
@RequestMapping(path = "/save")
public String save(Model model) {
System.out.println("向session域中保存數據");
model.addAttribute("username", "root");
model.addAttribute("password", "123");
model.addAttribute("age", 20);
return "success";
}
/**
* 從session中獲取值
*
* @return
*/
@RequestMapping(path = "/find")
public String find(ModelMap modelMap) {
String username = (String) modelMap.get("username");
String password = (String) modelMap.get("password");
Integer age = (Integer) modelMap.get("age");
System.out.println(username + " : " + password + " : " + age);
return "success";
}
/**
* 清除值
*
* @return
*/
@RequestMapping(path = "/delete")
public String delete(SessionStatus status) {
status.setComplete();
return "success";
}
}
請求參數的綁定
請求參數的綁定說明
- 綁定機制
- 表單提交的數據都是k=v格式的 username=haha&password=123
- SpringMVC的參數綁定過程是把表單提交的請求參數,作為控制器中方法的參數進行綁定的
- 要求:提交表單的name和參數的名稱是相同的
- 支持的數據類型
- 基本數據類型和字符串類型
- 實體類型(JavaBean)
- 集合數據類型(List、map集合等)
基本數據類型和字符串類型
提交表單的name和參數的名稱是相同的
區分大小寫
-
實體類型(JavaBean)
- 提交表單的name和JavaBean中的屬性名稱需要一致
- 如果一個JavaBean類中包含其他的引用類型,那么表單的name屬性需要編寫成:對象.屬性 例如: address.name
-
給集合屬性數據封裝
- JSP頁面編寫方式:list[0].屬性
-
請求參數中文亂碼的解決
-
在web.xml中配置Spring提供的過濾器類
<!-- 配置過濾器,解決中文亂碼的問題 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filterclass> <!-- 指定字符集 --> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
-
自定義類型轉換器
表單提交的任何數據類型全部都是字符串類型,但是后臺定義Integer類型,數據也可以封裝上,說明 Spring框架內部會默認進行數據類型轉換。
-
如果想自定義數據類型轉換,可以實現Converter的接口
-
自定義類型轉換器
package cn.itcast.utils; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.core.convert.converter.Converter; /** * 把字符串轉換成日期的轉換器 * @author rt */ public class StringToDateConverter implements Converter<String, Date> { /** * 進行類型轉換的方法 */ public Date convert(String source) { // 判斷 if(source == null) { throw new RuntimeException("參數不能為空"); } } }
-
注冊自定義類型轉換器,在springmvc.xml配置文件中編寫配置
<!-- 注冊自定義類型轉換器 --> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="cn.itcast.utils.StringToDateConverter"/> </set> </property> </bean> <!-- 開啟Spring對MVC注解的支持 --> <mvc:annotation-driven conversion-service="conversionService"/>
-
-
在控制器中使用原生的ServletAPI對象
- 只需要在控制器的方法參數定義HttpServletRequest和HttpServletResponse對象