系列4、SpringMVC響應數據和結果視圖

項目結構以下javascript

1、返回值分類

一 返回字符串

Controller方法返回字符串能夠指定邏輯視圖的名稱,根據視圖解析器爲物理視圖的地址,根據字符串最後跳轉到對應jsp頁面css

第一步、導入依賴座標文件、配置好webxml文件、springmvc核心配置文件html

<resources>
            <!-- mapper.xml文件在java目錄下 -->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
    <!--鎖定全部spring的版本-->
    <properties>
        <spring.version>5.0.2.RELEASE</spring.version>
        <!--編譯版本修改-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <!-- SpringMVC的核心控制器:前端控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 而後配置Servlet的初始化參數,讀取springmvc的配置文件,建立spring容器 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!-- 首先是:servlet啓動時加載對象 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--配置過濾器解決中文亂碼:提供初始化參數-->
    <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>
        <!-- 啓動過濾器 -->
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 配置spring建立容器時要掃描的包 -->
    <context:component-scan base-package="com.cc"></context:component-scan>

    <!-- 配置視圖解析器:返回請求成功後的頁面 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--文件所在的目錄:相對路徑-->
        <property name="prefix" value="/pages/"></property>
        <!--文件的後綴名-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--告訴前端控制器,那些靜態資源不攔截-->
    <!--<mvc:resources location="/css/" mapping="/css/**"/> &lt;!&ndash; 樣式 &ndash;&gt;
    <mvc:resources location="/images/" mapping="/images/**"/> &lt;!&ndash; 圖片 &ndash;&gt;-->
    <mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->

    <!--配置spring開啓註解mvc的支持-->
    <mvc:annotation-driven/>
</beans>

第二步、建立實體類以及controller層控制類前端

package com.cc.entity;

public class Student {

    private String name;
    private int age;
    private String password;

    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;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", password='" + password + '\'' +
                '}';
    }
}
package com.cc.controller;
import com.cc.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
@RequestMapping("/user")
public class UserController {
    /**
     * 返回參數爲字符串類型
     * @param model使用Model向視圖層傳遞student對象
     * @return
     */
    @RequestMapping("/testString")
    public  String testString(Model model){
        System.out.println("testString.....");
        //模擬數據庫查詢功能
        Student student=new Student();
        student.setName("美美");
        student.setAge(20);
        student.setPassword("123456");
        //model對象
        model.addAttribute("student",student);
        return "success";
    }

}

第三步、建立response.jsp響應頁面,相應的執行頁面java

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
    <%--響應結果爲字符串--%>
</head>
<body>
</body>
</html>

2、返回值是void

controller層代碼添加以下代碼jquery

返回值是void類型,想跳轉相應的頁面,能夠使用HttpServletResponse api進行轉發或者是重定向,也能夠直接響應頁面在輸入http://localhost:8080/user/testVoid,會直接響應輸出 helloweb

/**
     * 返回結果爲void
     * 請求轉發是一次請求
     * @param
     */

    @RequestMapping("/testVoid")
    public  void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception{
        System.out.println("testVoid.....");
        //使用原生api,編寫請求轉發
        request.getRequestDispatcher("/pages/success.jsp").forward(request, response);
        //使用重定向
        //response.sendRedirect(request.getContextPath()+"/pages/success.jsp");
        //訪問servet會直接進行響應
        //response.getWriter().println("hello");
        return;
    }

response.jsp頁面添加以下代碼ajax

<%--響應結果爲void--%>
    <a href="user/testVoid">testVoid</a><br>

3、返回值是ModelAndView對象

controller層修改代碼以下:ModelAndView 做爲返回值,其實本質上是實現ModelMap接口spring

/**
     * 本質上和model是同樣的,model底層實現都是modelMap
     * @return
     */
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView() {
        System.out.println("testModelAndView.....");
        //建立ModelAndView對象
        ModelAndView mv=new ModelAndView();
        Student student=new Student();
        student.setName("美美");
        student.setAge(20);
        student.setPassword("123456");
        //把user對象存儲到對象中,也會把user對象存入request對象中
        mv.addObject("student",student);
        //跳轉到那個頁面
        mv.setViewName("success");
        return mv;
    }

response.jsp頁面修改代碼以下數據庫

<%--響應結果爲ModeladnView--%>
    <a href="user/testModelAndView">testModelAndView</a><br>

測試以下,攜帶參數進行請求跳轉

2、SpringMVC框架提供的轉發和重定向

直接修改controller層代碼,須要注意的地方,使用關鍵字實現重定向和轉發只有,視圖配置器這個時候就不起做用了

/**
     * 使用關鍵字 forward和redirect請求頁面
     * @return
     */
    @RequestMapping("/test")
    public String testForwardandRedirect() {
        System.out.println("testForwardandRedirect.....");
        //轉發請求頁面,使用了關鍵字後,就不能使用視圖解析器
        //return "forward://pages/success.jsp";
        //使用重定向請求頁面
        //return "redirect:/index.jsp";
        return "redirect:/pages/success.jsp";
    }

