Spring MVC先後端數據交互總結

  • 控制器

    做爲控制器,大致的做用是做爲V端的數據接收而且交給M層去處理,而後負責管理V的跳轉。SpringMVC的做用不外乎就是如此,主要分爲:接收表單或者請求的值,定義過濾器,跳轉頁面;其實就是servlet的替代品。javascript

    - appendhtml

    Spring MVC在Web應用中扮演V的角色,負責處理HTTP請求並返回相應的資源,它在用的時候要配置一個核心的Dispatcher負責檢查資源,請求過來的時候會查找是否有相應的Handler,有就會把請求交給Controller,通常使用註解來配置暴露給用戶端進行調用。前端

@RequestMapping(value="/JSON",produces="text/html;charset=UTF-8")

    value就是對外暴露的接口地址。java

    說到控制器,咱們會想到熟悉的Struts2,它能夠輕鬆的調用Request和Response來操做請求響應,若是要在Spring MVC裏調用請求響應的話,則須要附帶在方法參數上。jquery

//Request Response
    @RequestMapping(value="/ReqAndRep",produces="text/html;charset=UTF-8")
    public void reqAndrep(HttpServletRequest request,HttpServletResponse response){
        
    }

    這樣就能夠控制這個Http請求而且往響應體裏寫東西了。web

  • 傳值方式

    - appendajax

    管中窺豹,只見一斑;一葉障目,不見泰山。在先後端交互的過程當中,首先要知道都是什麼數據類型而且對不一樣的類型看看Spring MVC會提供怎樣的編程方式。spring

    先後端的數據無非是:變量,對象,數組,JSON;他們有可能會有迭代的行爲,把基本的搞懂就不怕他們的二次型了。編程

    springmvc最方便的一點就是能夠經過註釋方式來定義它的url。json

複製代碼

@Controller
public class formMVC {
    @RequestMapping("/hello")
    public void login(){
        
    }

複製代碼

    如上面這種方式,在項目名下跟着hello就能訪問這個方法了,相較struts2的xml配置加大了開發效率,而且是以方法爲級別的開發。

    接收表單數據只須要在方法的參數加入響應的字段,對應表單input的name屬性,由於是經過反射技術實現的因此字段要徹底相同

。  

    變量

@RequestMapping("/login")
    public String login(String username,String password){
        System.out.println(username+" "+password);
        return "form.jsp";
    }

    - append

    變量通常是在表單中指定的name對應的形參,也能夠在形參中使用別名。

複製代碼

//傳入通常參數
    @RequestMapping(value="/Normal",produces="text/html;charset=UTF-8")
    public String normal(HttpServletRequest request,@RequestParam("username") String username,@RequestParam("password") String password){
        System.out.println("username:"+username+" password:"+password);
        request.setAttribute("info", "Normal server recv:"+username+" "+password);
        return "testPage.jsp";
    }

複製代碼

    前端數據頁面,寫一個Form,input對應別名就好。

複製代碼

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>測試數據交互</title>
</head>
<body>
    <form action="/Shop/Array" method="post">
        <table>
            <tr>
                <td>用戶名:</td>
                <td><input name="username" size="15"></td>
            </tr>
            <tr>
                <td>密碼:</td>
                <td><input name="password" size="15"></td>
            </tr>
            <tr>
                <td><button type="submit">提交</button></td>
                <td><button type="reset">重置</button></td>
            </tr>
        </table>
    </form>
    <span>服務器信息:${info}</span>
</body>
</html>

複製代碼

 

    如上面這種方式,表單提交以後就會得到值。跳轉方式就是使用返回的字符串,springmvc的DispatcherServlet會跳轉到字符串的頁面。你也能夠配置它的前綴後綴。在它的配置文件中配置下面屬性,就是在這個return的字符串的前面和後面加入你配置的前綴後綴。好比你return一個index.jsp,配置了前綴就多是demo/index.jsp這樣的demo包裏面的index頁面。

複製代碼

<!-- configure the InternalResourceViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
            id="internalResourceViewResolver">
        <!-- 前綴 -->
        <property name="prefix" value="" />
        <!-- 後綴 -->
        <property name="suffix" value="" />
    </bean>

複製代碼

    對象

    - append

