登录:

登录是一个非常典型的示例,使用到了知启蒙基础框架中的微内核,标记语言和WEB容器部分。

一、登录示例源码工程结构

源码资源目录

  • src用于存放编写评论组件的功能源码,如action等。

引入外部库资源目录

  • JRE System Library约定的[JavaSE-1.7]环境。
  • Referenced Libraries引用库目录[lib]下所有包。
  • 库目录[lib]存放引用库文件。并通过[Build Path]加载到Referenced Libraries。

工程配置相关目录

  • 配置目录[conf]存放工程配置文件,[zhiqim.xml]是必须的。在zhiqim.xml的[config]选项中可以增加多个配置文件。
  • 文档目录[document]存放工程文档,如数据库字典、工程导出配置文件[export/project.exp.xml]。
  • 日志目录[logs]存放调试、运行时生成的日志。
  • 资源目录[resource]存放WEB容器ZML上下文环境的配置文件、ZML页面文件等。包括上下文环境配置[/conf/config.xml]等。
  • 发布目录[release]存放导出的执行程序和源码。
  • zhiqim_login
  • src
  • org.zhiqim.example
  • ChkLoginInterceptor.java
  • LoginAction.java
  • LogoutAction.java
  • SessionUser.java
  • JRE System Library [JavaSE-1.7]
  • Referenced Libraries
  • zhiqim.jar
  • zhiqim_zml.jar
  • zhiqim_httpd.jar
  • conf
  • zhiqim.xml
  • document
  • export
  • lib
  • logs
  • resource
  • conf
  • config.xml
  • zml
  • login.zml
  • success.zml
  • release
二、登录示例/conf/zhiqim.xml配置说明
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ZHIQIM-CONFIG PUBLIC "-//ZHIQIM //DTD Zhiqim-Config Configuration 1.5.0//EN" "http://zhiqim.org/xmldtds/zhiqim_config_1_5_0.dtd"> <zhiqim-config> <group id="boot" desc="系统启动引导配置"> <item key="name" value="登录" type="protected" desc="系统名称" /> <item key="version" value="V1.0" type="protected" desc="系统版本" /> <item key="port" value="60080" type="protected" desc="系统监听端口,用于启动监听和命令关闭工程" /> <item key="home" value="d:/Java/jdk1.7.0_80/" type="protected" desc="JDK根目录" /> <item key="process" value="zhiqim" type="protected" desc="使用的进程名" /> </group> <group id="service" desc="系统服务配置"> <item key="httpd" value="org.zhiqim.httpd.HttpServer" type="protected" desc="HTTP服务"/> </group> <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="/login.htm" type="protected" desc="欢迎页,无资源时可不配置,/开头" /> </group> </zhiqim-config>
三、登录示例/conf/zhiqim.xml配置说明
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ZHIQIM-CONTEXT PUBLIC "-//ZHIQIM //DTD Zhiqim-Context Configuration 1.5.0//EN" "http://zhiqim.org/xmldtds/zhiqim_context_1_5_0.dtd"> <zhiqim-config> <interceptor name="检查管理员是否登录" key="chkLogin" class="org.zhiqim.example.ChkLoginInterceptor"/> <sessionUser name="前端" path="*" class="org.zhiqim.example.SessionUser" /> <action name="登录" path="/login.htm" view="/zml/login.zml" redirect="/success.htm" success="登录成功" class="org.zhiqim.example.LoginAction"/> <action name="退出" path="/logout.htm" redirect="/login.htm" class="org.zhiqim.example.LogoutAction"/> <action name="成功" path="/success.htm" interceptor="chkLogin" view="/zml/success.zml"/> </zhiqim-config>
四、登录示例类的编写
ChkLoginInterceptor.java
package org.zhiqim.example; import org.zhiqim.httpd.HttpRequest; import org.zhiqim.httpd.context.core.Interceptor; /** * 检查用户是否已登录 * * @version v1.0.0 @author zouzhigang 2017-2-21 新建与整理 */ public class ChkLoginInterceptor implements Interceptor { @Override public void intercept(HttpRequest request) throws Exception { if (!request.hasSessionUser()) { request.setRedirect("/login.htm"); return; } } }
LoginAction.java
package org.zhiqim.example; import org.zhiqim.httpd.HttpRequest; import org.zhiqim.httpd.context.extend.GetPostAction; import org.zhiqim.httpd.validate.ones.IsNotEmpty; /** * 登录 * * @version v1.0.0 @author zouzhigang 2017-2-21 新建与整理 */ public class LoginAction extends GetPostAction { @Override public void validate(HttpRequest request) { request.addValidate(new IsNotEmpty("userName", "账号不能为空")); request.addValidate(new IsNotEmpty("userPass", "密码不能为空")); } @Override protected void doGet(HttpRequest request) throws Exception {//登录页面 } @Override public void doPost(HttpRequest request) throws Exception {//登录处理 String userName = request.getParameter("userName"); String userPass = request.getParameter("userPass"); if(!("admin".equals(userName) || "fadfox".equals(userName)) || !"111111".equals(userPass)) { request.returnHistory("用户名或密码不正确,请重新输入!"); return; } SessionUser sessionUser = new SessionUser(userName); request.bindSessionUser(sessionUser); } }
LogoutAction.java
package org.zhiqim.example; import org.zhiqim.httpd.HttpRequest; import org.zhiqim.httpd.context.core.Action; /** * 退出 * * @version v1.0.0 @author zouzhigang 2017-2-21 新建与整理 */ public class LogoutAction implements Action { @Override public void execute(HttpRequest request) throws Exception { request.unbindSessionUser(SessionUser.class); } }
SessionUser.java
package org.zhiqim.example; import org.zhiqim.httpd.HttpSessionUser; /** * 会话用户 * * @version v1.0.0 @author zouzhigang 2017-2-21 新建与整理 */ public class SessionUser extends HttpSessionUser { private String userName; public SessionUser(String userName) { this.userName = userName; } @Override public String getSessionName() { return userName; } }