Spring MVC之中前端向后端傳數據


Spring MVC之中前端向后端傳數據和后端向前端傳數據是數據流動的兩個方向, 在此先介紹前端向后端傳數據的情況.

一般而言, 前端向后端傳數據的場景, 大多是出現了表單的提交,form表單的內容在后端學習的md文檔之中有所介紹,form標簽的語法格式如下

<FORM NAME="FORM1" ACTION="URL" METHOD="GET|POST" ENCTYPE="MIME" TARGET="...">
... ... 
</FORM> 

主要是三個參數的介紹,也就是name, methodaction, 其中name可以省略, 只是一個標記符號, 用處不太大, 而action表示處理這個表單的方法, method表示將數據傳輸給后端的方式, 默認是get方式,這是基本的一些介紹.

前端頁面

數據是從前端的提交表單之中獲取的, 所以首先必須得有一個表單, 此處使用了freemarker視圖的頁面, 命名為login.ftl, form的名字為"login", 其中在form之中的action表示的是要處理這"login"表單的后台url(方法), 也就是對應的controller之中的url(方法), 正好在LoginController.java之中,其中login.ftl如下:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>第一個freemarker模板</title>
    <!-- 新 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
    <!-- jQuery文件。務必在bootstrap.min.js 之前引入 -->
    <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
    <!-- CSS樣式 -->
</head>
<body>
<h4 class="text-primary">登錄頁面</h4>
<!-- 這些基本的東西貌似沒有變,使用方法和在jsp之中一致,有變化的在於數據的獲取-->
<form name="login" action="/freemarker/login" class="text-info">
    姓名:<input type="text" name="name"><br/>
    性別:<input type="text" name="gender"><br/>
    年齡:<input type="text" name="age"><br/>
    密碼:<input type="password" name="password"><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>
后台方法

如下是處理前端頁面提交內容的方法login, 但是在下面有兩個方法, 其中此處用到的方法是login, 在這個Controller之中, 我們把從前台提交的數據處理, 需要注意的是, 我們在form之中定義的參數的名字, 也就是以上每個input的name屬性, 和在LoginController之中login方法的參數的名稱是一樣的, 這樣就可以保證數據的對應, 但是這樣也使得前端和后端耦合, 是現在不太推薦的.

@Controller
@RequestMapping("/freemarker")
public class LoginController {
    private Logger logger = LoggerFactory.getLogger(LoginController.class);

    @RequestMapping(value = "/gotologin", method = RequestMethod.GET)
    public String gotoLogin() {
        //跳轉到登錄的login頁面
        logger.debug("正在跳轉到login頁面!");
        return "login";
    }

    @RequestMapping(value = "/login", method = {RequestMethod.GET, RequestMethod.POST})
    public String login(String name, String gender, int age, String password, Model model) {
        //從頁面之中提取輸入的信息,並且封裝好
        model.addAttribute("name", name);
        model.addAttribute("gender", gender);
        model.addAttribute("age", age);
        model.addAttribute("password", password);
        //獲取了頁面的信息之后,就將信息發送到想要展示的頁面
        logger.debug("name: " + name + ", gender: " + gender + ", age: " + age + ", password: " + password);
        return "showinfo";
    }
}
前台展示

其實完成以上兩個步驟, 我們已經把從前台傳輸過來的數據,完成了后台的處理,並且把數據存儲在了model之中,但是這樣的情況下, 數據沒有展示出來,其結果不直觀, 那么,此時就需要將后端處理好的數據, 展示在前端頁面, 為此我們創建一個頁面, 將登陸后的信息展示出來,命名為showinfo.ftl

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>第一個freemarker模板</title>
    <!-- 新 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
    <!-- jQuery文件。務必在bootstrap.min.js 之前引入 -->
    <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
    <!-- CSS樣式 -->
</head>
<body>
<!-- freemarker獲取信息 -->
<h3 class="text-justify"> 登錄信息如下:</h3>
<h4 class="text-info"> 姓名:${name}</h4>
<h4 class="text-dark"> 性別:${gender}</h4>
<h4 class="text-primary"> 年齡:${age}</h4>
<h4 class="text-danger"> 密碼:${password}</h4>
</body>
</html>

完成以上三個步驟,就完成了從前台輸入,到后台處理, 再到前端展示的過程,示意圖如下:

st=>start: 開始
e=>end: 結束
op1=>operation: 前台輸入
op2=>operation: 后台處理
op3=>operation: 前台展示
st(right)->op1(right)->op2(right)->op3(right)->e
后台直接傳數據給前端

實際上, 如果沒有前台輸入, 后台自己造數據, 也是可以直接給前台展示的, 示意圖如下:

st=>start: 開始
e=>end: 結束
op2=>operation: 后台處理
op3=>operation: 前台展示
st(right)->op2(right)->op3(right)->e

代碼操作如下:

@Controller
public class ToFrontController {
    private static Logger logger = LoggerFactory.getLogger(ToFrontController.class);

