留言本:

留言本是一个非常典型的示例,使用到Zhiqim Framework基础模板(微内核、数据库映射、模板引擎、WEB容器和前端UI), 这里分步骤介绍如何应用Zhiqim Studio和SQLite编写一个留言本工程。

留言本功能描述

1、首页(/index.htm),分页显示留言列表,每个留言显示留言者联系方式和留言内容,如果管理员有回复,显示回复内容。

2、访客留言(/leaveMessage.htm),包括留言页面和留言提交处理,前后端表单验证和数据库访问。

3、管理员登录(/login.htm),包括管理员登录页面和登录处理,前后端表单验证和数据库访问,登录成功绑定用户会话。

4、管理员退出(/logout.htm),解除用户会话绑定,返回登录页。

5、管理员留言列表(/adminList.htm),登录成功后跳转到该页,分页显示留言列表,管理员可选择留言进行回复和删除。

6、管理员回复(/adminReply.htm),包括管理员回复或修改留言页面和回复提交处理,前后端表单验证和数据库访问。

7、管理员删除留言(/adminDelete.htm),管理员删除指定的留言,删除后返回管理员留言列表。

一、留言本示例体验 JDK安装指南
  • 检查JDK,目前规约的JDK版本是jdk7u80。如果您已下载并安装JDK可忽略。
  • 下载示例执行程序,下载解压点击zhiqim.exe运行(要求50080和80两个端口不要被占用),运行后使用浏览器访问http://127.0.0.1即可体验效果。
  • 本示例使用文件数据库SQLite,如何您要查看数据库信息,下载sqlitestudio-2.1.5.exe,绿色软件,点击运行,添加数据库指到文件即可。
<-- 点击下载JDK -->
64位机器下载:jdk-7u80-windows-x64.exe
32位机器下载:jdk-7u80-windows-i586.exe

<-- 点击下载Example执行程序 -->
zhiqim_guestbook_V1.5.0.zip

<-- 点击下载SQLite管理软件 -->
sqlitestudio-2.1.5.exe
二、留言本开发前准备
  • 下载Zhiqim Studio。
  • 下载Example工程源码,导入到Zhiqim Studio中,得到第三步工程结构。
<-- 点击下载Zhiqim Studio -->
64位机器下载:Zhiqim-Studio-Win64.zip
<-- 点击下载Example工程源码 -->
zhiqim_guestbook_V1.5.0_src.zip

三、留言本源码工程结构

源码资源目录

  • src/dbo用于存放数据对象源码,由db/留言本.dbo设计并生成。
  • src/portal用于存放编写留言本的功能源码,包括action,interceptor和SessionUser等。

引入外部库资源目录

  • JRE System Library约定的[JavaSE-1.7]环境。
  • Referenced Libraries引用库目录[lib]下所有包。
  • 库目录[lib]存放引用库文件。并通过[Build Path]加载到Referenced Libraries。(如右图所示,本示例有6个zhiqim*.jar)

