如果在前台, 我需要獲取session中的信息, 或者需要獲取url中的參數信息, 是不是需要在后台手動處理好, 然后放到Model中去, 在前台通過${}來取呢?
當然, 這種方式, 是可以的, 但是比較麻煩, 而且, 別人已經考慮到這個了, 我們直接用就可以了.
一. 基本對象
#ctx | 上下文對象 |
#vars | 上下文對象(和#ctx相同, 但是一般用#ctx) |
#locale | 上下文區域設置 |
#request | (僅在Web Contexts中) HttpServletRequest對象 |
#response | (僅在Web Contexts中) HttpServletResponse對象 |
#session | (僅在Web Contexts中) HttpSession對象 |
#servletContext | (僅在Web Contexts中) ServletContext對象 |
1. 數據准備
package org.elvin.learn.springboot.controller;
import org.elvin.learn.springboot.pojo.Book;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.util.MapUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.*;
@Controller
@RequestMapping("thy")
public class ThyController {
@Autowired
private HttpServletResponse response;
@Autowired
private HttpServletRequest request;
@GetMapping("index")
public String index(Model model) {
Book book = new Book("springmvc", new DateTime().toString("yyyy-MM-dd"), 10000L);
model.addAttribute("book", book);
HttpSession session = request.getSession();
session.setAttribute("session1", "lalala");
return "thy/index";
}
}
2. request / param
<div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">reqeust</h3> </div> <div class="panel-body"> <p th:text="${#request.getContextPath()}"></p> <div th:each="item : ${#request.getParameterNames()}"> <p th:text="|name : ${item}, value : ${#request.getParameter(item)}|"></p> </div> <hr /> <p th:text="|size : ${param.size()}, lang: ${param.lang}, arr: ${param.arr}, arr-first: ${param.arr[1]}|"></p> </div> </div>
#request -> HttpServletRequest 對象.
param : 用來獲取請求參數的.
param可以通過直接點的方式, 來訪問參數. 是非常方便的
除了size()方法, 還有 isEmpty() , containsKey('...')兩個常用方法
2. session
html:
<div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">session</h3> </div> <div class="panel-body"> <p th:text="${#session.getAttribute('session1')}"></p> <p th:text="|size : ${session.size()} , value : ${session.session1} |"></p> <div th:each="item : ${#session.getAttributeNames()}"> <p th:text="|name : ${item}, value : ${#session.getAttribute(item)}|"></p> </div> </div> </div>
結果:
#session -> HttpSession對象
session和param一樣, 都可以通過點的方式來獲取session, 除了size()方法, 還有 isEmpty() , containsKey('...')兩個常用方法
3. 上下文對象 #ctx
ctx主要看 IContext 接口.
package org.thymeleaf.context; import java.util.Locale; import java.util.Set; public interface IContext { Locale getLocale(); boolean containsVariable(String var1); Set<String> getVariableNames(); Object getVariable(String var1); }
在后台寫入Model的內容, 在前台都可以通過#ctx來獲取
<div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">上下文對象</h3> </div> <div class="panel-body"> <p th:text="${#ctx.getVariable('book').name}"></p> </div> </div>
在后台傳入一個集合或者一個字符串, 在前台使用時, 如果不知道集合,字符串是否為空, 是不是會導致一些問題呢?
那如果會導致問題, 那么在前台是否有方法來解決這些問題呢?
這里需要借助一些工具類, 來輔助判斷.
二. 工具類對象
#execInfo | 有關正在處理的模板的信息 |
#messages | 用於在變量表達式中獲取外部化消息的方法, 與使用#{...}語法獲得的方式相同 |
#uris | 轉義 URL / URI 部分的方法 |
#conversions | 執行配置的轉換服務(如果有的話)的方法 |
#dates | java.util.Date對象的方法: 格式化, 組件提取等 |
#calendars | java.util.Calendar對象, 類似於#dates |
#numbers | 用於格式化數字對象的方法 |
#strings | String對象的方法: contains, startsWith, prepending, appending等 |
#objects | 一般對象的方法 |
#bools | 布爾評估的方法 |
#arrays | 數組的方法 |
#lists | 列表的方法 |
#sets | 集合的方法 |
#maps | map方法 |
#aggregates | 在數組或集合上創建聚合的方法 |
#ids | 處理可能重復的id屬性的方法 |
具體的使用方法, 可以通過 ctrl + 鼠標左鍵點擊 的方式, 進類里面查看.