1. 程式人生 > 其它 >SpringMVC的資料響應

SpringMVC的資料響應

SpringMVC的資料響應方式

1, 頁面跳轉
       直接返回字串
       通過ModelAndView物件返回
2) 回寫資料
      直接返回字串
      返回物件或集合

頁面跳轉

 

2. 返回ModelAndView物件 

3. 向request域儲存資料
通過ModelAndView的  addObject() 方法設定

 回寫資料 

1. 直接返回字串
Web基礎階段,客戶端訪問伺服器端,如果想直接回寫字串作為響應體返回的話,只需要使用
response.getWriter().print(“hello world”) 即可,那麼在Controller中想直接回寫字串該怎樣呢?

① 通過SpringMVC框架注入的response物件,使用response.getWriter().print(“hello world”) 回寫數
據,此時不需要檢視跳轉,業務方法返回值為void。

 

② 將需要回寫的字串直接返回,但此時需要通過@ResponseBody註解告知SpringMVC框架,方法
返回的字串不是跳轉是直接在http響應體中返回。

@RequestMapping(value = "/quick6" )
@ResponseBody //告知springmvc框架 不進行檢視跳轉  直接進行資料響應
public  String save6(HttpServletResponse response) throws IOException {
    return "hello  study06!";
}

在非同步專案中,客戶端與伺服器端往往要進行json格式字串互動,此時我們可以手動拼接json字串返回

@RequestMapping(value = "/quick7" )
@ResponseBody
public  String save7() {

    return "{\"username\":\"zhangsan\",\"age\":18}";
}

上述方式手動拼接json格式字串的方式很麻煩,開發中往往要將複雜的java物件轉換成json格式的字串,
我們可以使用web階段學習過的json轉換工具jackson進行轉換,匯入jackson座標

<!--jackson-->
   <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-core</artifactId>
       <version>2.9.0</version>
   </dependency>
   <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
       <version>2.9.0</version>
   </dependency>
   <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-annotations</artifactId>
       <version>2.9.0</version>
   </dependency>

通過jackson轉換json格式字串,回寫字串。 

@RequestMapping(value = "/quick8" )
@ResponseBody
public  String save8() throws JsonProcessingException {
    User user=new User();
    user.setUsername("lisi");
    user.setAge(30);
 //使用json轉換工具 將物件轉換成json格式的字串返回
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(user);

    return json;
}

通過SpringMVC幫助我們對物件或集合進行json字串的轉換並回寫,為處理器介面卡配置訊息轉換引數,
指定使用jackson進行物件或集合的轉換,因此需要在spring-mvc.xml中進行如下配置:

<!--配置處理器對映器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <!--json的轉換器 MappingJackson2HttpMessageConverter -->
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
        </list>
    </property>
</bean>

返回物件或集合

@RequestMapping(value = "/quick9" )
@ResponseBody
//期望SpringMVC自動將User轉換成json格式的字串---------》spring-mvc.xml中配置介面卡
public  User save9() throws JsonProcessingException {
    User user=new User();
    user.setUsername("wangwu");
    user.setAge(30);

    return user;
}

2. 返回物件或集合

在方法上新增@ResponseBody就可以返回json格式的字串,但是這樣配置比較麻煩,配置的程式碼比較多,
因此,我們可以使用mvc的註解驅動代替上述配置。 

<!--mvc的註解驅動-->
<mvc:annotation-driven/>

在 SpringMVC 的各個元件中,處理器對映器處理器介面卡檢視解析器稱為 SpringMVC 的三大元件。
使用<mvc:annotation-driven>自動載入 RequestMappingHandlerMapping(處理對映器)和
RequestMappingHandlerAdapter( 處 理 適 配 器 ),可用在Spring-xml.xml配置檔案中使用
<mvc:annotation-driven>替代註解處理器和介面卡的配置。
同時使用<mvc:annotation-driven>預設底層就會整合jackson進行物件或集合的json格式字串的轉換。

 

SpringMVC 獲得請求資料 

