Spring MVC之中前端向后端傳數據和后端向前端傳數據是數據流動的兩個方向, 在此先介紹前端向后端傳數據的情況.
一般而言, 前端向后端傳數據的場景, 大多是出現了表單的提交,form表單的內容在后端學習的md文檔之中有所介紹,form標簽的語法格式如下
<FORM NAME="FORM1" ACTION="URL" METHOD="GET|POST" ENCTYPE="MIME" TARGET="...">
... ...
</FORM>
主要是三個參數的介紹,也就是name, method和action, 其中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>