Java中上下文 Context的了解
前言
通過servlet綁定資料使用
一、簡易化了解
上下文其實是一個抽象的概念。我們常見的上下文有Servlet中的pageContext,通路JNDI時候用的Context。其實他們真正的作用就是承上啟下。比如說pageContext他的上層是WEB容器,下層是你寫的那個Servlet類,pageContext作為中間的通道讓Servlet 和Web容器進行互動。再比如通路JNDI的Context,他的上層是JNDI伺服器(可能是遠端的),下層是你的應用程式,他的作用也是建立一個通道讓你能通路JNDI伺服器,同時也讓JNDI伺服器接受你的請求,同樣起到互動作用。
二、使用步驟
1.設定(響應資料)模闆
代碼如下(示例):
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ThUtils {
private static TemplateEngine te;
static {
te = new TemplateEngine();
//建立解析器 使用這個解析器會自動查找resources目錄下的html檔案
ClassLoaderTemplateResolver r = new ClassLoaderTemplateResolver();
//設定字元集
r.setCharacterEncoding("UTF-8");
//将解析器和模闆引擎對象關聯
te.setTemplateResolver(r);
}
public static void print(String fileName, Context context,
HttpServletResponse response) throws IOException {
//讓html模闆頁面和Context裡面的資料整合到一起得到一個新的html
String html = te.process(fileName,context);
//把得到的html傳回給用戶端浏覽器
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();//異常抛出
pw.print(html);
pw.close();
}
}
2.建立上下文對象,綁定資料
代碼如下(示例):
import cn.tedu.dao.MessageDao;
import cn.tedu.entity.Message;
import cn.tedu.entity.User;
import cn.tedu.utils.ThUtils;
import com.sun.xml.internal.ws.resources.HttpserverMessages;
import org.thymeleaf.context.Context;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
@WebServlet(name = "HomeServlet",urlPatterns = "/home")
public class HomeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//取出Session中儲存的目前登入的使用者對象
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if(user==null){//如果沒有使用者對象說明用戶端還沒登入
//重定向到登入頁面
response.sendRedirect("/login.html");
return;
}
//顯示出home.html頁面
Context context = new Context();
//得到登入成功的使用者資訊 将使用者資訊顯示到首頁中
context.setVariable("user",user);
//建立MessageDao 并調用findAll方法
MessageDao dao = new MessageDao();
List<Message> list = dao.findAll();
context.setVariable("list",list);
ThUtils.print("home.html",context,response);
}
}
web層擷取資料
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>朋友圈</title>
</head>
<body>
<h1 align="center">朋友圈</h1>
<hr>
<img th:src="${user.imgPath}" src="b.jpg" width="50">
<p>歡迎<span th:text="${user.username}"></span>回來!
<a href="logout">退出</a></p>
<h3><a href="send.html">發朋友圈</a></h3>
<hr>
<div th:each="m:${list}">
<p>
<img th:src="${m.user.imgPath}" width="30">
<span th:text="${m.user.username}"></span>
在<span th:text="${m.createdstr}"></span>說:
</p>
<p th:text="${m.content}"></p>
<hr>
</div>
</body>
</html>