    //在把值傳給前端頁面的時候,一般是需要通過Model協助的,沒有不需要Model或者接近的輔助處理方式的方法
    //此處其實不需要傳值,因為不接收前端傳來的值,只需要在里面自己設置即可
    @RequestMapping(value = "/toFrontTest")
    public String toFront(Model model) {
        logger.info("toFront方法被調用,應該返回toFrontInfo的視圖!");
        User user1 = new User();
        user1.setAge(24);
        user1.setName("Wangsan Lee");
        user1.setPassword("dfasfagasdfsdafgyrt75");
        System.out.println(user1.getName() + "," + user1.getAge() + "," + user1.getPassword());
        model.addAttribute("user1", user1);
        return "tryandlearn/toFrontInfo";
    }
} 
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="sf1" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="from" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
    <title>toFrontInfo</title>
    <!-- 新 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
    <!-- jQuery文件。務必在bootstrap.min.js 之前引入 -->
    <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
    <!-- CSS樣式 -->
</head>
<body>
<h4 class="text-info">toFrontInfo,此處是后端傳給前端理后的信息,顯示在此處</h4>
<p class="text-md-center text-area text-warning">后端傳值給前端,涉及到的部分包括,ToFrontController之中的toFront方法處理,
    然后處理完成后,跳轉到tryandlearn/toFrontInfo.jsp頁面,ToFrontController之中的toFront方法里面的參數,都是寫死了的,
    可以認為是已經從前端來,然后經過后端處理好了,需要傳給前端的值</p>
<p class="text-info">ToFrontController.toFront(name,age,password,model)--->tryandlearn/toFrontInfo.jsp</p>

<h4 class="text-info">使用\<\form:form\>標簽包起來的方式!</h4>
<form:form method="get" action="toFrontTest" modelAttribute="user1">
    name:${user1.name} </br>
    age:${user1.age} </br>
    password:${user1.password}</br>
</form:form>
<!-- form標簽,jstl標簽,sf標簽,el表達式,各自使用在什么地方並且有什么區別?-->

<h4 class="text-info">使用\<\form:form\>標簽包起來的方式!命名了不同的標簽名字!</h4>
<sf1:form method="get" action="toFrontTest" modelAttribute="user1">
    name:${user1.name} </br>
    age:${user1.age} </br>
    password:${user1.password}</br>
</sf1:form>
<!-- form標簽,jstl標簽,sf標簽,el表達式,各自使用在什么地方並且有什么區別?-->

<h4 class="text-warning">不使用\<\form:form\>標簽包起來的方式!</h4>
name:${user1.name} </br>
age:${user1.age} </br>
password:${user1.password}</br>

</body>
</html>
操作之中的錯位感
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags" %>
<html>

<head>
    <title>一個有內涵的Index頁面!</title>
    <!-- 新 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
    <!-- jQuery文件。務必在bootstrap.min.js 之前引入 -->
    <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
    <!-- CSS樣式 -->
</head>
<body>
<!-- Spring MVC貌似不支持從一個jsp頁面通過<a href="sss.jsp">的方式跳轉,都要通過controller的方式訪問頁面-->
<h3 class="text-info">我是XML方式配置的Spring MVC工程首頁!</h3>
<a href="/freemarker/hello">freemarker的hello首頁!(通過controller的方式訪問頁面)</a></br>
<a href="/freemarker/gotologin">跳轉到登錄首頁</a></br>
</body>
</html>

我們知道,前端是一個展示的頁面, 主要展示出來數據和頁面, 當然也要收集數據, 但是總的一切都是為了收集數據,比如,我們要登錄, 登錄的頁面是login.html, 但是如果想到達這個頁面, 我們需要一個鏈接讓其跳轉到這個頁面, 在<a href="/freemarker/gotologin">跳轉到登錄首頁</a></br>之中說明處理這個跳轉的url, 是的,我們跳轉到了http://localhost:8080/freemarker/gotologin,但是這是在后台的Controller之中決定的, 是在第一段LoginController之中的gotologin方法之中,才決定跳轉到login頁面,所以其實有一個延遲性, 我們想達成的, 都要做作為我們當前動作的結果出現, 也就是說,比如我們想要到達登錄頁面, 那么這個結果必將是我們當前動作的結果, 而什么是當前的動作呢? 那就是要跳轉到登錄頁面, 如果我們登錄之后, 想要展示登陸的信息, 這兩個操作是連貫的, 登錄, 然后展示, 也就是說, login-->show, 意味着show是登錄的結果, 那么show就要作為結果出現,在第一段代碼的login方法中體現了出來, 也就是login方法返回的是showinfo, 而showinfo之中需要的信息, 就需要在后端返回的信息之中獲取.

<!-- freemarker獲取信息 -->
<h3 class="text-justify"> 登錄信息如下:</h3>
<h4 class="text-info"> 姓名:${name}</h4>
<h4 class="text-dark"> 性別:${gender}</h4>
<h4 class="text-primary"> 年齡:${age}</h4>
<h4 class="text-danger"> 密碼:${password}</h4>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM