留言本:
留言本是一个非常典型的示例,使用到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 --> 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 --> 64位机器下载:Zhiqim-Studio-Win64.zip <-- 点击下载Example工程源码 --> zhiqim_guestbook_V1.5.0_src.zip |
三、留言本源码工程结构
源码资源目录
引入外部库资源目录
工程配置相关目录
|
|
四、留言本配置说明
一、系统配置(系统引导、其他配置和服务配置三项): |
<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 |
三、编写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 { ... } |
八、留言本调试
配置调试信息
单步调试IndexAction
|
<-- debug配置 --> <-- debug状态 --> |
九、留言本发布(导出执行程序和工程源码打包)
|
|
|
十、留言本运行(Windows和Linux)
配置[/conf/zhiqim.xml]文件
Windows运行
Linux运行
|
<-- Windows下运行 --> <-- Linux下运行 --> |