1. 程式人生 > 其它 >Day10註解(Annotation)和反射(Reflection)

Day10註解(Annotation)和反射(Reflection)

SpringMVC的資料響應

springmvc的資料響應分為兩種方式:

  • 頁面跳轉
  • 回寫資料

頁面跳轉

1. 返回字串形式

直接返回字串:此方式會將返回的字串和檢視解析器的前後綴拼接然後跳轉。

@RequestMapping("/success")
public String success(){
  return "success";
}
<property name="prefix" value="/jsp/" />
<property name="suffix" value=".jsp" />

若有上面的檢視解析器配置,則轉發的資源地址就是 /jsp/success.jsp



2. 返回ModelAndView物件

    // 返回ModelAndView
    @RequestMapping("/success2")
    public ModelAndView print_test2(){
        /**
         * model 模型用來封裝資料
         * view  檢視用來展示檢視
         */
        ModelAndView model_view = new ModelAndView();
        // 設定模型資料(鍵值對)
        model_view.addObject("name","sjj");
        // 設定檢視名稱
        model_view.setViewName("success");
        return model_view;
    }

此時我們可以將封裝的資料顯示在success.jsp中

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>測試</title>
</head>
<body>
<h1>成功 --- ${name}</h1>
</body>
</html>

這樣訪問 /success2 就能看見封裝的資料了
當然你也可以將ModelAndView物件作為引數,SpringMVC會自動為你建立物件

    // 返回ModelAndView2
    @RequestMapping("/success3")
    public ModelAndView print_test3(ModelAndView model_view){
        // 設定模型資料(鍵值對)
        model_view.addObject("name","sjj2");
        // 設定檢視名稱
        model_view.setViewName("success");
        return model_view;
    }

回寫資料

1. 回寫字串

    // 字串回寫
    @ResponseBody // 告訴SpringMVC是回寫資料而不是跳轉頁面
    @RequestMapping("/success4")
    public String writeFun(HttpServletResponse response) {
        return "hello world";
    }

當然,在實際的開發過程中我們回返回更有用的字串如json格式的字串
這時候我們可以匯入jackson相應的包來輔助開發

2. 返回物件

準備一個實體User類

package com.sjj.domain;

import org.springframework.stereotype.Component;

@Component("user")
public class User {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

編寫返回User物件的方法

    @ResponseBody
    @RequestMapping("/success5")
    public User writeFun2(User user) {
        user.setName("sjj");
        user.setAge(19);
        return user;
    }

我們希望SpringMVC能自動幫我們把類轉為json型別的字串,因此需要在spring-mvc.xml中配置處理器對映器
先在pom.xml中匯入依賴

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.10</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.10</version>
    </dependency>

然後編寫處理器對映器

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

有更簡潔的配置方式

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

SpringMVC的請求資料

眾所周知客戶端請求引數的格式是 name1=value1&name2=value2...
伺服器要獲得請求的引數,有時需要進行資料的封裝,SpringMVC可以接收如下引數:

  • 基本型別引數
  • POJO型別引數
  • 陣列型別引數

獲得基本型別引數

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

    @ResponseBody
    @RequestMapping("/success6")
    public void printRequest(String name,int age) {
        System.out.println(name);
        System.out.println(age);
    }

我們訪問 http://localhost:8080/success6?name=sjj&age=19 會發現控制檯返回了字串sjj和整型19的基本型別資料

獲得POJO型別引數

我們仍然是以上面的User類和訪問的http://localhost:8080/success7?name=sjj&age=19為例,只不過我們只需要把接收的引數改為User

    @ResponseBody
    @RequestMapping("/success7")
    public void printRequest2(User user) {
        System.out.println(user);
    }

記得寫toString方法更直觀哦

獲得陣列型別引數

只要是name一致,陣列也是可以接收的,比如這次我們訪問 http://localhost:8080/success8?lis=1&lis=2&lis=3

    @ResponseBody
    @RequestMapping("/success8")
    public void printRequest3(String[] lis ) {
        System.out.println(Arrays.toString(lis));
    }

獲得集合型別引數

當使用ajax提交時,可以提交contentType為json格式,那麼在方法引數位置使用RequestMapping可以直接接收請求資料而無需進行POJO封裝
先在spring-mvc.xml中開啟靜態資源訪問

    <!--開放靜態資源訪問-->
    <mvc:resources mapping="/js/**" location="/js/" />
    <!--或者是交給原始容器來找靜態資源-->
    <mvc:default-servlet-handler />

例如我們有這樣一個頁面,訪問時為 http://localhost:8080/jsp/ajax.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>ajax</title>
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
    <script>
        const userList = [];
        userList.push({name:"小A",age:18});
        userList.push({name:"小B",age:19});
        $.ajax({
            type:"POST",
            url:"${pageContext.request.contextPath}/success10",
            data:JSON.stringify(userList),
            contentType:"application/json;charset=utf-8"
        })
    </script>
</head>
<body>

</body>
</html>

對應的返回方法是

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