在roller中如何实现一个blog有多个主题?

背景

当前获取信息的设备越来越多,比如平板电脑、智能手机,已经不是过去PC统治的年代了。所以很多网站为了提高用户体验根据不同的设备用不同的主题展现相同的数据。那么在roller中如何实现一个网站实现不同的主题呢?要考虑哪些因素?

有同学或许会说,这没什么的,用js+css或者借助一些框架就能根据不同的设备实现不同的主题。这是一种常见的方法,但在roller中可能要考虑的因素不同,机制不同。

原理

根据请求的URL不同让blog选择不同的主题。比如我们用域名www.example.com为PC访问展现内容,用m.example.com为智能手机展现内容。那么在roller中要根据域名的差异选择不同的主题。

怎么为roller设置域名映射参考我的文章:http://blog.csdn.net/rol2er/article/details/19081799

实现方法及说明

1、在类Weblog.java中增加一个参数用于传递请求的域名,以便后面做判断,以便达到修改代码最少的目的。

public String requestDomain;

用public是因为jpa如果有get/set方法就必须在db表中有对应的字段。

2、在合适的地方设置requestDomain

如果看过我前面的文章,你可能了解在roller中所有的页面请求都通过PageServlet.java 这个类。因此跟踪代码后知道要修改WeblogRequest类的getWeblog方法:

    public Weblog getWeblog() {

        if(weblog == null && weblogHandle != null) {
            try {
                UserManager umgr = WebloggerFactory.getWeblogger().getUserManager();
                weblog = umgr.getWebsiteByHandle(weblogHandle, Boolean.TRUE);
            } catch (WebloggerException ex) {
                log.error("Error looking up weblog "+weblogHandle, ex);
            }
        }
        //add
        weblog.requestDomain = request.getServerName();

        return weblog;
    }

3、根据请求域名的不同选择不同的主题。在本文章前roller中weblog跟主题的关系是一对一的。在PageServlet中充满类似这样获取页面模板的调用:

page = weblog.getTheme().getTemplateByAction(ThemeTemplate.ACTION_PERMALINK);

我们要做的是进入getTheme()方法,看看后面的是什么逻辑。经过跟踪代码我们找到可以修改的地方ThemeManagerImpl.java的方法getTheme,如下:

    public WeblogTheme getTheme(Weblog weblog) throws WebloggerException {

        if(weblog == null)
            return null;

        WeblogTheme weblogTheme = null;

        // if theme is custom or null then return a WeblogCustomTheme
        if(weblog.getEditorTheme() == null ||
                WeblogTheme.CUSTOM.equals(weblog.getEditorTheme())) {
            weblogTheme = new WeblogCustomTheme(weblog);

        // otherwise we are returning a WeblogSharedTheme
        } else {
            ThemeManager themeMgr = roller.getThemeManager();
            SharedTheme staticTheme =
                    (SharedTheme) this.themes.get(weblog.getEditorTheme());
            //add
            String otherTheme = WebloggerConfig.getProperty(weblog.requestDomain + ".other.theme.name");

            if(otherTheme != null) {
            	staticTheme =
                        (SharedTheme) this.themes.get(otherTheme);
            }//end 

            if(staticTheme != null) {
                weblogTheme = new WeblogSharedTheme(weblog, staticTheme);
            } else {
                log.warn("Unable to lookup theme "+weblog.getEditorTheme());
            }
        }

        return weblogTheme;
    }

红色的是我增加的代码(add/end),通过配置文件来确定博客是否有多个主题,否则就按照原来的逻辑执行。

4、修改roller的缓存系统。

roller为了提高性能对页面做了缓存,如果不对缓存的内容根据domain做区别处理,那么被缓存的一份内容可能被不同的设备获取到,届时智能手机将看到pc专用页面,pc将获取智能手机的专用页面。这种情况是非常糟糕的。

那么如何解决呢?只要修改两个地方。对SiteWideCache类和WeblogPageCache类的下面方法增加红色代码即可。

    public String generateKey(WeblogPageRequest pageRequest) {

        StringBuffer key = new StringBuffer();
        //add
        key.append(pageRequest.getWeblog().requestDomain);//end
        key.append(this.CACHE_ID).append(".").append(pageRequest.getLocaleInstance().toString()).append(":");
        key.append("page/");
        key.append(pageRequest.getWeblogHandle());
        //....

}

最后

大概的思路是这样,如果你对roller比较好的了解,有更好的方案,欢迎交流。

