目录
EasyJWeb简介
什么是EasyJWeb框架?
EasyJWeb是基于java技术,用于企业级Java Web应用程序快速开发的MVC框架。框架设计构思来源于国内众多项目实践,框架的设计及实现借鉴当前主要流行的开源Web框架,如Rails、Struts、JSF、Tapestry等,吸取其优点及精华,是一个完全由来自的中国开源爱好者开发,文档及注释全部为中文的开源框架。
特点介绍
快速开发支持
EasyJWeb的首要目标是实现基于JavaEE的Web应用程序快速开发。通过EasyJWeb的核心MVC、通用业务逻辑抽象及封装、代码自动生成、插件体系等几个部分有机组合,能实现企业级的Java Web应用程序开发。
零配置及约定配置
通过配置可以让程序变得更加的灵活、易维护及扩展,然而配置的滥用会造成维护配置文件过于麻烦。因此,EasyJWeb基于尽可能简化配置的原则,实现了零配置支持,同时为了保证系统的灵活性及可扩展性,还提供了很多的约定配置支持。
优雅的视图支持 页面及程序完全分离
EasyJWeb提供了非常优雅的视图支持能力,不但实现了视图页面模板与程序逻辑的完全分离,克服了传统jsp页面难于维护的问题,而且还实现了对页面纯天然的支持能力,使得非常适用于企业级应用中的页面制作人员与程序的分工合作。
超级IoC容器
作为一个主要用于Java企业级应用程序开发的框架,EasyJWeb实现了IoC容器,提供非常灵活的注入方式,并能支持Spring、Guice等异构容器实现。
Ajax支持
EasyJWeb内置了对远程javascript脚本调用功能,可以使用javascript直接访问服务端的业务组件。另外EasyJWeb通过使用prototype.js及其它一些来自开源社区ajax特效工具,提供了丰富的Ajax支持。
EasyJWeb框架由哪几部分组成?
核心MVC
EasyJWeb的核心是一个基于模板技术实现的MVC框架;他能让我们用非常简洁的代码写基于Java的Web应用。
容器及通用业务逻辑封装
作为一个旨在让基于Java的Web应用程序开发变得直接、快速、简易的框架,EasyJWeb提供了一个IoC容器,并对企业级应用中的一些通用业务逻辑(如分页、查询、DAO等)进行了抽象及封装,提供了一套可以直接操作、应用企业资源的组件及API。
代码生成引擎及工具
仅仅依靠一个灵活、简易的MVC核心引擎还不能最大限度的提高开发速度,因此EasyJWeb还提供了一个灵活、易用的代码生成引擎及工具,通过使用代码生成引擎,可以快速完成基于JavaEE平台的企业级应用程序生成。如数据库添删改查(CRUD)代码生成、自动页面模版生成、自动配置文件管理等。
EasyJWeb插件体系
项目中的各种实用功能的扩展,可以灵活地通过基于插件的形式安装到EasyJWeb中,提供各种针对性的功能。如ajax实用插件、代码生成插件等。
-----------------------------------以下为各个组成部分详解---------------------------------
MVC部分
MVC中,M-Model是指模型层,V-View是指视图层,C-Controller是指控制器。作为一个旨在提高开发效率、使Java代码与页面模板完全分离,增强系统的可维护性及可扩展性的MVC框架,EasyJWeb中同样有这三个基本的概念。在EasyJWeb应用程序中,Model层位于系统后台,一般是POJO对象,可以通过使用<beans>标签把后台的业务模型对象配置到容器中,让其它层的对象调用。Controller用于控制转发,EasyJWeb中所有的请求都由ActionServlet来负责处理,ActionServlet再调用相应的模块的Action,来实现具体的处理,EasyJWeb中的ActionServlet与模块Action一起共同担当了Controller的角色。最后是视图View,View是用来显示数据,Model层的处理结果将交由View层来,EasyJWeb中的View由单独的模板文件担当,视图模板可以是任何文本格式的信息,如html、xml、java、sql等。
请求发送
ActionServlet解析了请求,并从配置文件中得到了适当的控制器,就将包装好了的请求对象发送给该控制器的execute方法。而控制器的作用就在于处理请求并返回一个用户展示处理结果的页面模板对象Page。
ActionServlet
ActionServlet是一个前端控制器。用于在第一次请求到来时初始化框架,并接受每一个浏览器请求,解析请求URL,包装表单属性,并分发给具体的控制器处理。
请求按照EasyJWeb配置文件中定义或者约定配置来寻找处理器。比如,可以在配置文件中,使用<module path="/userManage" action="com.easyjweb.action.userManageAction" defaultPage="list">定义了一个请求为/userManage.ejf的请求样式都由userManageAction处理,关于控制器更详细的配置在配置详解一节讲述,easyJWebCommand等在AbstractCmdAction中介绍。在按照约定定位控制器的策略中,控制器需要放在com.easyjweb.action包中。比如,我们需要写一个用户登录的Action,可以在com.easyjweb.action这个包下面,添加一个名为LoginAction的类,这样即可通过/login.ejf来请求这个控制器。
对于提交的表单,ActionServlet会调用EasyjWeb中的核心处理器,将表单中的所有文字属性,都包装在WebForm中的textElement中,而将表单中包含的上传文件使用FileCommUpload包装为FileItem并放置在WebForm的FileElement中。关于表单的处理将在WebForm一节详细讲述。
请求Url
基本请求url模式:
当一个请求为http://xxx.xxx.com/abc.ejf的请求到来时,解析得到的控制器名字为abc。在这里,在框架内部是去寻找path属性设置为/abc的那个Module,并调用该Module对象对应的IWebAction对象来处理。而对于开发者,他们只需要知道用来处理/abc.ejf这个path的IWebAction是AbcAction。下面是一些请求url的样式例子:
1、 /module.ejf?easyjwebCommand=command&name=xxx
2、 /module.ejf
3、 /module.ejf?easyjwebCommand=command
4、 /module.ejf?easyjwebCommand=command&cid=1234
5、/module.ejf?easyJWebCommand=edit&cid=123455&title=111
6、/module.ejf?title=测试
第一个样式的意思是请求一个名字为module的模块(Module来)处理请求。如果改Action是AbstractCmdAction的子类的话,则会调用该类中对应的command方法,并且传入一个名为name,值为xxx的参数。关于AbstractCmdAction在后面章节有详细介绍。下面几个url请求类似。
高级请求url模式:
在EasyJWeb中,有一个URL路由映射处理器,通过配置这个映射处理器可以非常简单地实现Web应用中类似URLRewrite的需求。映射处理器代码如下所示:
public interface IPathMappingRuler ... {
//对请求路径的解析;
public String getModuleName();//得到模板的名称
public Map getParams(); //得到模板缺省参数
public String getCommand();//得到模板命令
}
该接口的默认实现是com.easyjf.web.core.PathMappingRulerImpl。在基于EasyJWeb的应用中,每一个交由EasyJWeb框架处理的请求url,都会通过这个映射处理器进行转换。通过使用EasyJWeb缺省URL映射转换器,客户端请求路径/module/command/params将按以下请求规则,作如下的映射处理.
映射处理前的URL:
1、 /ejf/module/command/name=xxx
2、 /ejf/module
3、 /ejf/module/command
4、 /ejf/module/command/12345
5、/ejf/module/edit/12345/title=1111
6、/ejf/moduel/title=测试
这些url分别对应上面的6中样式,这种url样式比较直观和规范。
URL映射转换器的一个最典型的应用示例,就是EasyJWeb中的远程Web脚本处理支持引擎,也即Ajax的部分功能。远程JS脚本调用功能只是EasyJWeb中的一个小小插件,EasyJWeb的Ajax实现只是一个普通的EasyJWeb Module(Action),这个Action即com.easyjf.web.ajax.AjaxEngineAction。
在EasyJWeb对Ajax的支持中,可以直接通过下面的URL来动态生成远程javascript调用脚本。
<script type='text/javascript' src="ejf/easyajax/prototype.js"></script>
<script type='text/javascript' src='ejf/easyajax/engine.js'></script>
<script type='text/javascript' src='ejf/easyajax/UserService.js'></script>
EasyJWeb快速上手及示例
EasyJWeb安装及配置
Java Web应用程序环境安装及配置
EasyJWeb是一个基于Java平台,与Java Servlet为核心基础的Java Web应用框架。因此,安装EasyJWeb的第一步是必须安装Java Web应用程序执行环境。主要包括下面3个部份:
- 安装及配置JDK
通过sun的官方网站可以取得JDK,网址:http://sun.java.com/ 通过网址,我们可以看到Java平台主要包括下面三个体系:J2SE、JavaEE(J2EE)以及J2ME。其中J2SE为基础Java平台,JavaEE(J2EE)为Java企业应用平台,J2ME为移动、无线、手持设备应用平台。我们的Java Web主要属于J2EE其中的一个部分,因此,在下载JDK的时候可以直接下载JavaEE SDK即可(地址:http://java.sun.com/j2ee/1.4/download.html#sdk)。当然,由于简单的Java Web并不会涉及太多的JavaEE内容,运行Java Web应用程序的Java基本类为Java Servlet,所以您也可以真正下载J2SE JDK,然后使用Java Web服务器自带的Servlet API即可开发Java Web应用程序。
下载完JDK并安装好JDK后,需要设置Java环境变量java_home。这样才能在计算机上运行Java应用程序。设置方法,以windows 2003平台为例,“我的电脑”右键->属性->高级->环境变量->新建->输入java_home及Java JDK的安装路径即可。如下图所示:
除了设置java_home环境变量以外,为了能正常运行java应用程序,还需要设置classpath、path等变量。以windows平台为例,在原有path变量后面直接加上“;%java_home%\bin”即可。classpath一般设置为一个表示当前目录的"."号即可。
- 安装Java Web服务器
为了运行Java Web应用程序,需要安装Java Web服务器,也称为Web容器。常用的开源Java Web服务器用Tomcat、Resin等,由于Java Web应用属于JavaEE应用中的一部分,因此所有的J2EE应用服务器都具有运行Java Web的功能。开源的JavaEE应用服务器比较有名的是Jboss(其中Web容器为tomcat)。商业的JavaEE应用服务器有BEA的Weblogic、IBM的Webspere等,国产的JavaEE服务器有金蝶的Apusic Application Serve、东方通的TongWeb等。
作为开源项目,我们推荐比较简单实用的开源Java Web应用服务器(——Tomcat),(下面介绍一下Tomcat) 服务器的安装及配置,其它的产品大同小异,看看安装手册即可。
首先到Tomcat的http://tomcat.apache.org/网站下载Tomcat服务器应用程序,地址:http://tomcat.apache.org/download-55.cgi,选择适合您的平版本,然后即可下载。
下载完后执行安装程序即可按步骤安装Tomcat。只要正常安装并配置了Java SDK。这里直接安装完后启动Tomcat服务器即可运行Web应用程序。默认的Tomcat Web应用服务使用的8080及8009端口,成功启动后在浏览器中输入http://localhost:8080/即可运行默认的Tomcat Web程序(即Tomcat的欢迎画面“猫咪”以及其它相关内容)。
- Tomcat系统目录简介
Tomcat安装成功后,一般有以下几个目录:
bin-可执行文件及命令程序目录。可以在命令行通过bin目录下的startup.bat及shutdown.bat两个批处理命令启动或停止Tomcat服务。
common-公共目录,开发人员注意lib目录中的相关jar包即可。其中servlet-api.jar、commons-dbcp-1.2.1.jar这两个包比较重要。第一个是Java Web应用程序基础java servlet的API,第二个是我们Web应用程序中经常用到的数据源访问包,包括数据库连接池等。我们在以后的开发中经常需要把这两个包引入到我们的工程文件中。
conf-配置文件目录。其中server.xml为应用服务器配置文件,可以通过他更改Web应用程序运行的一些基本属性及设置。如把8080端口改为80,则可通过http://localhost/ 直接访问Java Web应用程序。web.xml为web应用程序基本属性配置文件。
logs-为Tomcat系统日志目录,这是一个很重要的目录,为我们以后调试即查看应用程序运行状态很有帮助,必要时多观察该目录中相关文件的内容。
webapps-为存放Tomcat Web应用程序的目录,通过常我们直接把Java Web应用程序放到该目录中即可运行。但在一般的应用开发中,我们更习惯于把web应用程序放到自己的工作目录,通过改变server.xml文件中的配置信息可以把Java Web应用程序目录指定到其它目录。如:在server.xml文件中的<host>节点下加入下面的内容:
<Context docBase="e:\mydevelop\asp\WebRoot" path="">
即可把Tomcat Web应用程序主目录指向e:\mydevelop\easyjweb\webroot目录,即通过http://localhost:8080/ 访问时,将访问该目录中的应用程序。
work-该目录存放编译后的Web应用程序信息,当我们写JSP程序的时候,可以通过该目录下面的.java文件看到由JSP页面Tomcat处理编译后生成的标准java servlet代码(Java Web的基础是java servlet,这点请牢记!)。通过查看这些代码的内容,你可以更好的了解java servlet的运行机制。
EasyJWeb安装及配置
- 获取EasyJWeb SDK及源代码
EasyJWeb作为国内的一个Java开源项目,可以通过其开发团队的官方网站www.easyjf.com中下载。下载地址:http://www.easyjf.com/easyjweb/download.htm 其中,EasyJWebX_src.zip为源代码,EasyJWebX_lib.zip为编译后的jar包及运行EasyJWeb所需要的基本包。
- EasyJWeb文件组成
下载的文件主要包括
lib为运行EasyJWeb所需要的支持库!在使用EasyJWeb框架,必须把lib中的文件拷到Web-inf\lib目录里面。
src目录为EasyJWeb框架的全部源代码及示例代码。
doc目录为框架的简单文档。
web-inf 目录为示例程序的相关文档。包括标准EasyJWeb的web.xml、示例程序的页面模板文件等。
- 安装EasyJWeb
EasyJWeb只是一个Web应用程序MVC框架,其主要作为一般应用程序的基础框架,是以一个jar文件的形式伴随在用户的Java Web程序中执行,不需要进行专门的安装操作。 只需要把easyjweb.jar文件及附属文件(lib中的所有jar文件)拷到java web应用程序类路径中即可。我们一般是放到Web应用程序目录的Web-inf\lib目录下,也可以拷到Tomcat\Common\lib目录下,这样使得所有Tomcat Web应用程序都可以使用EasyJWeb。我们推荐放到web-inf\lib 目录下,这样可以使得你不用理会具体的Web应用服务器.
当开发EasyJWeb应用的时候,只要把EasyJWeb.jar包导入到工程中即可执行应用程序的调试及测试等工作.
- 配置web.xml
EasyJWeb是一个Web应用程序的核心骨架,为了通(过)在浏览器中访问EasyJWeb应用程序,需要配置应用程序中的web.xml文件,使得用户的Web应用程序知道何时使用EasyJWeb应用程序处理用户请求。
只有通过配置Web应用程序中的web.xml文件,才能使得EasyJWeb能正常的使用。EasyJWeb应用程序默认以.ejf为扩展名,在用户地址栏中输入与.ejf结尾 URL路径的时候,为了使得EasyJWeb能处理用户的请求,需要在web.xml文件中加如下的配置信息:
<servlet>
<servlet-name>easyjf</servlet-name>
<servlet-class>com.easyjf.web.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>easyjf</servlet-name>
<url-pattern>*.ejf</url-pattern>
</servlet-mapping>
由于Java是外国人发明的,其以unicode为默认编码,并且很多Java Web应用服务器也是泊来之品。因此我们在进行Java Web应用开发的时候经常会遇到中文字符处理的问题。比如显示在页码上的中文信息成乱码、或者保存到数据库的变成乱码等。因此,为了让Java Web应用能更好的处理中文,EasyJWeb默认情况下使用utf-8作为标准编码。这样需要通过在web.xml文件加入下面的设置,使得转码程序能正确运行,显示正确的文字字符。
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>com.easyjf.web.CharsetFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<servlet-name>easyjf</servlet-name>
</filter-mapping>
这样,一个基于EasyJWeb的Java Web应用程序的web.xml文件全部内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>com.easyjf.web.CharsetFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<servlet-name>easyjf</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>easyjf</servlet-name>
<servlet-class>com.easyjf.web.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>easyjf</servlet-name>
<url-pattern>*.ejf</url-pattern>
</servlet-mapping>
</web-app>
若web.xml文件配置成功,并把EasyJWeb.jar文件及相关jar文件拷到了web-inf\lib 目录下,启动Web用户服务器。在地址栏中随便输入http://localhost:8080/hello.ejf 类似以.ejf为扩展名的地址。则会得到一个如下的EasyJWeb错误反馈提示信息:
EasyJWeb框架错误:
没有找到处理模板的类:com.easyjweb.action.helloAction
详细请查询http://www.easyjf.com
java.lang.Exception: 没有找到处理模板的类:com.easyjweb.action.helloAction
虽然提示框架错误,但既然有了EasyJWeb字眼,这即表示您的EasyJWeb应用程序已经配置成功,下一步就是开始激动人心的EasyJWeb应用开发了。
若没能正确的配置Web.xml,当用户在地址栏中输入EasyJWeb应用程序扩展名的*.ejf时候,将会产生404的错误提示。
- easyjf-web.xml文件配置(可省)
默认情况下EasyJWeb提供零配置支持,用户可以不需要配置专门的easyjweb框架配置文件。只有当用户需要改变一些默认设置,才需要配置easyjf-web.xml文件。通过easyjf-web.xml文件,用户可以配置EasyJWeb的Form表单属性、表单验证、模块信息、页面及模板信息、程序状态、初始化程序等。关于easyjf-web.xml的配置,我们将在后面的章节中作专门的介绍。
EasyJWeb版的 Hello World!
下面,我们以一个老掉牙的示例"Hello World!"来开始EasyJWeb的应用程序,我们这里把"Hello World!"改成"喂,您好,我是EasyJWeb,请支持国产开源项目!",另外还将显示一个系统当前的时间。
- 第一步,建立java代码程序目录:
在您的源代码目录下,建一个如下的目录com\easyjweb\action。
- 第二步,写EasyJWeb Action helloAction.java:
在com\easyjweb\action目录下建一个名为helloAction.java的文件。内容如下:
package com.easyjweb.action;
import java.util.Date;
import com.easyjf.web.IWebAction;
import com.easyjf.web.Module;
import com.easyjf.web.Page;
import com.easyjf.web.WebForm;
public class helloAction implements IWebAction {
public Page execute(WebForm form, Module module) throws Exception {
form.addResult("msg","支持小明!我要给三连!");//设置VO对象msg的值。
form.addResult("time",new Date());//设置VO对象time的值为当前时间
return module.findPage(module.getDefaultPage());
}
}
写完后通过使用命令行的javac 或者编译工具编译helloAction.java。若对java的编译不熟悉,请先跳到后面的《EasyJWeb应用开发指南》章有关工具使用的介绍,或者直接执行EasyJWeb的示例程序中的helloAction.class拷到您的web-inf\classes\com\easyjweb\action目录下即可。
- 第三步,建立EasyJWeb显示页面模板文件
用记事本在/web-inf/easyjweb/建一个名为hello.html的文件,注意保存的时候请选择utf-8编码,helllo.html文件的全部内容如下:
<html>
<head>
<title>我的第一个EasyJWeb程序界面</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
$!msg<br>
当前时间:$!time
</body>
</html>
把文件保存为utf-8编码
- 最后一步:启动Tomcat并运行Hello EasyJWeb应用程序
重新启动Tomcat,然后在地址栏中输入http://localhost:8080/hello.ejf即可看到以下页面:
支持小明!我要给三连!
当前时间...
EasyJWeb应用程序简单分析
从上面的Hello应用可以看出,一个简单的EasyJWeb应用主要包括两个部分,一个(是)处理用户请求的action,另外一个是显示信息的页面模板。
整个EasyJWeb应用程序也主要是两大部分,一部分是全Java语言写的action及程序逻辑,包括应用程序具体的Model、Business等,这一部分主要是通过Java程序员使用Java开发工具开发及调试完成。另外一部分是用户显示界面的模板页面,这个模板在一般的Web应用中主要是基于超文本协议的html格式页面模板,也可以是xml或其它用户所需要格式的文本模板。在一般的Web应用中,输出显示界面模板的工作一般由美工及页面制作人员设计制作。
当然,Java的功能是很强大的,一个成熟、可靠的Java企业级应用系统由很多层结构组成,比如,系统构架层、数据库持久化层、商业逻辑层等。EasyJWeb提供的主要是Web显示层的解决方案,同时也提供与其它各层进行友好连接的解决方案。
下面,我们先看一个上面"hello"应用的JSP实现!hello.jsp源代码
<html>
<head>
<title>我的第一个EasyJWeb程序界面</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<%String msg="喂,您好,我是JSP!";
out.println(msg);
%>
<br>
当前时间:<%=new java.util.Date().toString();%>
</body>
</html>
没接触MVC Web或其它Web框架应用开发的朋友,看了上面的“helloworld应用”及分析,再跟我们以前接触的JSP程序比较,您也许觉得一个简单的应用经过那么多的步骤、有点复杂,甚至有点一头雾水,“还叫EasyJWeb呢,这Easy吗?”。研究软件工程的一个主题就是如何提高软件开发的效率,确保软件的稳定性、可维护性、可测试性以面向对象里的可复用性等。
别急!往下看!
EasyJWeb简单功能实例
一个简单的用户注册及登录实例
下面我们用EasyJWeb框架,写一个网站应用中都会涉及到的用户注册及登录验证程序。我们的示例很简单,就是实现用户的注册及登录验证。
(注意:以下WEB组件默认都放在ROOT根目录下,如果要放在用户自己的WEB APP下,比如/MySite目录下,则下列示例中的相对链接应从”/”目录转成”/MySite”!)
User类模型设计
- 用户类的(User)属性
主要包括用户名(userName)、用户密码(password)、电子邮件(email)、电话(tel)、出生日期(birthday)、简介(intro)等。
- User类的方法(操作)
除了我们经常熟悉的get、set方法以外,User类还应该包括把用户信息存入数据库、磁盘文件等数据特久设备,主要包括保存、修改、删除等操作,主要包括save()、update()、del()等。
代码设计及说明
- User.java
在这个演示中,我们的User.java中只是一个普通的Java bean,而且也没
把实现把User特久化到数据库系统中的代码。目的在于介绍EasyJWeb应用程序的流程及结构。User.java类的全部代码如下:
package com.easyjweb.business;
import java.util.Date;
public class User {
private String cid;
private String userName;
private String password;
private String email;
private String tel;
private Date birthday;
private String intro;
public boolean save()
{
if(userName!=null && (!userName.equals("")) && (password!=null) &&(!password.equals("")) && (email!=null) && (!email.equals(""))) return true;
else return false;
}
public boolean update()
{
if(userName!=null && (!userName.equals("")) && (password!=null) &&(!password.equals("")) && (email!=null) && (!email.equals(""))) return true;
else return false;
}
public boolean del()
{
if(userName!=null && (!userName.equals("")) && (password!=null) &&(!password.equals("")) && (email!=null) && (!email.equals("")))
return true;
else return false;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getIntro() {
return intro;
}
public void setIntro(String intro) {
this.intro = intro;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
UserManage.java
UserManage主要是关于我们这个示例程序中User对象的一些操作(方法),比如验证用户登录等。在这个例子中,我们的UserManage类只有一个静态方法,simpleLogin,用于简单判断用户登录信息是否正确。UserManage.java的全部内容如下:
package com.easyjweb.business;
public class UserManage {
public static User simpleLogin(String userName,String password)
{
User user=null;
if("easyjweb".equals(userName) && "easyjweb".equals(password))//一个最简单的逻辑
{
user=new User();
user.setCid("id1234567");
user.setUserName("easyjweb");
user.setPassword("easyjweb");
user.setEmail("easyjf@easyjf.com");
user.setTel("1234567");
user.setIntro("EasyJWeb简单登录用户测试!");
user.setBirthday(new Date());
}
return user;
}
}
通过上面给出的User.java及UserManage.java,我们基本实现了该示例程序中的Model层(即商业逻辑层)的代码
- userAction.java
userAction.java需要实现EasyJWeb框架的IWebAction接口,通过实现该接口,使得userAction与EasyJWeb框架核心共同扮演了该示例中的Controller角色,其是用户界面(View)与Model层的桥梁。在这个示例中我们通过userAction来接受用户的请求、并控制页面的跳转等。下面是userAction.java的全部源代码:
package com.easyjweb.action;
import com.easyjf.web.Globals;
import com.easyjf.web.IWebAction;
import com.easyjf.web.Module;
import com.easyjf.web.Page;
import com.easyjf.web.WebForm;
import com.easyjweb.business.User;
import com.easyjweb.business.UserManage;
public class userAction implements IWebAction {
public Page execute(WebForm form, Module module) throws Exception {
String command=(String)form.get("easyJWebCommand");
if("reg".equals(command))
{
return new Page("reg","/userReg.html",Globals.PAGE_TEMPLATE_TYPE);
}
else if("save".equals(command))
{
User user=(User)form.toPo(User.class);
if(user.save())
{
form.addResult("msg","用户注册成功!");
return new Page("login","/userLogin.html",Globals.PAGE_TEMPLATE_TYPE);
}
else
{
form.addResult("msg","用户注册失败,用户名、密码及Email不能为空!");
return new Page("reg","/userReg.html",Globals.PAGE_TEMPLATE_TYPE);
}
}
else if("login".equals(command))//提交登录信息
{
String userName=(String)form.get("userName");
String password=(String)form.get("password");
User user=UserManage.simpleLogin(userName,password);
if(user!=null)//登录成功
{
form.addResult("user",user);
return new Page("success","/userLogin.html(userLoginResult.html)",Globals.PAGE_TEMPLATE_TYPE);
}
else//用户名或者密码错误
{
form.addResult("msg","登录失败,用户名或者密码不正确!");
return new Page("login","/userLogin.html",Globals.PAGE_TEMPLATE_TYPE);
}
}
else
{
//进入登录
return new Page("login","/userLogin.html",Globals.PAGE_TEMPLATE_TYPE);
}
}
}
上面的代码中,我们通过Form中的easyJWebCommand(这是EasyJWeb框架中的默认命令,在以后的应用中我们经常用到)参数值,通过if else语句,根据不同的参数值作不同的处理并输出用户界面。
当easyJWebCommand为reg的时候,我们给用户输出userReg.html模板页面;主要代码如下:
return new Page("reg","/userReg.html",Globals.PAGE_TEMPLATE_TYPE);
当easyJWebCommand为save时,我们把Form中的数据包对象(VO)通过WebForm的toPo方法保存到到Model层的User类型PO对象中;主要代码如下:
User user=(User)form.toPo(User.class);
当easyJWebCommand为login时,我们根据用户输入的登录信息,通过Model层的UserManag根据用户的输入验证用户名及密码是否正确;主要代码如下:
String userName=(String)form.get("userName");
String password=(String)form.get("password");
User user=UserManage.simpleLogin(userName,password);
当easyJWebCommand为空或其它任何值的时候,我们给用户输出userLogin.html模板页面。主要代码如下:
return new Page("login","/userLogin.html",Globals.PAGE_TEMPLATE_TYPE);
- userAction的另外一个版本user1Action.java
嘿嘿,在上面userAction.java的代码中,if else语句是不是让您感到有点头痛,我们也头痛。在面向对象的软件编程中,我们应该尽可能减少使用if else语句,因为过多的if else语句会使得我们的程序很难测试,更容易出现问题。在上例中,由于userAction基本上只是作一些简单的流程控制,因此出现if else语句在所难免。那么,在EasyJWeb应用程序里,Controller层的流程控制能不能写得优雅一点,也就是不要这些if else也能实现比较直观的流转控制呢。既然问题出来了,我们就得想办法解决。为了解决类似这些if else语句问题及其它问题,我们设计了EasyJWeb的另外一个重要组成部分EasyJWeb Tools。通过EasyJWeb Tools的业务引擎基本模型,只要编程者按照我们的模型规范进行编程,即可解决这些头痛的问题。下面是通过继承EasyJWeb Tools中的抽象类AbstractCmdAction,去除了烦琐的if else语句的user1Action。user1Action.java的全部内容如下:
package com.easyjweb.action;
import com.easyjf.web.Globals;
import com.easyjf.web.Module;
import com.easyjf.web.Page;
import com.easyjf.web.WebForm;
import com.easyjf.web.tools.AbstractCmdAction;
import com.easyjweb.business.User;
import com.easyjweb.business.UserManage;
public class user1Action extends AbstractCmdAction {
//没有任何参数则显示登录框
public Page doInit(WebForm form, Module module) {
return doShowLogin(form,module);
}
//显示登录框
public Page doShowLogin(WebForm form, Module module) {
return new Page("login","/userLogin.html",Globals.PAGE_TEMPLATE_TYPE);
}
//执行登录验证
public Page doLogin(WebForm form, Module module) {
String userName=(String)form.get("userName");
String password=(String)form.get("password");
User user=UserManage.simpleLogin(userName,password);
if(user!=null)//登录成功
{
form.addResult("user",user);
return new Page("success","/userLogin.html(userLoginResult.html)",Globals.PAGE_TEMPLATE_TYPE);
}
else//用户名或者密码错误
{
form.addResult("msg","登录失败,用户名或者密码不正确!");
return new Page("login","/userLogin.html",Globals.PAGE_TEMPLATE_TYPE);
}
}
//显示用户注册模板页面
public Page doReg(WebForm form, Module module) {
return new Page("reg","/userReg.html",Globals.PAGE_TEMPLATE_TYPE);
}
//保存用户注册信息
public Page doSave(WebForm form, Module module) {
User user=(User)form.toPo(User.class);
if(user.save())
{
form.addResult("msg","用户注册成功!");
return new Page("login","/userLogin.html",Globals.PAGE_TEMPLATE_TYPE);
}
else
{
form.addResult("msg","用户注册失败,用户名、密码及Email不能为空!");
return new Page("reg","/userReg.html",Globals.PAGE_TEMPLATE_TYPE);
}
}
}
上面的代码对于那些写脚本语言(ASP、PHP、JSP等)多年,从不用专业Java开发工具而是用记事本或者EditPlus这样的编辑器写Java程序的牛人来说,是看不出什么大的差别,但在面向对象的java世界里,对于专业的Java开发人员来说,这样的改进具有非常重要的意义。首先,他便于我们做单元测试;第二,通过Java开发IDE,他的结构更加清晰,便于代码维护。
模板页面制作
- userLogin.html
登录模板页面是在一个简单的html表单的基础上,加了几句Velocity模板脚本。全部内容如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>EasyJWeb-用户登录</title>
</head>
<body>
<p>请输入用户名及密码:</p>
<form name="EditForm" method="post" action="">
<input type="hidden" name="easyJWebCommand" value="login">
<table width="100%" border="1">
<tr>
<td width="45%" align="right">用户名:</td>
<td><input name="userName" type="text" id="userName" value="$!userName">
<a href="/user.ejf?easyJWebCommand=reg">注册</a></td>
</tr>
<tr>
<td width="45%" align="right">密码:</td>
<td><input name="password" type="text" id="password" value="$!password"></td>
</tr>
<tr align="center">
<td colspan="2"><input type="submit" name="Submit" value="提交">
<input type="reset" name="Submit2" value="注册" onClick="location.replace('/user.ejf?easyJWebCommand=reg');"></td>
</tr>
</table>
</form>
<p> </p>
</body>
</html>
#if($!msg)
<script>
alert('$!msg');
</script>
#end
其中最后面的那句#if($!msg)是Velocity模板脚本,表示msg不为null或False时执行输出后面的内容,即提示信息。
- userLoginResult.html
userLoginResult.html是当用户登录成功的时,显示用户登录结果的页面。也是一个html模板文件,其中以$!开始的为Velocity模板脚本。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>EasyJWeb-登录结果</title>
</head>
<body>
<p><font color="red">恭喜您,您已经成功登录:</font><br>
<strong>用户名:</strong>$!user.userName<br>
<strong>用户密码:</strong>$!user.password<br>
<strong>电话:</strong>$!user.tel<br>
<strong>电子邮箱:</strong>$!user.email<br>
<strong>生日:</strong>$!user.birthday<br>
<br>
<strong>用户简介:</strong>$!user.intro</p>
<p> </p>
<p><a href="/user.ejf">返回</a><br>
</p>
<p> </p>
</body>
</html>
#if($(!)msg)
<script>
alert('$!msg');
</script>
#end
在上面的模板页面中,EasyJWeb会调用Velocity模板处理引擎,会根据VO中的对象user的值进行内容合成。我们在userAction中通过这句form.addResult("user",user);即可以把Model层的PO对象user传输到View层的VO当中。关于Velocity的介绍请看本教程的后面所附带的关于Velocity快速上手的教程。
- userReg.html
userReg.html是用户注册表单的html模板页面,担当我们的注册数据录入界面。内容如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>EasyJWeb-用户注册</title>
</head>
<body>
<div align="center">EasyJWeb用户注册演示
</div>
<form name="EditForm" method="post" action="(user1.ejf)">
<input type="hidden" name="easyJWebCommand" value="save">
<table width="300" border="1" align="center">
<tr>
<td width="45%" align="right"> 用户名</td>
<td><input name="userName" type="text" id="userName" value="$!userName">
<font color="red">*</font></td>
</tr>
<tr>
<td width="45%" align="right">密码</td>
<td><input name="password" type="text" id="password" value="$!password">
<font color="red">*</font></td>
</tr>
<tr>
<td width="45%" align="right">电子邮箱</td>
<td><input name="email" type="text" id="email" value="$!email">
<font color="red">*</font></td>
</tr>
<tr>
<td width="45%" align="right">电话</td>
<td><input name="tel" type="text" id="tel" value="$!tel"></td>
</tr>
<tr>
<td width="45%" align="right">生日</td>
<td><input name="birthday" type="text" id="birthday" value="$!birthday"></td>
</tr>
<tr>
<td width="45%" align="right">简介</td>
<td><textarea name="intro" id="intro">$!intro</textarea></td>
</tr>
<tr align="center">
<td colspan="2"><input type="submit" name="Submit2" value="提交">
<input type="reset" name="Submit" value="重置"></td>
</tr>
</table>
</form>
</body>
</html>
#if($(!)msg)
<script>
alert('$!msg');
</script>
#end
运行程序
通过上面的几个文件,我们就完成基于EasyJWeb框架的的注册及登录验证示例。编译上面的java程序,并确保上面的三个页面模板文件存放在web-inf\easyjweb目录上。重启Tomcat,即可通过在浏览器中输入类似下面的址执行上面的示例程序:
http://localhost:8080/user.ejf或者http://localhost:8080/user1.ejf
如果能正常访问及正常登录注册,即证明代码无误!