Jeecms后台控制层如何传值到前台freemarker的???

最近在研究Jeecms6的时候,发现一个令人费解的问题??举个例子,

 
 
 

点击“内容“选项后,出现上图下面的内容,那么,lz就来分析这个过程的后台处理流程

为了突出问题所在,lz就略去了前面浏览器发送请求到控制层的过程,直接来看控制层。。。。

处理该部分业务逻辑的代买如下:

@RequiresPermissions("content:v_list")
@RequestMapping("/content/v_list.do")
public String list(String queryStatus, Integer queryTypeId,
Boolean queryTopLevel, Boolean queryRecommend,
Integer queryOrderBy, Integer cid, Integer pageNo,
HttpServletRequest request, ModelMap model) {
long time = System.currentTimeMillis();
String queryTitle = RequestUtils.getQueryParam(request, "queryTitle");
queryTitle = StringUtils.trim(queryTitle);
String queryInputUsername = RequestUtils.getQueryParam(request,
"queryInputUsername");
queryInputUsername = StringUtils.trim(queryInputUsername);
if (queryTopLevel == null) {
queryTopLevel = false;
}
if (queryRecommend == null) {
queryRecommend = false;
}
if (queryOrderBy == null) {
queryOrderBy = 4;
}
ContentStatus status;
if (!StringUtils.isBlank(queryStatus)) {
status = ContentStatus.valueOf(queryStatus);
} else {
status = ContentStatus.all;
}
Integer queryInputUserId = null;
if (!StringUtils.isBlank(queryInputUsername)) {
CmsUser u = cmsUserMng.findByUsername(queryInputUsername);
if (u != null) {
queryInputUserId = u.getId();
} else {
// 用户名不存在,清空。
queryInputUsername = null;
}
}
CmsSite site = CmsUtils.getSite(request);
Integer siteId = site.getId();
CmsUser user = CmsUtils.getUser(request);
Integer userId = user.getId();
byte currStep = user.getCheckStep(siteId);
Pagination p = manager.getPageByRight(queryTitle, queryTypeId,user.getId(),
queryInputUserId, queryTopLevel, queryRecommend, status, user
.getCheckStep(siteId), siteId, cid, userId,
queryOrderBy, cpn(pageNo), CookieUtils.getPageSize(request));
List<ContentType> typeList = contentTypeMng.getList(true);
List<CmsModel> models=cmsModelMng.getList(false, true);
if(cid!=null){
Channel c=channelMng.findById(cid);
models=c.getModels(models);
}
model.addAttribute("pagination", p);
model.addAttribute("cid", cid);
model.addAttribute("typeList", typeList);
model.addAttribute("currStep", currStep);
model.addAttribute("site", site);
model.addAttribute("models", models);
addAttibuteForQuery(model, queryTitle, queryInputUsername, queryStatus,
queryTypeId, queryTopLevel, queryRecommend, queryOrderBy,
pageNo);
time = System.currentTimeMillis() - time;
return "content/list";
}

该段代码最后返回是一个字符串,框架会根据配置文件内容转入content目录下list.html(lz不知道这里为什么要使用html而不是ftl),

前台页面上是如何显示的呢?传入部分代码:

......

<@p.table value=pagination;content,i,has_next><#rt/>
<@p.column title="<input type='checkbox' οnclick='Pn.checkbox(\"ids\",this.checked)'/>" width="25" align="center">
<input type='checkbox' name='ids' value='${content.id}' οnclick="Pn.selectCheckBox('${content.id}',this.checked)"/><#t/>
</@p.column><#t/>
<@p.column title="ID" align="center">${content.id}</@p.column><#t/>
<@p.column code="content.title">

......

可以看到这里是通过$(content.*)来取得要显示的值的,那么问题就来了

lz遍寻后台Action文件都找不到该content是在何处声明的,又是在何处赋予查询结果值?????

苦思不得琪姐。。。。。。。。

既然这个系统时能够正常使用的,也就是说,代码是肯定没有问题的,那么肯定就是没有找到content是如何实现的?

经过不懈的努力发现,在list.html中有这么一句话,如下图在326行

在这一行,使用jeecms开发人员定义的<@p.table>标签,那么它如何定义的呢?碾转反侧(查找标签ftl过程略),找到table.ftl标签文件,如下:

我们可以看到前面4行,后面不重要,不理解也没关系,第一个值value就指的是用于显示列表数据,

OK,哈哈哈,那么我们就可以理解

<@p.table value=pagination;content,i,has_next><#rt/>

这句话的意思

听我细细解释:首先后台pagination是后台Action定义,有疑问的同学可以去jeecms6后台代码查看,在这里将pagination赋值给table的value,table就是一个集合对象

需要在前台展示集合对象的数据,就使用循环来展示,这里在<@p.table>标签文件table.ftl中自定义了循环格式(有兴趣的同学可以去研究一下该标签文件),如果硬要把

分号后面的内容”content,i,has_next“的做个java翻译的话,我像应该是这样:

List list=pagination;

ListIterator iterator=list.listIterator();

while(iterator.hasnext()){

Content content=list.get(i);

i++;

iterator.next();

}

这样理解是不是就容易多了。。。。。。