时间: 2024-10-14 16:54:42

在roller中如何实现一个blog有多个主题?的相关文章

oracle中如何判断一个字符串是否含有汉字

oracle中如何判断一个字符串是否含有汉字 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ①全角字符的判断,或者是含有汉字的字符串的判断 本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力. 一.2.2 实验环境介绍 11.2.0.3  RHEL6.5 一.2.3 本文简介 看到网友问,怎么查询表中某个字段数据是不是包含了

Android中Service的一个Demo例子

Android中Service的一个Demo例子  Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding.  本文,主要贴代码,不对Service做过多讲解.  代码是从网上找的一个例子,Copy下来发现代码不完全正确,稍微修改了下.  AndroidManifest.xml <application android:icon="@drawable/ic_launcher" android:label="@stri

浅谈为什么一个java源文件中只能有一个public类?

声明,本篇文章为转载 转载 http://blog.csdn.net/bareheadzzq/article/details/6562211 最近在一个java文件中实现了几个类,其中一个声明为public类型,但编译器报错:后来将public去掉,也即文件中没有一个public类,程序正常运行,有些困惑,最后通过本文章找到答案,为以后方便查找,转载,感谢作者. 结论: 一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必 须与之一致,否则无法编译,如果源文件中

Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)

转载自http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知 handler基本使用: 在主线程中,使用handler很简单,new一个Handler对象实现其handleMessage方法,在handleMessage中 提供收到消息后相应的处理方法即可,这里不对handler使用进行详细说明,在看本博文前,读者应该先掌握hand

android开发之在activity中控制另一个activity的UI更新

转自:http://blog.csdn.net/jason0539/article/details/18075293 第一种方法: 遇到一个问题,需要在一个activity中控制另一个acitivity做一些更新,没想到传递handler的方法,通过以下方式解决. 1.在MyAPP中定义属性handler 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package jason.com;     import jas

Django实战:构建一个blog

本篇博文教大家如何用Django框架实现一个博客系统,可在后台管理博客. 一,创建项目 django-admin.py startproject mysite 如下图所示: 运行该命令后,就会在当前目录下创建一个目录mysite 二,测试开发服务器 进入到mysite目录,然后运行./manage.py runserver 0.0.0.0:8001,如下图所示: 注意这里我选择的端口号是8001,你也可以选择别的端口(如8002),但是要注意的是这个端口不能被占用 我们在浏览器中输入129.16

mvc中razor的一个bug

具体东西就不多说了,所有编译,代码都是木有问题的. 结果预览页面的时候竟然告诉我编译错误,尼玛这不科学啊. 来看看错误页面 看着问题大概应该是缺少} ,或者多了个} 倒置的编译错误才对,但是编译生成完全没有问题啊,没办法,既然报这个问题,那肯定是最终合并生成的代码文件存在bug 那到底是哪里出的问题呢,没办法,硬着头皮查吧. 1.显示试着调试运行了一下页面,发现后台完全没问题.return view() 后,就出现了黄页. 那问题应该就是在html页面中了,那就来看看html页面中有些什么吧.

位运算解决“一个数组中,只有一个数字出现n次,其他数字出现k次”问题

转自:https://blog.csdn.net/monster_girl/article/details/52928864 在学习完位操作后,经常会遇到一类关于查找缺失整数的问题. 第一类是给你一个数组,告诉你这些数字的范围是什么,然后让你查找这个缺失的数字(例如无序数组的范围是从1到10,不重复的9个数). 这类问题的解决方法比较多样,第一种,因为给定了范围可以通过计算数字总和值,然后分别减去这些数字,剩下的则是缺失的数字.第二种,对这个数组进行排序,遍历整个数组,然后判断相邻的元素是否连续

CAD技巧,怎么在CAD中绘制出一个表格?

CAD技巧,怎么在CAD中绘制出一个表格?当我们在日常的工作中绘制CAD图纸的时候,遇到比较复杂的图纸就需要在CAD图纸中添加一些数据说明,一般编辑CAD图纸都是借助CAD编辑器来进行绘制的,那怎么在CAD中绘制出一个表格?具体要怎么来进行操作?今天小编就通过这篇文章来告诉大家怎么在CAD中绘制出一个表格?下面就一起来看看具体操作步骤吧! 第一步:首先如果小伙伴们电脑上没有安装CAD编辑器的,可以在浏览器中搜索迅捷CAD编辑器(标准版),进入到官网,根据提示步骤来下载安装最新版本的CAD编辑器.