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>

总结:2020/11/3 记录美好!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