工程配置相关目录

  • 配置目录[conf]存放工程配置文件,[zhiqim.xml]是必须的。在zhiqim.xml的[config]选项中可以增加多个配置文件,如本示例httpd.xml和logging.xml。
  • 数据库目录[database]存放SQLite数据库文件。
  • 文档目录[document]存放工程文档,如数据库字典、工程导出配置文件[export/project.exp.xml]。
  • 日志目录[logs]存放调试、运行时生成的日志。
  • 资源目录[resource]存放WEB容器ZML上下文环境的配置文件、ZML页面文件等。包括上下文环境配置[/conf/context.xml][/conf/context.zml]等。
  • 发布目录[release]存放导出的执行程序和源码。
  • ZhiqimGuestbook
  • src/dbo
  • org.zhiqim.example.gbook.dbo
  • Admin.java
  • Message.java
  • src/portal
  • org.zhiqim.example.gbook
  • action
  • IndexAction.java
  • LeaveMessageAction.java
  • AdminLoginAction.java
  • AdminLogoutAction.java
  • AdminListAction.java
  • AdminReplyAction.java
  • AdminDeleteAction.java
  • interceptor
  • ChkAdminLogin.java
  • SessionUser.java
  • JRE System Library [JavaSE-1.7]
  • Referenced Libraries
  • zhiqim.jar
  • zhiqim_orm.jar
  • zhiqim_ml.jar
  • zhiqim_httpd.jar
  • zhiqim_ui.jar
  • zhiqim_sqlite_3.8.6.jar
  • conf
  • zhiqim.xml
  • httpd.xml
  • logging.xml
  • database
  • gbook.db
  • document
  • 留言本数据库字典.dbo
  • lib
  • logs
  • resource
  • conf
  • context.zml
  • context.xml
  • zview
  • adminList.zml
  • adminLogin.zml
  • adminReply.zml
  • index.zml
  • messageAdd.zml
  • release
  • src
四、留言本配置说明
一、系统配置(系统引导、其他配置和服务配置三项):
<group id="boot" desc="系统启动引导配置"> <item key="name" value="访客留言本" type="protected" desc="系统名称" /> <item key="version" value="V1.4" type="protected" desc="系统版本" /> <item key="port" value="50080" type="protected" desc="系统监听端口,用于启动监听和命令关闭工程" /> <item key="home" value="d:/Java/jdk1.8.0_202/" type="protected" desc="JDK根目录" /> <item key="process" value="gbook" type="protected" desc="使用的进程名" /> <item key="args" value="-server -Xms64m -Xmx512m" type="protected" desc="JVM参数" /> </group> <group id="config" desc="系统其他配置文件,./开头表示工程相对路径下,绝对路径使用/或d:/等(Windows也使用顺斜杠作路径)"> <item key="logging" value="./conf/logging.xml" type="protected" desc="日志配置"/> <item key="httpd" value="./conf/httpd.xml" type="protected" desc="HTTPD配置"/> </group> <group id="service" desc="系统服务配置,有依赖时注意顺序,系统按顺序加载,按倒序销毁"> <item key="logging" value="org.zhiqim.kernel.logging.LogServer" type="protected" desc="日志服务"/> <item key="logcutter" value="org.zhiqim.kernel.logging.LogLinuxNohupCutter" type="protected" desc="日志LinuxNohup切割服务"/> <item key="orm" value="org.zhiqim.orm.ORMServer" type="protected" desc="数据库服务"/> <item key="httpd" value="org.zhiqim.httpd.HttpServer" type="protected" desc="HTTP服务"/> </group>
二、数据库配置(SQLite的user/pass默认配置root即可):
<group id="orm" desc="数据库映射服务"> <item key="dbType" value="sqlite" update="true" desc="数据库类型,支持oracle|mysql|mssql|postgresql|hsql|sqlite" /> <item key="driver" value="org.sqlite.JDBC" update="true" desc="数据库驱动" /> <item key="url" value="jdbc:sqlite:./database/gbook.db" update="true" desc="数据库Url" /> <item key="user" value="root" update="true" desc="数据库用户名" /> <item key="pass" value="root" update="true" desc="数据库密码" /> <item key="minPoolSize" value="2" update="true" desc="线程池最小值" /> <item key="maxPoolSize" value="10" update="true" desc="线程池最大值" /> <item key="maxKeepTime" value="7001" type="protected" desc="每连接最大保持时长,大于该值将重建连接,单位秒" /> </group>
三、WEB容器配置(监听HTTP协议80端口,在httpd.xml配置):
<group id="httpd" desc="WEB容器服务配置"> <item key="listen" value="httpd.listener" type="protected" desc="监听器" /> <item key="context" value="httpd.root" type="protected" desc="HTTP上下文环境,多个用逗号隔开" /> </group> <group id="httpd.listener" desc="WEB监听服务器"> <item key="scheme" value="HTTP" type="protected" desc="HTTP或HTTPS协议" /> <item key="port" value="80" type="protected" desc="监听端口" /> <item key="minPoolSize" value="5" type="protected" desc="解析头部线程池最小值" /> <item key="maxPoolSize" value="10" type="protected" desc="解析头部线程池最大值" /> </group> <group id="httpd.root" desc="Portal界面"> <item key="path" value="/" type="protected" desc="虚拟目录,必填" /> <item key="resourceType" value="directory" type="protected" desc="资源目录类型classPath|directory,必填" /> <item key="resourcePath" value="./resource" type="protected" desc="资源目录,必填" /> <item key="welcomeUrl" value="/index.htm" type="protected" desc="欢迎页,无资源时可不配置,/开头" /> </group>
四、日志配置(支持info,error两级分离,每天一个文件):
<group id="logging" desc="日志配置"> <item key="logging.info" value="debug-info" update="true" desc="信息日志配置" /> <item key="logging.error" value="error-fatal" update="true" desc="错误日志配置" /> </group> <group id="logging.info" desc="信息日志配置"> <item key="console.out" value="true" update="true" desc="是否输出到控制台" /> <item key="file.out" value="true" update="true" desc="是否输出到文件" /> <item key="file.path" value="./logs/info.log" update="true" desc="输出到文件路径" /> </group> <group id="logging.error" desc="错误日志配置"> <item key="console.out" value="true" update="true" desc="是否输出到控制台" /> <item key="file.out" value="true" update="true" desc="是否输出到文件" /> <item key="file.path" value="./logs/error.log" update="true" desc="输出到文件路径" /> </group>
五、留言本数据库字典(通过/document/留言本数据库字典.dbo设计)
一、创建/document/留言本数据库字典.dbo文件:




