1. 程式人生 > 實用技巧 >07SpringMVC請求&響應

07SpringMVC請求&響應

響應資料

響應方式:頁面跳轉、回寫資料

  1. 頁面跳轉

    • 直接返回字串: 返回字串和檢視解析器的前後綴拼接後跳轉

      @RequestMapping("/test1")
      public String save(){
      	return "index.jsp";
      }
      
    • 通過ModelAndView物件返回(兩種實現方式)

      @RequestMapping("/test1")
      public ModelAndView save1(){
      	/* 
      	Model模型:封裝資料
      	View檢視:展示資料
      	*/
      	ModelAndView modelAndView = new ModelAndView();
      	// 設定模型資料
      	modelAndView.addObject("username", "Tom");
      	// 設定檢視頁面
      	modelAndView.setViewName("index.jsp")
      	return modelAndView;
      }
      
      // 推薦方式,寫到引數中,spring框架會識別
      @RequestMapping("/test2")
      public ModelAndView save2(ModelAndView modelAndView){
      	// 設定模型資料
      	modelAndView.addObject("username", "Tom");
      	// 設定檢視頁面
      	modelAndView.setViewName("index.jsp")
      	return modelAndView;
      }
      
  2. 回寫資料

    • 直接返回字串(web基礎階段,使用的是resp.getWriter().print("hello world")

      • 加註解@ResponseBody
      @RequestMapping("/test3")
      public void save3(HttpServletResponse resp){
      	resp.getWriter().print("hello world");
      }
      
      // 推薦方式, 加註解
      @RequestMapping("/test4")
      @ResponseBody
      public String save4(){
      	return "hello world";
      }
      
    • 返回物件和集合(json資料)

      @RequestMapping("/test5")
      @ResponseBody
      public String save5(){
      	User user = new User();
      	user.setUsername("Tom");
      	// json轉換工具 (匯入座標)
      	OjbectMapper objectMapper = new ObjectMapper();
      	String json = objectMapper.writeValueAsString(user);
      	return json;
      }
      
      // 推薦方式:springMVC自動轉換成json格式(需要配置spring-mvc.xml)
      @RequestMapping("/test6")
      @ResponseBody
      public User save6(){
      	User user = new User();
      	user.setUsername("Tom");
      	return user;
      }
      // 配置檔案:註解驅動,底層配置物件和json資料轉換
      // 注意,需要新增mvc名稱空間
      <mvc:annotation-driven/>
      

請求資料

客戶端請求引數的格式是:name=value&name=value...

伺服器會自動封裝資料,SpringMVC可以接收如下型別的引數:

  • 基本型別
  • POJO型別(簡單JavaBean)
  • 陣列
  • 集合

基本型別

訪問位址列引數和定義業務處理函式的引數一致即可

@RequestMapping("/test")
@ResponseBody
public void save(String username) {
	System.out.println(username);
}

POJO

SpringMVC會自動把請求資料封裝到類,直接使用即可

@RequestMapping("/test")
@ResponseBody
public void save(User user) {
	System.out.println(user.getName());
}

陣列

客戶端請求資料如果為陣列,格式為:xx=1&xx=2&xx=3...

@RequestMapping("/test")
@ResponseBody
public void save(String[] arr) {
	System.out.println(Arrays.asList(arr));
}

集合

獲取集合時,要將集合封裝到一個POJO中(JavaBean中)。

class VO{
	private List<User> userList;
	public void setUserList(){}
	public List<User> getUserList(){}
	public void toString(){}
}

@RequestMapping("/test")
@ResponseBody
public void save(VO vo) {
	System.out.println(vo);
}

如果使用ajax提交資料,指定json提交資料格式。那麼就就可以直接接受集合資料。(使用js時,需要指定靜態資源,下面再講)

@RequestMapping("/test")
@ResponseBody
public void save(@RequestBody List<User> userList) {
	System.out.println(userList);
}

靜態資源訪問

靜態資源訪問和@RequestMapping("/xxx")衝突,需要在web.xml開啟靜態資源訪問。

<!--js檔案-->
<mvc:resources mapping="/js/**" location="/js/"/>
<!--img檔案-->
<mvc:resources mapping="/img/**" location="/img/"/>

或者使用如下配置,表示如果SpringMVC找不到對應資源,就交給原始容器Tomcat,Tomcat可以找到靜態資源。

<mvc:default-servlet-handler>

請求資料亂碼

當post請求資料時,資料可能會出現亂碼,我們可以在web.xml中設定一個過濾器來進行編碼的過濾。

<!--  過濾器:全域性資料的編碼設定-->
<filter>
  <filter-name>CharacterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <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>

引數繫結註解

當請求引數和業務處理函式引數命名不一致時,可以使用@RequestParam,它的引數有:

  • value:與請求引數名稱相同
  • required:是否 必須包含指定引數,預設是
  • defaultValue:當沒有指定引數時,使用這個預設值
@RequestMapping("/test")
@ResponseBody
public void save(@RequestParam("name") String username) {
    System.out.println(username);
}

獲取Restful風格的引數

Restful風格是一種架構風格、設計風格,不是標準,是一種設計原則和約束條件。主要用於客戶端伺服器互動軟體,這個風格設計的軟體可以更簡潔,更有層次,更易於實現快取機制等。

Restful風格的請求是使用"url+請求方式"表示一次請求目的,HTTP協議裡面四個表示操作方式的動詞如下:

  • GET :獲取資源
  • POST:新建資源
  • PUT:更新資源
  • DELETE:刪除資源

例如 :

  • /user/1 GET:獲取id=1的user
  • /user/1 DELETE:刪除id=1的user

在SpringMVC中,獲取Restful風格引數就是使用佔位符和註解@PathVariable

如,獲取變數name的值。http://localhost:80/user/zhangsan

@RequestMapping("/user/{name}")
@ResponseBody
public void save(@PathVariable("name") String username) {
    System.out.println(username);
}

自定義型別轉換器

因為請求的都是字串,所以SpringMVC提供了一些常用的型別轉換器,如字串轉成int。但是還有一些如日期,它的資料格式多樣,此時就需要自定義型別轉換器。

步驟:

  1. 定義轉換器類實現Converter介面

    public class DateConverter implements Converter<String, Date> {
    
        @Override
        public Date convert(String source) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            Date date = format.parse(source);
            return date;
        }
    }
    
  2. 在sprin-mvc.xml配置檔案中宣告轉換器

    <!--    宣告轉換器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="baidu.controller.DateConverter"/>
            </list>
        </property>
    </bean>
    
  3. 在sping-mvc.xml配置檔案中:使用<annotation-driven>引用轉換器

    <!--    mvc的註解驅動-->
    <mvc:annotation-driven conversion-service="conversionService"/>
    

獲取請求頭

@RequestHeader獲取請求頭,如:獲取請求頭並列印。

@RequestMapping("/test")
@ResponseBody
public void save(@RequestHeader(value = "User-Agent", required = false) String user) {
    System.out.println(user);
}

直接獲取請求頭中的Cookie,可以使用@CookieValue獲取指定Cookie的值

@RequestMapping("/test")
@ResponseBody
public void save(@CookieValue(value = "MyCookieId", required = false) String cookie) {
    System.out.println(cookie);
}