客戶端請求引數的格式是:name=value&name=value… …
伺服器端要獲得請求的引數,有時還需要進行資料的封裝,SpringMVC可以接收如下型別的引數:
   基本型別引數
   POJO型別引數
   陣列型別引數
   集合型別引數

獲得基本型別引數

Controller中的業務方法的引數名稱要與請求引數的name一致,引數值會自動對映匹配。 

 獲得POJO型別引數

Controller中的業務方法的POJO引數的屬性名與請求引數的name一致,引數值會自動對映匹配

獲得陣列型別引數

Controller中的業務方法陣列名稱與請求引數的name一致,引數值會自動對映匹配。

獲得集合型別引數

public class User {

    private String username;
    private int age;

    public String getUsername() {
        return username;
    }
public class Vo {
    private List<User> userList;

    public List<User> getUserList() {
        return userList;
    }
@RequestMapping(value = "/quick14")
@ResponseBody
public  void save14(Vo vo){
    System.out.println(vo);
}
<form action="${pageContext.request.contextPath}/user/quick14" method="post">
       <%--表明是第一個User物件的username age--%>
    <input type="text" name="userList[0].username"><br/> <%--userLiset集合第一個user物件的 username--%>
    <input type="text" name="userList[0].age"><br/>
           <input type="text" name="userList[1].username"><br/>
           <input type="text" name="userList[1].age"><br/>
    <input type="submit">
</form>

 

請求資料亂碼問題 

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

<!--配置全域性過濾的filter-->
<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

當請求的引數名稱與Controller的業務方法引數名稱不一致時,就需要通過@RequestParam註解顯示的繫結

@RequestMapping(value = "/quick16" )
@ResponseBody     //localhost:8080/study_spring_mvc/user/quick16?username=zhangsan
                  //localhost:8080/study_spring_mvc/user/quick16?name=zhangsan
public  void save10(@RequestParam(value="name",required = false,defaultValue = "哈哈哈哈") String username)  {
    System.out.println(username);        // @RequestParam
                                        //value:與請求引數名稱
                               // required:此在指定的請求引數是否必須包括,預設是true,提交時如果沒有此引數則報錯
                                //defaultValue:當沒有指定請求引數時,則使用指定的預設值賦值
}

 獲得請求頭 

 @RequestHeader 使用@RequestHeader可以獲得請求頭資訊,相當於web階段學習的request.getHeader(name)

value:請求頭的名稱
required:是否必須攜帶此請求頭

 @CookieValue

@RequestMapping(value = "/quick18" )
@ResponseBody    //@CookieValue 獲取Cookie頭
public  void save18(@CookieValue(value = "JSESSIONID") String jsessionId)  {
    System.out.println(jsessionId);
}

 檔案上傳

表單項type=“file”
 表單的提交方式是post
 表單的enctype屬性是多部分表單形式,及enctype=“multipart/form-data”

 

單檔案上傳步驟 

① 匯入fileupload和io座標
② 配置檔案上傳解析器
③ 編寫檔案上傳程式碼

匯入fileupload和io座標

<!--檔案上傳所需要的座標-->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.3</version>
</dependency>

配置檔案上傳解析器

 單檔案上傳實現

<form action="${pageContext.request.contextPath}/user/quick22" method="post" enctype="multipart/form-data">
    名稱<input type="text" name="name"><br/>
    檔案<input type="file" name="uploadFile"><br/>
    <input type="submit" value="提交">
</form>
@RequestMapping(value = "/quick22" )
@ResponseBody    // uploadFile名稱要和 form表單 檔案上傳的  name值一樣
public  void save22(String name, MultipartFile uploadFile) throws IOException {
    System.out.println(name);
    //獲得檔案上傳名稱
    String originalFilename = uploadFile.getOriginalFilename();
    //儲存檔案
    uploadFile.transferTo(new File("F:\\upload\\"+originalFilename));
}

多檔案上傳實現

多檔案上傳,只需要將頁面修改為多個檔案上傳項,將方法引數MultipartFile型別修改為MultipartFile[]即可