先说说本人的技术背景,以免说错了被砖砸!在确定用roller做二次开发之前,本人没有用struts2、velocity、openjpa,只是匆匆看了一本《深入浅出struts2》电子书,然后是一边读roller源代码一边摸索这些技术是怎么实现相关功能的。到今天已经半个月有余,写博当备忘。
在今天的这篇文章中我打算谈谈roller是如何展现一个博客页面的,我们知道一个页面最终在用户的浏览器被展现是一些html代码。生成html代码有很多种方式和技术,roller使用的是velocity模板技术。个人觉得roller使用velocity可能有以下原因:
1、roller要考虑博客页面展现的多样性
2、博客页面主题的可自定义
velocity的模板技术无疑很好的符合这两点要求。
在roller中,是怎样用velocity来展现页面的呢?先来说说roller中主题、样式、模板的关系,如果没有好好使用一下roller的自定义主题的功能而是仅仅看源代码,还真有点难于搞清楚roller是如何展现页面的。
在roller中,一个主题对应一个样式,一个主题可以包含多个模板,模板是页面上的一些部件,比如菜单栏可以用一个模板;日历也可以用一个模板等等。当用户选择不同的主题时,由于主题包含的模板不同则展现的内容也不同。样式就是我们一般指的css代码。
下面我们按照程序的执行顺序来说说roller页面的生成过程。在前面的文章《说说ROLLER的PageServlet类》中我们已经谈了一些相关的内容,比如用户想直接进入某个博客abc,当缓存中没有时就要生成页面。我们今天就接着这里开始讲。
roller是一个多用户博客系统,每个博客要展现的内容都不一样。当用户要进入abc时,roller用一个Weblog类的对象来代表abc,通过这个对象就可以获取到这个博客相关的一些内容,比如博客名称、博客日志列表、博客使用的主题等等。
有了Weblog对象,我们也就可以知道某个博客使用的是什么主题,此主题包含多少个模板了。有了主题roller仅仅知道要展现成什么样子,而里面的数据从哪里来?
roller把博客页面内容各部抽象成一个Model接口,比较代表菜单的、有代表页面的等等,此接口有两个方法:
1、public String getModelName();
2、public void init(Map params) throws WebloggerException;
此接口有几个实现类,分别是:CalendarModel、ConfigModel、MenuModel、PageModel、SiteModel等。这些类的对象是要在velocity的模板文件中被使用的。引用的名字是他们的getModelName方法返回的内容,比如下面vm代码:
################ weblog.vm #######################
#set($pager = $model.getWeblogEntriesPager())
<div class="next-previous">
#if ($model.results)
#showWeblogSearchAgainForm($model.weblog)
#showNextPrevSearchControl($pager)
#else
#showNextPrevEntriesControl($pager)
#end
</div>
################## menu-list.vm #####################
<div id="menu">
#foreach( $menu in $menuModel.getMenus() )
分别引用的对象是PageModel、MenuModel。
在PageServlet中,执行下面代码完成一个页面的数据组织:
// Load models for pages
String pageModels = WebloggerConfig.getProperty("rendering.pageModels");
ModelLoader.loadModels(pageModels, model, initData, true);
完成数据的组织就该交的velocity来生成页面了。在PageServlet中,roller先根据模板对象去获取一个Renderer,然后创建一个CachedContent缓存对象,先把Renderer生成的页面内容放在CachedContent中,再通过流把页面输出到用户的浏览器中。
如何获得一个渲染器renderer,roller费了一番周折。
renderer = RendererManager.getRenderer(page);
在这个getRenderer()方法中,RendererManager一开始就被初始化,并且从roller.properties中读取用户配置的rendering.rollerRendererFactories值,如果用户没有特殊要求的话,一般是这个值:
org.apache.roller.weblogger.ui.rendering.velocity.VelocityRendererFactory
RendererManager会把请求交给VelocityRendererFactory这个类的对象处理。VelocityRendererFactory会new一个VelocityRenderer对象返回,但VelocityRenderer对象是roller自己定义的类,真正干活的是velocity的Template类,此类作为VelocityRenderer的一个属性,当new一个VelocityRenderer时,调用velocityEngine.getTemplate(name, encoding)方法一个velocity的Template 。
剩下的事情就交给velocity引擎去做了,velocity怎么去构建一个他它自己的Template对象我就不清楚了。但通过观察velocity.properties文件发现,这两个类值得留意:
ThemeResourceLoader、RollerResourceLoader。
这两个类都继承了velocity的ResourceLoader类,其中的都有public InputStream getResourceStream(String name)方法,这个方法跟加载模板内容有关!
ThemeResourceLoader会调用ThemeManager的方法,而ThemeManager在启动的时候会把系统预定义的模板加载到内存中。
RollerResourceLoader会调用数据库去获取一个模板内容。
这里得说说roller为了主题的多样化、个性化而提供的一个自定义主题功能,如果用户自定义了主题,则roller会把主题相关的模板等信息保存到db中,因此就需要到db中查询主题模板信息。
从velocity引擎得到template后,渲染器Renderer在PageServlet中被用来生产页面,具体就是由velocity的template来做,怎么做?笔者精力有限先了解到这。
题外话:roller有个功能,就是可以把某个博客设置为站点主页。如果我们用roller来做一个小网站,又不想搞得太复杂,可以专门做一个主页的模板,并且有一个博客使用,再用一个类取主页相关的数据并实现Model,这样就可以用既有缓存功能又简单。所以好的代码扩展就是比较方便!
下次说说roller如何缓存页面。
分享到:
相关推荐
Roller 是一个全功能的多用户博客平台,于2002年首发,采用Java语言开发,设计精巧,源代码是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS ...
- **JSTL (JavaServer Pages Standard Tag Library)**:JSTL提供了一系列标准标签,简化了JSP页面的编写,Roller可能利用这些标签处理常见任务,如循环、条件判断等。 - **Java Persistence API (JPA)**:Roller...
Roller 是一个全功能的多用户博客平台,于2002年首发,采用Java语言开发,设计精巧,源代码是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS ...
Roller4.0的另外一套cas简单解决方案. 最近在使用roller4.0和cas的单点登录集成.中间碰到了很多很多的问题.也许我碰到的问题都是属于自己的技术不成熟,能力不够引起的.但是我想应该还是有很多人和我是差不多的吧.我...
weblogging 设计比较精巧,是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS syndication,blogroll管理和提供一个XML-RPC 接口。 最主要是其开源
在Roller中,可以通过以下几种方式来编辑和创建页面模板: ##### 3.1 博客模板 博客模板定义了整个博客站点的布局和样式。它包括了头部、尾部、侧边栏等公共元素。通过修改博客模板,可以全局地更改博客的整体外观...
- Tomcat5.5.27: 一个开源的Servlet容器,用于部署Java Servlet和JSP页面,是Apache软件基金会的Jakarta项目中的一个核心项目。 - Roller4.0.1: Roller博客系统的版本号,也是搭建的目标版本。 - Apache Roller: ...
在"Laravel开发-roller"中,中间件可能用于实现权限检查,确保只有拥有特定权限的用户才能访问某些页面或执行特定操作。例如,你可以创建一个`auth`中间件来验证用户是否已登录,一个`role`中间件来检查用户是否具有...
2. **视图层(View)**:使用FreeMarker模板引擎,结合JSP页面,提供用户友好的界面展示。 3. **控制器(Controller)**:通过Servlet和Filter处理HTTP请求,调用服务层的方法,组织视图并返回响应。 四、服务层与业务...
app :Roller Weblogger webapp,JSP页面,Velocity模板 assembly-release :用于创建Roller的正式发行版 docs :ODT格式的压路机文档 it-selenium :使用Selenium的Roller的集成浏览器测试 文献资料 《 Roller安装...
9. **模板引擎FreeMarker**:Roller使用FreeMarker作为模板引擎渲染页面,学习源码可以了解如何定义模板语法和变量,以及如何将数据绑定到模板中。 10. **持续集成与构建工具**:Roller使用Maven进行项目管理和构建...
Roller是一个全功能的多用户博客平台。采用Java语言开发,设计得比较精巧,源代码是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS,syndication,...
为了使Dice-Roller应用看起来吸引人,开发者可能使用了CSS(Cascading Style Sheets)来设置页面的样式。这包括设置字体、颜色、布局、动画效果等。例如,骰子的图片可能通过CSS的`background-image`属性设置,而...
Roller由以下Maven项目组成: roller-project:顶级项目应用程序:Roller Weblogger webapp,JSP页面,Velocity模板汇编发布:用于创建Roller文档的官方发行版:ODT(OpenOffice / LibreOffice)格式的Roller文档-...
这个weblogging 设计得比较精巧,源代码是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS syndication,blogroll管理和提供一个XML-RPC 接口。
- **错误处理**:Laravel有完善的错误报告机制,包括异常处理和错误页面。 - **日志记录**:Laravel使用Monolog库记录日志,可以自定义日志级别和存储方式。 8. **Blade模板引擎** - **Blade语法**:Blade提供...
- `each`遍历选择的DOM元素,为每个元素添加类`roller-container`,并根据用户提供的数据(可能是预先定义的数组或页面元素)创建并添加滚动项。 4. **内容构建**: - `buildLink`函数用于构建`<a>`元素,根据...
Roller由以下Maven项目组成: roller-project:顶级项目应用程序:Roller Weblogger webapp,JSP页面,Velocity模板汇编发布:用于创建Roller文档的官方发行版:ODT(OpenOffice / LibreOffice)格式的Roller文档-...
DnD Dice Roller:此扩展程序扩展了DnD Beyond上的内容。 它处理所有与转换咒语有关的烦人的数学运算。 例如,设置动画对象可以进行10次攻击和伤害掷骰……如果您有优势,可以用10种不同的伤害掷骰进行20次攻击时...
2. **模板管理**:用户可以自定义页面布局,选择或设计模板以适应不同类型的网站需求。 3. **权限控制**:通过角色和权限分配,Roller CMS可以实现对用户访问和操作内容的精细化管理。 4. **SEO优化**:内置搜索...