    傳遞對象這回事,說實在的和Struts2沒什麼區別,Struts2使用ModelDriven或者直接在控制器裏新建一個對象,提交Http請求的時候name須要寫成:對象名.字段名,這樣的形式。可是Spring MVC只要你和字段名(類屬性名)相同就好了。

複製代碼

//傳入對象
    @RequestMapping(value="/Object",produces="text/html;charset=UTF-8")
    public String objTransaction(HttpServletRequest request,@ModelAttribute Demo d){
        System.out.println("username:"+d.getUsername()+" password:"+d.getPassword());
        request.setAttribute("info", "objTransaction server recv:"+d.getUsername()+" "+d.getPassword());
        return "testPage.jsp";
    }

複製代碼

    前臺仍然是上個頁面,改一些Action就行。

 

    另外,Spring MVC可使用bean來接收參數,由於是反射技術,因此屬性字段依然要保持徹底同樣。

複製代碼

public class user {
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
}

複製代碼

@RequestMapping(value="/Model",method=RequestMethod.POST)
    public String loginModel(user u){
        System.out.println(u.getUsername()+" "+u.getPassword());
        return "form.jsp";
    }  

    - append

    數組

    表單提交確定會有批量提交的需求,批量提交雖然不必定常常能見到,可是學習必定要學全。批量提交就是name共用一個name,通常都是框架給你處理好拿到手上的,因此Spring MVC在方法形參中寫List就能夠接收批量提交同個變量了。

複製代碼

//傳入數組
    @RequestMapping(value="/Array",produces="text/html;charset=UTF-8")
    public String arrayTransaction(HttpServletRequest request,@RequestParam("username") String[] usernames){
        if(usernames != null)
        {
            for(int i=0;i<usernames.length;i++)
                System.out.println("username:"+usernames[i]);
        }
        request.setAttribute("info", "arrayTransaction server recv");
        return "testPage.jsp";
    }

複製代碼

 

複製代碼

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>測試數據交互</title>
</head>
<body>
    <form action="/Shop/Array" method="post">
        <table>
            <tr>
                <td>用戶名:</td>
                <td><input name="username" size="15"></td>
            </tr>
            <tr>
                <td>用戶名:</td>
                <td><input name="username" size="15"></td>
            </tr>
            <tr>
                <td><button type="submit">提交</button></td>
                <td><button type="reset">重置</button></td>
            </tr>
        </table>
    </form>
    <span>服務器信息:${info}</span>
</body>
</html>

複製代碼

    JSON

    - append

    Spring MVC提供了自動序列化JSON數據的註解,在前端提供JSON數據的時候,能夠十分方便的轉換。JSON爲什麼如此重要,由於在Restful風格的架構中,傳遞數據使用JSON差很少能夠算是一種標準了,即便是微服務架構,每一個服務之間也廣泛見到設計成Restful風格的接口,設計Restful風格Spring MVC有着自然的支持,只須要使用它的註解就行了,而返回的字符串能夠本身構造。

 

複製代碼

package Common.Controller;
import org.springframework.stereotype.Controller;

import net.sf.json.JSONObject;
/**
 * 接口輸出JSON形式
 * restful
 * {"status":"0|1|2","info":message,"result":result}
 * status:0.失敗;1.成功;2.(未定);
 * info:返回服務器信息
 * result:返回查詢結果
 * @author ctk
 *
 */
@Controller
public class OutputStringController {
    //返回成功信息
    public String success(String info){
        JSONObject result = new JSONObject();
        result.put("status", 1);
        if(info == null)
            result.put("info", "");
        else
            result.put("info", info);
        result.put("result", "");
        return result.toString();
    }
    //返回失敗信息
    public String failure(String info){
        JSONObject result = new JSONObject();
        result.put("status",0);
        if(info == null)
            result.put("info", "");
        else
            result.put("info", info);
        result.put("result", "");
        return result.toString();
    }
    //返回供前端使用的result-成功
    public String resultSuccess(String info,String resultStr){
        JSONObject result = new JSONObject();
        result.put("status",1);
        if(info == null)
            result.put("info", "");
        else
            result.put("info", info);
        if(resultStr == null)
            result.put("result", "");
        else
            result.put("result", resultStr);
        return result.toString();
    }
    //返回供前端使用的result-失敗
    public String resultFailure(String info,String resultStr){
        JSONObject result = new JSONObject();
        result.put("status",0);
        if(info == null)
            result.put("info", "");
        else
            result.put("info", info);
        if(resultStr == null)
            result.put("result", "");
        else
            result.put("result", resultStr);
        return result.toString();
    }
}

複製代碼

 

