1. 程式人生 > 其它 >SpringMVC(六)-響應資料和結果檢視

SpringMVC(六)-響應資料和結果檢視

技術標籤:Java框架springmvc

一、返回值分類

1、請求返回值為字串

(1)點選response.jsp中的超連結,傳送請求。

(2)根據請求路徑,執行UserController類中的testString()方法,查到資料放入Model中,Model可以把值傳到request域,這樣頁面就可以拿到資料了

(3)UserController類中的testString()方法返回字串"success",在springmvc.xml中配置的檢視解析器,會根據配置及返回值,找到/WEB-INF/pages/目錄下的success.jsp,並跳轉至這個頁面。

(4)success.jsp頁面中<page>標籤中配置的 isELIgnored="false" 會使EL表示式生效,從而在頁面上顯示出後臺查詢出的值。

<!-- response.jsp,發起請求連線的頁面 -->

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="user/testString" >testString</a>
</body>
</html>
<!-- success.jsp,請求成功後的頁面 -->

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <h3>執行成功</h3>

    ${user.username}
    ${user.password}

</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testString")
    public String testString(Model model){
        System.out.println("testString方法執行了...");
        // 模擬從資料庫中查詢出User物件
        User user = new User();
        user.setUsername("小明");
        user.setPassword("123");
        user.setAge(18);
        // model物件
        model.addAttribute("user",user);
        return "success";
    }

}
public class User implements Serializable{

    private String username;
    private String password;
    private Integer age;

    // 省略get and set 
}

2、請求無返回值

(1)如果不做處理,即執行testVoidOne()方法,後臺執行完後預設會去@RequestMapping()標註的路徑下找jsp檔案,如下程式碼若不處理,則會到:專案名/WEB-INF/pages/user目錄下找testVoid.jsp檔案。

(2)呼叫請求轉發(只進行一次請求),即執行testVoidTwo()方法,不會使用springmvc.xml中配置的檢視解析器,所以轉發頁面目錄地址要寫完整。

(3)呼叫請求重定向(進行兩次請求),即執行testVoidThree()方法,第二次請求不能直接訪問/WEB-INF/pages/目錄,要利用request.getContextPath()方法獲取專案名,拼接完整頁面檔案路徑。

(4)直接通過輸出流響應資料,即執行testVoidFour()方法,要注意設定中文編碼格式

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testVoidOne")
    public void testVoidOne(Model model){
        System.out.println("testVoidOne方法執行了...");
    }

    @RequestMapping("/testVoidTwo")
    public void testVoidTwo(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("testVoidTwo方法執行了...");
        request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
        return;
    }

    @RequestMapping("/testVoidThree")
    public void testVoidThree(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("testVoidThree方法執行了...");
        response.sendRedirect(request.getContextPath()+"/index.jsp");
        return;
    }

    @RequestMapping("/testVoidFour")
    public void testVoidFour(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("testVoidFour方法執行了...");

        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        response.getWriter().print("你好");
        return;
    }

}

3、返回ModelAndView物件

ModelAndView是SpringMVC為我們提供的一個物件,該物件也可以用作控制器方法的返回值。

<!-- response.jsp,發起請求連線的頁面 -->

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="user/testModelAndView" >testModelAndView</a>
</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testModelAndView")
    public String testModelAndView(){
        System.out.println("testModelAndView方法執行了...");
        ModelAndView mv = new ModelAndView();

        // 模擬從資料庫中查詢出User物件
        User user = new User();
        user.setUsername("小明");
        user.setPassword("123");
        user.setAge(18);

        // 把user物件儲存到mv物件中,也會把user物件存入到request物件
        mv.addObject("user",user);

        // 跳轉到哪個頁面
        mv.setViewName("success");

        return mv;
    }

}

二、利用關鍵字進行轉發和重定向(使用較少)

用關鍵字進行轉發(forward)和重定向(redirect),是無法使用檢視解析器的,所以跳轉到的頁面目錄地址要寫完整。重定向(redirect)的頁面目錄地址不必寫出專案名,框架自動填補了。

<!-- response.jsp,發起請求連線的頁面 -->

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <a href="user/testForwardOrRedirect" >testForwardOrRedirect</a>
</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testForwardOrRedirect")
    public String testForwardOrRedirect(){
        System.out.println("testForwardOrRedirect方法執行了...");

        // 請求的轉發
        // return "forward:/WEB-INF/pages/success.jsp";

        // 重定向
        return "redirect:/index.jsp";
    }

}

三、ResponseBody響應json資料

(1)利用ajax傳送非同步請求,在src/main/webapp/js資料夾下匯入jquery.min.js,並在傳送請求頁面匯入。

(2)由於DispatcherServlet會攔截到所有的資源,就會導致靜態資源(img、css、js)也被攔截而不能使用。需要在springmvc.xml檔案新增不攔截靜態資原始檔的配置,見以下程式碼。

(3)ajax中要以json字串的形式,封裝傳入後臺的資料,字串中的key要與JavaBean的屬性名稱一致。控制器中@RequestBody註解會自動將客戶端傳來的json資料封裝為相應的JavaBean,但是需要匯入jackson相關jar包。

(4)後臺控制器處理完業務之後,@ResponseBody註解會將JavaBean物件資料轉換為json格式資料返回給客戶端,從而完成非同步請求。

<!-- jackson相關jar包引入 -->
<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-core</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.0</version>
</dependency>
    <!-- springmvc.xml檔案新增的配置內容 -->
    <!-- 前端控制器,哪些靜態資源不攔截 -->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>

<!-- response.jsp,發起請求連線的頁面 -->

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="js/jquery.min.js"></script>

    <script>
        // 頁面載入,繫結單擊事件
        $(function(){
            $("#btn").click(function(){
                // alert("hello btn");
                // 傳送ajax請求
                $.ajax({
                    // 編寫json格式,設定屬性和值
                    url:"user/testAjax",
                    contentType:"application/json;charset=UTF-8",
                    data:'{"username":"Jack","password":"123","age":26}',
                    dataType:"json",
                    type:"post",
                    success:function(data){
                        // data伺服器端響應的json的資料,進行解析
                        alert(data);
                        alert(data.username);
                        alert(data.password);
                        alert(data.age);
                    }
                });
            });
        });
    </script>

</head>

<body>
    <button id="btn">傳送ajax的請求</button>
</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testAjax")
    public @ResponseBody User testAjax(@RequestBody User user){
        System.out.println("testAjax方法執行了...");

        // 客戶端傳送ajax的請求,傳的是json字串,後端把json字串封裝到user物件中
        System.out.println(user);

        // 模擬查詢資料庫
        user.setUsername("Tom");
        user.setAge(28);
        
        // 響應
        return user;
    }

}