JetNuke笔记 ( by quqi99 )
http://blog.csdn.net/quqi99/article/details/1624223
——————————————————————————————————————————————————————————
JetNuke笔记 ( by quqi99 )
作者:张华 发表于:2007-05-24 ( http://blog.csdn.net/quqi99 )
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明。
JetNuke
示范网站
:
网址:
http://gforge.osdn.net.cn/projects/jetnuke/
JetNuke
最大的优势就是集成了众多应用。
JetNuke
提供了:
Jforum
论坛、新闻发布和管理、内容分类、私人消息、链接管理、下载管理、调查、统计、站点搜索、
FAQ
、内容反馈、广告管理、管理控制台等等功能。用它来做一个普通网站的应用,应该差不多了。
JetNuke
在内容显示方面主要采用的技术是
Velocity
模版技术
有些遗憾的是,
JetNuke
目前不支持最新的
JAVA
内容管理规范
JSR-170
。
JetNuke
页面的架构被分成
Modules
和
Blocks
。
Modules
定义了页面的主要内容,而
Blocks
则定义了显示在页面左右列的块。
Blocks
在页面上的位置是可自定义的。
Blocks
可以通过控制台在左、右、上、下等方向进行位置调整。
下面说一下
JetNuke
的内容扩展机制。静态的
Blocks
很容易通过
web
界面或编辑配置文件来创建。动态的
Blocks
的创建可以通过继承一个
Block
接口创建一个
JAVA
后台程序并在
xml
配置文件里注册这个
Block
。这个过程对于开发者来说是非常简单的。
同样的,对于
Modules
也有类似的接口和配置来创建自定义模块。
Blocks
和
Modules
的显示都是基于
Jakarta Velocity Template Language
。
这使得自定义和扩展
JetNuke
变得很容易。(我看来一下
Velocity
的语法,不是很难,有点编程基础的都很容易看懂。)
如何开发
Modules
和
Blocks
请参考相关的文档
Module developing guide
.
从上面的分析可以知道,如果你想通过研究
JetNuke
来学习新技术,那你还不如选择
Magnolia
。如果你想利用
JetNuke
来开发网站,那倒是个不错的选择。不过,目前
JetNuke
还没有汉化,要用它需要你自己汉化。工作量不小亚。:(
一、汉化:
jetnuke
里默认的语言是英文。为了让用户在页面的下拉框里选择
"chinese"
就可以看到中文界面,我们还需要修改
D:Tomcat5newwebappsjetnukeWEB-INFclassesblocksLanguagesblock.vm
文件。在该文件里的第
16
行插入
<option value="zh_CN" #if($_locale.toString()=='zh') selected #end>Chinese</option>
。注意,
value="zh_CN"
,而不是
"zh"
。如果是
"zh"
,那么相对应的资源文件就应该写出
resources_zh.properties
。
另外,为了保证汉化完整,还需要在第
56
行插入
<a
href="${contextPath}/do?module=your_account&op=chg_session_lang&
amp;amp;locale=zh"><img
src="${contextPath}/images/language/flag-chinese.png" border="0"
alt="Chinese" title="Chinese" hspace="3" vspace="3"></a>
。
经过多次失败后,终于找到了终于找到汉化
JetNuke
的办法。;)
汉化的关键:在
/WEB-INF/classes
目录下,有
blocks
和
modules
两个目录。这两个目录下都有多个子目录。以
blocks
下的
Admin
目录为例,
Admin
目录下有一个
resources.txt
和
languages
子目录。
resources.txt
文件里包含了英文的信息。为了汉化,你需要把
resources.txt
文件拷贝到
languages
子目录里,然后把
resources.txt
改名成
resources_zh_CN.txt
。最后,你就可以在
resources_zh_CN.txt
做汉化了。
我数了一下,大概有
48
个
resources_zh_CN.txt
文件需要翻译。工作量不小。:(
等我把
AtLeap
项目的安装文档翻译完了,我再开始做
JetNuke
的汉化吧。
二、安装
1
、创建一个空库(
mysql
)
: create database jetnuke default character set utf8;
2
、将
jetnuke1
。
2
的包丢到
tomcat
的
webapp
目录下。
3
、运行
http://localhost:8080/jetnuke
三、构建开发环境
1
、安装
Tomcat
插件。
2
、将
jetnuke
解压到
tomcat
的
webapp
下,然后从
eclipse
中直接将
jetnuke
工程导入进去就行。在导入的过程中出问题,是缺少
mail.jar
包。
3
,有问题:
java.sql.SQLException
: Base table or view not found message from server: "Table 'jetnuke.stories' doesn't exist"
,将相应的
sql
语句改正弄进去即可。
4
、管理端:
http://localhost:8080/jetnuke/do?/module=admin
四、预安装的模块。
1
、新闻
2
、管理。管理员以图形化方式来管理整个系统
3
、百科全书
4
、
FAQ
:对一个问答的集合
5
、反馈:回馈信息
6
、论坛:用
JFORUM
实现的。
7
、用户列表。显示所有注册的用户,从
JRORUM
直接过来的功能
8
、消消话
9
、查找,搜索。
10
、节
11
、统计:
IE
,
OS
,查看的用户信息
12
、故事集:对新闻的集中回顾。
13
、新闻提交。
14
、调查。
15
、
TOP10
。最活跃的
10
个元素。可以是文章,也可以是用户。
16
、主题。
17
、
web
连接
18
你的帐户。
五、预安装的版块。
1
、管理
2
、广告
3
、今日最火
4
、分类
5
、内容。显示了所有可用页的标题
6
、百科全书
7
、论坛
8
,
google
广告
9
、语言
10
、最新的
10
篇文章
11
,最新的
http
引用
12
、登陆
13
、模块
14
在线
15
回复
16
搜索
17
调查
18
下载
TOP10
19
连接
TOP10
20
站点点击数
21
不清待验内容
六、创建一个版块
(
版块相当于
ASOP
中的组件
)
6.1
创建一个版块
在
WEB-INFblocks
目录下。有
3
部分:
n
Config.xml
包括了版块的描述和它的描述。
n
Bloak.vm
被调用的
html
版块内容。
n
在
resources.txt
中指定版块的标题。
例:
Config.xml:
<?xml version="1.0"?>
<block-config>
<name>quqiBlock</name>
<description>
曲奇
</description>
<block-class>quqi.HelloWorldDyn</block-class>
</block-config>
package quqi;
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
import org.apache.velocity.VelocityContext;
import org.jetnuke.common.IAdminInfo;
import org.jetnuke.common.IBlock;
import org.jetnuke.common.IBlockInfo;
import org.jetnuke.common.IUserInfo;
public class HelloWorldDyn implements IBlock {
public void serviceBlock(HttpServletRequest req, VelocityContext vc,
IBlockInfo blockInfo, IUserInfo userInfo, IAdminInfo adminInfo)
throws Exception {
vc.put("hello_world_key",new Integer(new Random().nextInt()));
}
}
七、创建一个模块(相应于一个用组件组装的应用)
模块是和特定的内容一起填充每一页的中间列的。每一个模块就是一些
”action:”
的集合。
例:
Config.xml
<?xml version="1.0"?>
<module-config>
<name>hello world module</name>
<description>hello world</description>
<defaction class="quqi.Act" page="helloWorldMod.vm"/>
<action name="act1" class="quqi.Act2" page="act2.vm"/>
<forward name="fwd" page="forward.vm"/>
</module-config>
上面可以看出,
defaction
(默认的)只能有一个,它是预定义的没有名字。若不需要
action,
可直接
faword.
package quqi;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.velocity.VelocityContext;
import org.jetnuke.common.ActionForward;
import org.jetnuke.common.IAction;
import org.jetnuke.common.IAdminInfo;
import org.jetnuke.common.IModuleInfo;
import org.jetnuke.common.IUserInfo;
public class Act implements IAction {
public ActionForward exec(HttpServletRequest request,
HttpServletResponse response, VelocityContext vc, IModuleInfo info,
String op, IUserInfo ui, IAdminInfo ai) throws Exception {
vc.put("time",new Object());
//op
是
config.xml
中所对应的这个
action
的名字。
//
通常
URL
是这样的:
do?module=download&op=viewdownload&cid=1
return new ActionForward(op,info);
}
}
helloWorldMod.vm
文件是:
hello world
now is
#medium_date($time)
八
velocity
<ul>
#foreach( $product in $allProducts )
<li>$product</li>
#end
</ul>
#include
脚本元素允许模板设计者引入一个本地文件:
#include( "one.txt" )
#parse
脚本元素允许模板设计者引入一个
VTL
的本地文件。
Velocity
会编译
VTL
然后
调用制定的模板。
#parse( "me.vm" )
#macro( row )
<tr><td>$nbsp;</td></tr>
#end
然后你就可以在一个模板文件里使用这个宏了。
#row()
通常情况下,
JetNuke
把系统中能用到的宏全部包含在一个宏库文件中
(WEB-INF/classes/VM_global_library.vm)
。
这样一来,这些宏对全部的模板都可用了。
九、样式
查看
WEB-INF/style/NukeNews/
文件夹
;
一共有
4
个文件
:
- template.vm
- sidebox.vm
- opentable.vm
- closetable.vm
另外,图片和
CSS
文件放在这个目录:
jetnukestyleNukeNews
JetNuke笔记 ( by quqi99 )的更多相关文章
- git-简单流程(学习笔记)
这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- NET Core-学习笔记(三)
这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...
- springMVC学习笔记--知识点总结1
以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
随机推荐
- CentOS 6.9下的Setup工具(用于管理服务/防火墙/网络配置/验证服务)
说明:Setup工具套件好像是CentOS下特有的用于管理服务/防火墙/网络配置等,其实就是基于命令行模式界面的GUI工具.唯一特点就是方便. 安装: #安装Setup命令工具 yum -y inst ...
- 用Qemu模拟vexpress-a9 (二) --- 搭建u-boot调试环境
参考: http://blog.csdn.net/caspiansea/article/details/12986565 环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 ...
- linux dd命令实例讲解
转:http://blog.chinaunix.net/uid-28549627-id-3922282.html 提到linux 系统中的dd命令,各位技术博友大多都很熟悉,用法也是好多,今天主要跟大 ...
- 最短路径之迪杰斯特拉算法的Java实现
Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备 ...
- 关于yum的一些安装问题
最近折腾CentOS和kubernetes,遇到一些安装问题,把和yum相关的逐步总结如下: 如何用本地的cdrom作为yum源 mount /dev/cdrom /mnt 先查询是否安装了creat ...
- sqlmapapi的跨域访问Access-Control-Allow-Origin:*;ajax
1.做sqlmapapi的二次开发时,需要通过ajax方式调用sqlmapapi,但是默认情况下,sqlmapapi是不允许跨域访问的 2.尝试增加ajax的header,修改origin的值,来避免 ...
- NFSv4 mount incorrectly shows all files with ownership as nobody:nobody
NFSv4 mount incorrectly shows all files with ownership as nobody:nobody https://access.redhat.com/ ...
- 当客户端为RemoteAnywhere时Chef-server 使用knife-windows bootstrap的一个问题
笔者在使用knife-windows bootstrap 一个安装了RemoteAnywhere的节点遇到一个坑: knife bootstrap 192.168.1.245 -r 'role[my_ ...
- Spark streaming + Kafka 流式数据处理,结果存储至MongoDB、Solr、Neo4j(自用)
KafkaStreaming.scala文件 import kafka.serializer.StringDecoder import org.apache.spark.SparkConf impor ...
- new Thread(new ThreadStart(this.StartServer))
Thread .new thUdpServer thUdpServer = new Thread(new ThreadStart(this.StartServer))