二、创建分类(DBO的类包名):


三、创建表和字段(选中分类,右键新建表;选中表,右键新建字段):


四、配置和生成DBO(如图在/src/dbo源码包中生成Admin和Message类):
六、编写Action(以留言本首页/index.htm设计为例写一个Action)
一、Action配置(/resource/conf/context.xml):
<action name="首页" path="/index.htm" template="/zview/index.html" class="org.zhiqim.example.gbook.action.IndexAction"/>
另外,有注解方式代替配置的用法(需要配置actionPackage,详见WEB容器中的配置,这里不深入说明):
@AnAction(name="首页", path="/index.htm", template="/zview/index.html") public class IndexAction implements Action { ... }
二、编写Action类(org.zhiqim.example.gbook.action.IndexAction):
public class IndexAction implements Action { @Override public void execute(HttpRequest request) throws Exception { int page = request.getParameterInt("page", 1); int pageSize = request.getContextAttributeInt("page.size", 10); Selector selector = new Selector(); selector.addOrderbyDesc("messageTime"); PageResult messagePage = ORM.table().page(Message.class, page, pageSize, selector); request.setAttribute("messagePage", messagePage); } }
三、编写zml文件(resource/zview/index.zml):
<table class="z-table"> <#for item : messagePage.list()> <tr> <td width="30%">称呼:${item.getMessageName()}</td> <td width="*">联系方式:${item.getMessageContacting()}</td> </tr> <tr> <td colspan="2">留言内容:${item.getMessageContent()}</td> </tr> <#if item.getMessageReply() != null> <tr> <td colspan="2">管理员回复:${item.getMessageReply()}</td> </tr> </#if> <tr> <td colspan="2"><hr/></td> </tr> </#for> <tr> <td colspan="2" align="center">${Pagings.toHtmlLinkAll5(messagePage, "/index.htm")}</td> </tr> </table>
七、编写管理员拦截器(ChkAdminLogin)
一、Interceptor配置(/resource/conf/context.xml):
<interceptor name="检查管理员是否登录" key="chkLogin" class="org.zhiqim.example.gbook.interceptor.ChkAdminLogin"/>
非组件式规约下,可以不配置Interceptor,仅使用@AnAlias注解别名即可:
@AnAlias("chkLogin") public class ChkAdminLogin implements Interceptor { ... }
二、编写Interceptor类(org.zhiqim.example.gbook.interceptor.ChkAdminLogin):
public class ChkAdminLogin implements Interceptor { @Override public void intercept(HttpRequest request) throws Exception { if(!request.hasSessionUser()) { request.setRedirect("/index.htm"); return; } } }
三、在Action上增加拦截器(注明interceptor="chkLogin"):
<action name="管理员首页" interceptor="chkLogin" path="/adminList.htm" template="/zview/adminlist.html" class="org.zhiqim.example.gbook.action.AdminListAction"/>
如果Action采用注解方式增加注解@AnInterceptor("chkLogin"):
@AnAction(name="管理留言列表", path="/adminList.htm", template="/zview/adminList.html") @AnInterceptor("chkLogin") public class AdminListAction implements Action { ... }
八、留言本调试

