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. 基于Maven的ssm(spring+springMvc+Mybatis)框架搭建

    前言 本demo是在idea下搭建的maven项目,数据库使用Mysql,jdk版本是1.8.0_171,ideal:2017.3.5 一.新建项目 1.file->new->porjec ...

  2. 巧用android:divider属性设置LinearLayout中元素之间的间隔

    如上图,要想实现3个button线性排列并且使它们的大小相同.间隔相等.而且整体填充满整个linearlayout,我们一般的做法是在每两个button之间放一个固定宽度的view,然后设置butto ...

  3. SpringBoot--Thymeleaf入门使用

    一.概述 今天学习到了SpringBoot中的WEB开发,SpringBoot提供了spring-boot-stater-web为web开发给予支持,它里面内嵌了以下依赖: <dependenc ...

  4. 猥琐发育,3月份Java干货已到达战场!

    时间真的过得很快,又是月底了,又到了我们总结这个月干货的时候了.3月份这个月我们都带来了哪些干货呢?我们一起回顾一下. 坑爹,手机端链接点不开,请切换到电脑端或者关注我们的微信公众号进行阅读. 扫描关 ...

  5. Python - Virtualenv 创建虚拟环境

    Virtualenv 回到顶部 为了解决各个项目的共同依赖同一个环境,造成版本冲突等,virtualenv创建一个干净的环境,在这个环境下,进行Python项目的开发等,就成为一个个独立的项目,从而避 ...

  6. 嘴巴题9 Codeforces 453A. Little Pony and Expected Maximum

    A. Little Pony and Expected Maximum time limit per test 1 second memory limit per test 256 megabytes ...

  7. Android开发 输入法调用学习

    方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Context. ...

  8. html---三列布局

    三列布局 1一 1.两边固定 当中自适应 2.当中列要完整显示 3.当中列要优先加载 <!DOCTYPE html> <html> <head> <meta ...

  9. django-rest-framework-jwt的使用

    一简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.该信息可以被验证和信任,因为它是数字签名的.JWTS可以使 ...

  10. VC操作Excel之基本操作(颜色等)【转载】

    文章出处https://blog.csdn.net/form88/article/details/78566390 EXCEL里如何知道某种颜色的ColorIndex的值 ===fag::====== ...