response.jsp頁面代碼修改以下

<%--使用forword和Redirect實現響應--%>
    <a href="user/test">test</a><br>

三. ResponseBody響應json數據

該註解用於將 Controller 的方法返回的對象,經過 HttpMessageConverter 接口轉換爲指定格式的數據如:json,xml 等,經過 Response 響應給客戶端,幫咱們解決了不少麻煩的事情

第一步、DispatcherServlet會攔截到全部的資源,致使一個問題就是靜態資源(img、css、js)也會被攔截到,從而不能被使用。解決問題就是須要配置靜態資源不進行攔截,在springmvc.xml配置文件添加以下配置

mvc:resources標籤配置不過濾
location元素表示webapp目錄下的包下的全部文件
mapping元素表示以/static開頭的全部請求路徑,如/static/a 或者/static/a/b

<!--告訴前端控制器,那些靜態資源不攔截-->
    <!--<mvc:resources location="/css/" mapping="/css/**"/> &lt;!&ndash; 樣式 &ndash;&gt;
    <mvc:resources location="/images/" mapping="/images/**"/> &lt;!&ndash; 圖片 &ndash;&gt;-->
    <mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->

第二步、 使用@RequestBody獲取請求體數據

<button id="btn">發送ajax的請求</button>
<script  type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script>
    <script>
        $(function(){
            $("#btn").click(function(){
                //使用ajax發送請求
                $.ajax({
                    type:"post",
                    url:"${pageContext.request.contextPath}/user/testAjax",
                    contentType:"application/json;charset=utf-8",
                    data:'{"name":"tom","age":24,"password":"123456"}',
                    dataType:"json",
                    success:function(data){
                        alert(data);
                    }
                });
            });
        })
    </script>

controller層代碼修改以下

/**
         * 測試響應 json 數據
         */
        @RequestMapping("/testAjax")
        public void  testAjax(@RequestBody String body) {
            System.out.println("testAjax is doing");
            System.out.println(body);
    }

後臺拿到前端發送過來的數據

第3、 使用@RequestBody註解把json的字符串轉換成JavaBean的對象

一、json字符串和JavaBean對象互相轉換的過程當中,須要使用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

二、controller層修改代碼以下

@RequestMapping("/testAjax")
    public @ResponseBody Student  testAjax(@RequestBody Student student) {
        //@ResponseBody設置返回封裝對象
        System.out.println("testAjax is doing");
        student.setName("tom");
        student.setPassword("123456");
        System.out.println(student);
        return student;
    }

3.response.jsp頁面代碼如上一步,點擊測試代碼,控制檯額和view層都接收到了數據

第4、表單提交中解決日期類型404的問題

緣由:spirngmvc在封裝表單對象的時候調用內置ConversionService來封裝對象,碰見日期類型,不知道如何去封裝,報404的錯誤,全部咱們能夠重寫ConversionService接口,來自定義封裝對象規則

解決的辦法在實體類的日期屬性上添加如下這個註解

@DateTimeFormat

@DateTimeFormat(pattern = "yyyy-MM-dd")
pivate Data brithday;

@JsonFormat

從數據庫獲取時間傳到前端進行展現的時候,咱們有時候可能沒法獲得一個滿意的時間格式的時間日期,在數據庫中顯示的是正確的時間格式,獲取出來卻變成了很醜的時間戳,@JsonFormat註解很好的解決了這個問題,咱們經過使用@JsonFormat能夠很好的解決:後臺到前臺時間格式保持一致的問題,其次,另外一個問題是,咱們在使用WEB服務的時,可能會須要用到,傳入時間給後臺,好比註冊新用戶須要填入出生日期等,這個時候前臺傳遞給後臺的時間格式一樣是不一致的,而咱們的與之對應的便有了另外一個註解,@DataTimeFormat便很好的解決了這個問題,接下來記錄一下具體的@JsonFormat與DateTimeFormat的使用過程。

導入依賴

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.8</version>
        </dependency>
  
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.8</version>
        </dependency>
  
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>

在你須要查詢出來的時間的數據庫字段對應的實體類的屬性上添加@JsonFormat

//設置時區爲上海時區,時間格式本身據需求定。
    @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
    private Date testTime;
  
     
    public Date gettestTime() {
        return testTime;
    }
  
    public void settestTime(Date testTimee) {
        this.testTime= testTime;
    }

pattern:是你須要轉換的時間日期的格式

timezone:是時間設置爲東八區,避免時間在轉換中有偏差

提示:@JsonFormat註解能夠在屬性的上方,一樣能夠在屬性對應的get方法上,兩種方式沒有區別

完成上面兩步以後,咱們用對應的實體類來接收數據庫查詢出來的結果時就完成了時間格式的轉換,再返回給前端時就是一個符合咱們設置的時間格式了

相關文章
相關標籤/搜索