那么i就是指的这个集合遍历的过程,从集合开始到最后,

content是集合每一轮遍历后得到的Content对象

has_next查看是否遍历都集合末尾

那么经过这样的遍历,前台模板文件中使用诸如content.*形式的值也不难理解了

本次通过这么一个小小例子来解读了Jeecms6后台向前台传值的过程,希望对有需要的同学帮助理解

Jeecms6中后台控制层Action如何将值传入前台视图层模板中的?的更多相关文章

  1. ASP.Net中后台控制页面提示信息的显示方式

    ASP.Net中后台控制页面提示信息的显示方式   用于删除或修改成功后的显示:(背景No空白) ScriptManager.RegisterStartupScript(this, typeof(Pa ...

  2. java web项目中后台控制层对参数进行自定义验证 类 Pattern

    Pattern pattern = Pattern.compile("/^([1-9]\d+元*|[0]{0,1})$/");//将给定的正则表达式编译到模式中 if(!" ...

  3. Django-1版本的路由层、Django的视图层和模板层

    一.Django-1版本的路由层(URLconf) URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:我们就是以这种方式告诉Dja ...

  4. Django系列(二):Django的路由层,视图层和模板层

    1.Django的路由层 URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:我们就是以这种方式告诉Django,对于客户端发来的某 ...

  5. 【Django】 视图层说明

    [Django视图层] 视图层的主要工作是衔接HTTP请求,Python程序和HTML模板,使他们能够有机互相合作从模型层lou到数据并且反馈.说到视图层的工作就有以下几个方面要说 ■ URL映射 对 ...

  6. 微信小程序开发教程(八)视图层——.wxml详解

    框架的视图层由WXMKL(WeiXin Markup language)与WXSS(WeiXin Style Sheet)编写,由组件进行展示. 对于微信小程序而言,视图层就是所有.wxml文件与.w ...

  7. 测试开发之Django——No6.Django模板中的标签语言

    模板中的标签语言 1.if/else {% if  %} 标签检查(evaluate)一个变量,如果这个变量为真(即:变量存在,非空,不是布尔值假),系统会显示在{% if  %} 和 {% endi ...

  8. 如何在smarty模板中执行php代码

    Smarty模板主要的目的是分离逻辑层和表现层,所以在模板中不应该包含逻辑部分,逻辑层也不应该含有HTML.要在模板中插入逻辑程序的这种做法"非常"不被推荐,在你的case中. 如 ...

  9. thinkPHP 模板中的语法知识 详细介绍(十二)

    原文:thinkPHP 模板中的语法知识 详细介绍(十二) 本章节:介绍模板中的语法,详细的语法介绍 一.导入CSS和JS文件    ==>记住常量的是大写 1.css link .js  sc ...

随机推荐

  1. LUOGU P4394 [BOI2008]Elect 选举 (背包)

    传送门 解题思路 一眼看上去就像个背包,然后就是\(0/1\)背包改一改,结果发现过不了样例.后来想了一下发现要按\(a\)从大到小排序,因为如果对于一个>=总和的一半但不满足的情况来说,把最小 ...

  2. 机器学习 101 Mahout 简介 建立一个推荐引擎 使用 Mahout 实现集群 使用 Mahout 实现内容分类 结束语 下载资源

      机器学习 101 Mahout 简介 建立一个推荐引擎 使用 Mahout 实现集群 使用 Mahout 实现内容分类 结束语 下载资源 相关主题   在信息时代,公司和个人的成功越来越依赖于迅速 ...

  3. axios HTTP 400后,error没有详细信息

    参考网址:axios怎么获取到error中的状态值,具体信息 error.response

  4. 03_springboot2.x日志处理

    1.日志框架 ​ 市场上存在非常多的日志框架.JUL(java.util.logging),JCL(Apache Commons Logging),Log4j,Log4j2,Logback.SLF4j ...

  5. 1.1python基础_基础

    1_编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 当然你也可以为源码文件指定不同的编码: # -*- coding: UTF-8 -*- ...

  6. 初识OpenCV-Python - 005: 识别视频中的蓝色

    此次主要学习了如何将BGR转成HSV,主要用到cv2.cvtColor()和cv2.inRange()函数来识别视频中的蓝色物体. code: import cv2import numpy as np ...

  7. POJ - 2406 ~SPOJ - REPEATS~POJ - 3693 后缀数组求解重复字串问题

    POJ - 2406 题意: 给出一个字符串,要把它写成(x)n的形式,问n的最大值. 这题是求整个串的重复次数,不是重复最多次数的字串 这题很容易想到用KMP求最小循环节就没了,但是后缀数组也能写 ...

  8. wdatapicker 时间选择器——例

    效果: html: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  9. java_IO流(输入流)

    * 字节输入流(InputStream):所有字节输入流的父类 * 所有子类共性方法: * int read():从输入流中读取数据的下一个字节 * int read(byte[] b):从输入流中拂 ...

  10. 数据结构_冒泡排序(python)

    1.核心思想:比较两个元素,如果前一个比后一个大则进行交换,经过对每个元素的比较,最后最大的元素被放在在最后位置 操作方法: 外层正常for循环遍历,到n-1位,内层for循环相邻两个数比较大小,小数 ...