配置调试信息

  • 在Zhiqim Studio菜单下按钮表中点击爬虫图标右边的下拉钮找开Degug Configurations,或菜单中找开/Run/Degug Configurations。
  • 在Degug Configurations对话框中,从左侧Java Applition中右键New,得到一个新的Application,修改名称ZhiqimGuestbookV1.2,选择Project为ZhiqimGuestbookV1.2,选择Main class中找到Zhiqim。保存或运行,下次即可直接选择创建好的ZhiqimGuestbookV1.2运行进入调试状态。
  • 未修改类结构(属性或方法名)时,只修改方法内代码,调试状态无需重启,极大方便定位问题

单步调试IndexAction

  • 在IndexAction类的execute方法中增加断点。
  • 在Degug模式下运行ZhiqimGuestbook。
  • 通过F5/F6/F7/F8进行步骤跟踪,通过Variables视图查看对象值,通过Debug视图查看线程。
<-- debug配置 -->


<-- debug状态 -->

九、留言本发布(导出执行程序和工程源码打包)
  • 选中工程[ZhiqimGuestbook],右键找到[Export]。
  • 如下图一所示,找到[Zhiqim]下的[知启蒙工程]。
  • 如下图二所示,根据导出向导,配置发布路径,发布名称、源码JAR包名称、和导出源码工程名称等。
  • 点击[Finish],导出向导根据配置运行,生成执行程序、源码打包等(注意控制台打印日志)
  • 选择保存或运行了导出向导,会在[document/export]目录下自动生成或覆盖[project.exp.xml]导出配置文件,下次导出则无需再编写导出配置项。


十、留言本运行(Windows和Linux)

配置[/conf/zhiqim.xml]文件

  • [boot.port]的端口必须空闲,默认50080,您可以修改该值。
  • [boot.home]的JDK根目录,如果配置了请保证JDK安装正确。如果根据环境变量[JAVA_HOME]来配置请删除[boot.home]配置项。

Windows运行

  • 点击zhiqim.exe即启动工程,弹出一个Windows的控制台并显示日志。
  • 点击控制台关闭按钮或按下Ctrl+C键关闭工程。

Linux运行

  • 如果zhiqim.xml文件在Linux下文件是乱码,请尝试在Windows下记事本重新另存为UTF-8或ANSI(GBK),再上传到Linux,或在Linux下使用VIM的:set fileencoding=utz-8/GBK修改成Linux设置的编码)
  • 在Linux环境下,首次给zhiqim.lix文件增加执行权限(chmod +x zhiqim.lix)。
  • 在控制台下执行./zhiqim.lix即运行,输出日志到nohup.out。
  • 执行./zhiqim.lix -c关闭工程。
<-- Windows下运行 -->


<-- Linux下运行 -->