    定義了頂層類以後,編寫接口就繼承。接口風格以下。    

複製代碼

//restful接口
    @RequestMapping(value = "/start/{name}", produces = "text/html;charset=UTF-8")
    @ResponseBody 
    public String start2(@PathVariable("name") String name1) {
        System.out.println(name1);
        return "start";
    }

複製代碼

    

    迴歸正題,要傳遞JSON,它的過程是前臺等待用戶輸入,用戶輸入完畢以後把數據構形成JSON Data,而後訪問接口。前臺的代碼我是這樣寫。

複製代碼

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 <script src="../js/jquery/jquery.min.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSON數據提交</title>
</head>
<body>
<table>
    <tr>
        <td>用戶名:</td>
        <td><input id="username"></td>
    </tr>
        <tr>
        <td>密碼:</td>
        <td><input id="password"></td>
    </tr>
        <tr>
        <td>姓名:</td>
        <td><input id="name"></td>
    </tr>
        <tr>
        <td>郵箱:</td>
        <td><input id="email"></td>
    </tr>
</table>
<button id="submitForm">提交</button>

<script type="text/javascript">
    $(document).ready(function(){
        $('#submitForm').click(function(){
            var formData = new Object;
            formData.username = $('#username').val();
            formData.password = $('#password').val();
            formData.name = $('#name').val();
            formData.email = $('#email').val();
            var JsonData = JSON.stringify(formData); 
            console.log(JsonData);
            $.ajax({
                type : "POST",
                url : "/Shop/JSON",
                dataType : 'text',  
                contentType: "application/json",
                data : JsonData,
                success : function(data) {
                   alert(data);
                }
            });
        });        
    });
</script>
</body>
</html>

複製代碼

    注意dataType若是使用json那服務器返回什麼都會往error走,我初步理解它爲返回數據類型。

    Spring MVC解包須要jackson這個東西,筆者踩過了坑,沒加jar包一直訪問返回415,不支持此類媒介。筆者使用的是2.5版本的,Spring是4.0的。

    將其導入到工程中,而後配置applicationContext.xml,就是Spring的配置文件。

複製代碼

<!--json轉換器-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list >
                <ref bean="mappingJacksonHttpMessageConverter" />
            </list>
        </property>
    </bean>
    <bean id="mappingJacksonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>

複製代碼

    而後後臺接口以下。

複製代碼

//傳入JSON
    @RequestMapping(value="/JSON",produces="text/html;charset=UTF-8")
    @ResponseBody 
    public String jsonTransaction(HttpServletRequest request,@RequestBody Demo ds){
        System.out.println("username:"+ds.getUsername()+" password:"+ds.getPassword()+" name:"+ds.getName()+" email:"+ds.getEmail());
        request.setAttribute("info", "JSON server recv");
        return "success";
    }

複製代碼

    @ResponseBody是返回值寫到響應體中,@RequestBody是把請求主體信息中的內容轉換成Demo類。

    

 

    最後,前端發過來的數據是通過json包裝的,依然能夠在後端使用bean來接收。

複製代碼

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="jquery.min.js"></script>  
<title>登陸表單</title>
</head>
<script type="text/javascript">  
    $(document).ready(function(){  
        $("#button_submit").click(function(){  
            //序列化表單元素,返回json數據  
            var params = $("#userForm").serializeArray();  
            console.log(params);
            //也能夠把表單以外的元素按照name value的格式存進來  
            //params.push({name:"hello",value:"man"});  
            $.ajax({
                type:"post",
                url:"Model",
                data:params
            });
        });  
    });  
</script>  
<body>
    <form id="userForm">
        <input name="username" type="text"/>
        <br/>
        <input name="password" type="password"/>
        <br/>
    </form>
        <button id="button_submit">提交</button>
        <button type="reset" >重置</button>
</body>
</html>

複製代碼

    最後還有一個未解之謎,對象數組提交該怎麼去作,資料還未查到,先不幹這個了。 

相關文章
相關標籤/搜索