EasyJWeb学习笔记

一、    第一个项目(HelloWord)。
    第一步:快速创建项目。
1、    进入EasyJWeb-2.0\bin文件夹下,在命令行执行easyjweb。
2、    再在命令行执行easyjweb project d:\workspace\myapp –ejs –extjs。
3、    项目创建完成。再根据java源文件生成自己相应的应用,操作如下。
4、    切换到d:\workspace\myapp\bin目录,执行:
    easyjweb crud myapp.domain.Cat ../src/main/java/myapp/domain/Cat.java。
5、    把项目部署到Tomcat,然后通过http://localhost:8080/cat.ejf?cmd=index来查看效果。
    第二步:配置web.xml文件:
在web-inf目录下新建web.xml文件,输入一下内容:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <servlet>
        <servlet-name>easyjf</servlet-name>
        <servlet-class>com.easyjf.web.ActionServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>easyjf</servlet-name>
        <url-pattern>*.ejf</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>easyjf</servlet-name>
        <url-pattern>/ejf/*</url-pattern>
    </servlet-mapping>

    <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>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>
    第三步:写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","喂,您好,EasyJWeb1.0发布了,请支持国产开源项目!");//设置VO对象msg的值。
        form.addResult("time",new Date());//设置VO对象time的值为当前时间
        return new Page("hello", "/hello.html");
    }
}
    第四步:建立EasyJWeb显示页面模板文件
在/web-inf目录下新建目录views,并在这个目录下新建一个名为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>
最后一步:启动Tomcat并运行Hello EasyJWeb应用程序
在Tomcat6\conf目录下的server.xml添加一句:
<Context path="" docBase="E:\workspace\ejs\src\main\webapp"></Context>,
达到项目部署的效果,然后启动Tomcat,然后在地址栏中输入:
http://localhost:8080/hello.ejf 即可看到如下图所示的运行结果:
 
二、    Action实现IWebAction接口。
1、    IWebAction接口介绍。
    在这个Action实现IWebAction接口,IWebAction接口只有一个方法execute。这个方法有两个参数:WebForm和Module,返回一个Page对象。WebForm负责封装用于用户端显示的数据,程序对WebForm进行处理,并根据Module封装的该模块的配置信息返回一个Page对象(本例中使用的是手动创建一个Page对象,也可以通过使用module.findPage("")方法来获取一个配置好的Page对象),告诉框架返回哪个页面。在程序中用到了WebForm的addResult方法,这个方法主要是用来添加要在客户端显示的数据。
2、    实现IWebAction接口的简单例子.
    模板页:
<html>
    <head>
        <title>我的第一个EasyJWeb程序界面</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
        <form action="/hello.ejf">
            <input name="userName" type="text" value="$!userName" /><br>
            <input type="submit" value="提交" />
        </form>
        $!msg<br>
        当前时间:$!time
    </body>
</html>
Action:
public class HelloAction implements IWebAction {

    public Page execute(WebForm form, Module module) throws Exception {
        String userName = (String)form.get("userName");
        if(userName!=null&&!("".equals(userName))){
            form.addResult("msg", ""+userName+",您好,EasyJWeb1.0发布了,请支持国产开源项目!");
        }else{
            form.addResult("msg", "喂,您好,EasyJWeb1.0发布了,请支持国产开源项目!");
        }
        form.addResult("time", new Date());
        return new Page("hello", "/hello.html");
    }
}
3、    例子解析。
这里多了一句“String userName = (String)form.get("userName");”,这里的form.get("userName")用来获取客户端表单域里的userName文本框的值。现在我们来运行一下这个例子。在客户端输入http://localhost:8080/hello.ejf,界面如下:
 
我们输入“friend”,然后提交,会出现下面的界面:
 
4、    其他例子。
    public class HelloAction implements IWebAction {

    public Page execute(WebForm form, Module module) throws Exception {
        String userName = (String)form.get("userName");
        String password = (String)form.get("passsword");
        User user = new User();
        if(userName!=null&&!(user.getName().equals(userName))&&password!=null&&user.getPassword().equals(password)){
            form.addPo(user);
            form.addResult("msg", "登录成功!");
        }else{
            form.addResult("msg", "登录失败!");
        }
        form.addResult("time", new Date());
        return new Page("hello", "/hello.html");
    }
}
<html>
    <head>
        <title>我的第一个EasyJWeb程序界面</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
        <form action="/hello.ejf">
            <input name="userName" type="text" /><br>
            <input name="password" type="text" /><br>
            <input type="submit" value="提交" />
        </form>
        您的用户名为:$!name<br>
        您的密码为 :$!password<br>
        $!msg<br>
        当前时间:$!time
    </body>
</html>
在浏览器中输入http://localhost:8080/hello.ejf访问,界面如下:
 
在输入框中分别输入tianyi和123,提交,返回界面如下:
 
三、    EasyJWeb Tools。
AbstractCmdAction、AbstractPageCmdAction、AbstractCrudAction这三个类是EasyJWeb Tools中最重要的三个抽象Action类,这三个类又以AbstractCmdAction为基础类。
AbstractCmdAction类对Action命令进行封装,用于为提供命令式WebAction的写法,用户直接调用,可以减少书写繁锁的if语句。如果不使用AbstractCmdAction,那么就像struts一样每一个操作都要写一个Action,开发效率比较低。如果使用AbstractCmdAction,就可以在一个Action中执行多个操作,只需要在客户端传递一个名为easyJWebCommand的参数即可,AbstractCmdAction会根据这个参数来选择执行哪个方法。假设现在客户端传递来的参数值是save,那么将会执行doSave()方法,其它的以此类推。
AbstractPageCmdAction类继承自AbstractCmdAction类。AbstractPageCmdAction对返回的Page对象进行了处理,用来支持更加灵活的参数调用。使用这个类可以实现零配置,并且不用显示的返回Page对象,它会根据类名、命令参数值和配置好的view路径来自动创建一个Page对象。
AbstractCrudAction继承自AbstractPageCmdAction类,AbstractCrudAction类中对一些常用的、通用性比较强的业务逻辑方法如简单的添删改查操作进行了封装。如doEdit()方法,这个方法通常用来指向一个编辑页面,通用性很高,因此做了封装,类似的还有很多,这里不一一列举。下面我们将分别举例对这三个类的用法进行简要讲解。
这是一个数据字典的添删改查应用,这里我们对只对字典目录进行添删改查操作。我们将分别使用这三个类来实现这个应用,比较这几个类的不同作用。现在我们来看看使用AbstractCmdAction类时的Action,以下是Action的全部代码:
public class SystemDictionaryAction extends AbstractCmdAction {
    
    private ISystemDictionaryService service;

    public void setService(ISystemDictionaryService service) {
        this.service = service;
    }
    
    public Page doList(WebForm form, Module module){
        QueryObject query = new QueryObject();
        form.toPo(query);
        IPageList pageList = service.getSystemDictionaryBy(query);
        CommUtil.saveIPageList2WebForm(pageList, form);
        return new Page("list", "/news/dictionaryList.html");
    }
    
    public Page doAdd(WebForm form, Module module){
        return new Page("edit", "/news/dictionaryEdit.html");
    }
    
    public Page doEdit(WebForm form, Module module){
        Long id = Long.parseLong(CommUtil.null2String(form.get("id")));
        form.addPo(this.service.getSystemDictionary(id));
        return new Page("edit", "/news/dictionaryEdit.html");
    }
    
    public Page doSave(WebForm form, Module module){
        SystemDictionary dic = form.toPo(SystemDictionary.class);
        this.service.addSystemDictionary(dic);
        return this.doList(form, module);
    }
    
    public Page doDel(WebForm form, Module module){
        Long id = Long.parseLong(CommUtil.null2String(form.get("id")));
        this.service.delSystemDictionary(id);
        return this.doList(form, module);
    }
    
    public Page doUpdate(WebForm form, Module module){
        Long id = Long.parseLong(CommUtil.null2String(form.get("id")));
        SystemDictionary dic = this.service.getSystemDictionary(id);
        form.toPo(dic);
        this.service.updateSystemDictionary(id, dic);
        return this.doList(form, module);
    }
}
AbstractCmdAction实现了IWebAction,在它的execute方法里边根据easyJWebCommand的值来判断应该执行哪个方法。因此继承自这个类的Action就不需要再实现execute方法,只需要编写与操作相对应的doXxxx()方法。以doSave()方法为例,当easyJWebCommand参数值为save时就会执行doSave()方法。在这个Action中,代码已经比较简洁了,也没有了if else语句,并且在一个Action里实现了关于SystemDictionary 这个对象的添删改查操作。但是我们的目标是要越来越简单,越来越快捷,我们并不满足于此,接下来我们看看AbstractPageCmdAction类的使用。
下面同样是数据字典的添删改查操作,不同的是这个Action继承自AbstractPageCmdAction类,我们先看看这个Action的代码:
public class SystemDictionaryAction extends AbstractPageCmdAction {
    private ISystemDictionaryService service;

    public void setService(ISystemDictionaryService service) {
        this.service = service;
    }
    
    public void doList(WebForm form, Module module){
        QueryObject query = new QueryObject();
        form.toPo(query);
        IPageList pageList = service.getSystemDictionaryBy(query);
        CommUtil.saveIPageList2WebForm(pageList, form);
    }
    
    public void doEdit(WebForm form, Module module){
        Long id = Long.parseLong(CommUtil.null2String(form.get("id")));
        form.addPo(this.service.getSystemDictionary(id));
    }
    
    public void doSave(WebForm form, Module module){
        SystemDictionary dic = form.toPo(SystemDictionary.class);
        this.service.addSystemDictionary(dic);
    }
    
    public void doDel(WebForm form, Module module){
        Long id = Long.parseLong(CommUtil.null2String(form.get("id")));
        this.service.delSystemDictionary(id);
    }
    
    public void doUpdate(WebForm form, Module module){
        Long id = Long.parseLong(CommUtil.null2String(form.get("id")));
        SystemDictionary dic = this.service.getSystemDictionary(id);
        form.toPo(dic);
        this.service.updateSystemDictionary(id, dic);
    }
}
AbstractPageCmdAction 类继承自AbstractCmdAction,这个类里边重写了execute方法,它先调用父类的execute方法,然后对父类的execute方法返回的值进行判断,如果为空并且easyJWebCommand参数值不为空,就会根据调用的Action类的名字和easyJWebCommand参数的值来创建一个Page对象返回给框架。
这个Action与前一个Action相比,可以看出来,所有的doXxxx()方法都是void的了,不再return一个Page对象了。这就是AbstractPageCmdAction的作用,它会根据你调用的Action类的名字和客户端提交进来的命令参数的值自动创建一个Page对象,从而实现零配置,开发人员可以专注于业务逻辑,不用再关心流程控制。这样一来开发是不是又变得简单了一些、快捷了一些?但是我们的目标是不断前进的,我们不会满足现状,我们要越来越快。
好的,激动人心的时刻到来了,前面我们讲解的两个类虽然使开发已经很方便了,但是我们可以看到,Action中还充斥着大量的form.get()、form.addResult()等方法,并且很多方法中都有着这样一些相同的代码,那么我们是否能够再封装一下呢?现在我们来看看AbstractCrudAction 类的使用。还是同样的应用:
public class SystemDictionaryAction extends AbstractCrudAction {
    private ISystemDictionaryService service;

    public void setService(ISystemDictionaryService service) {
        this.service = service;
    }

    @SuppressWarnings("unchecked")
    protected Class entityClass() {
        return SystemDictionary.class;
    }

    protected Object findEntityObject(Serializable id) {
        return service.getSystemDictionary((Long) id);
    }

    protected IPageList queryEntity(IQueryObject queryObject) {
        return service.getSystemDictionaryBy(queryObject);
    }

    protected void removeEntity(Serializable id) {
        service.delSystemDictionary((Long) id);
    }

    protected void saveEntity(Object object) {
        service.addSystemDictionary((SystemDictionary) object);
    }

    protected void updateEntity(Object object) {
        service.updateSystemDictionary(((SystemDictionary) object).getId(),(SystemDictionary) object);
    }
}
我们可以看到Action的代码少了很多,业务逻辑的处理完全封装了,每个操作都只需要一条调用语句即可。现在我们来分析一下代码。首先,Action里多出了一个方法entityClass(),这个方法是AbstractCrudAction 里申明的一个抽象方法,它在没个Action里边的实现都不一样,分别返回各自要操作的类,提供给AbstractCrudAction 里实现的一些业务逻辑方法使用。
接下来,我们会发现方法的命名也和以前不一样了,这里没有了doXxxx()方法,取而代之的是xxxxEntity()方法。这些方法都是在父类AbstractCrudAction 里申明的抽象方法,在每个不同的Action里实现,AbstractCrudAction 里的业务逻辑方法调用这些不同的实现分别执行不同的操作,巧妙的对通用性比较强的代码进行了封装,使开发变得更加简单快捷。假设命令参数值为save,在这里将不再执行doSave()方法,而是执行saveEntity()方法。这里并不是去掉了doXxxx()方法,而是将这些方法放到了AbstractCrudAction类里边,这里的saveEntyti()方法会被父类的doSave()方法调用,因此实际上还是调用了doSave()方法,只不过这个方法不需要开发人员自己来申明和实现了。
四、    EasyJWeb MVC框架的核心部件。
MVC:两种,一种基于请求转发模型,Struts、Spring MVC 、EasyJWeb。另一种基于组件时间模型,JSF等。
a、    ActionServlet
b、    URL映射
c、    View技术
d、    前后台交互
e、    Web.xml
    主控Servlet:com.easyjf.web.ActionServlet
    字符过滤器:com.easyjf.web.CharsetFilter
f、注解:@Action标签来指定一个Action,标签中的path属性指定映射路径
g、读取客户端传输数据:
    form.get方法,获取字符串、字符串数组及文件等类型数据。
    form.toPo方法,把视图中的对象封装到指定的对象中。
h、把数据传输给视图
    form.addResult(name,value),把指定value的对象以指定的名称传输给前端。
    addPo(object),把指定对象分解后传输到视图中。
i、在EasyJWeb的Action中,要求控制器返回一个Page对象,这个对象表示视图。EasyJWeb默认的视图为Velocity模板引擎。位置存放在/WEB-INF/views/目录下。
J、Velocity模板语法。velocity新手教程.doc
五、    高级特性及EJS构架。
1、    模块化编程:AbstractCmdAction
    概念:模块化编程的思想是把相关连的功能封装到一个模块中,从而避免系统中出现过多的Action,用户的Action继承AbstractCmdAction后,即可实现模块化编程。
    示例:
    public class ClientAction extends AbstractCmdAction {
        public Page doIndex(WebForm f, Module m) {
            return new Page("client/index.html");
        }
        public Page doList(WebForm form) {
            ....
            return new Page("client/list.html");
        }
        public Page doRemove(WebForm form) {
        ...
            return go("list");
        }
    }
    访问上面的Action,直接使用下面的url:
    client.ejf?cmd=index
    client.ejf?cmd=list
    client.ejf?cmd=remove
2、    惯例编程:AbstractPageCmdAction
    概念:EasyJWeb框架中很多地方都充分考虑了惯例代替配置的原则(约定代替配置),比如针对一个action,视图文件应该在什么位置,这些都可以按一定的规则来进行。
    示例:
    public class ClientAction extends AbstractPageCmdAction {
        public Page doIndex(WebForm f, Module m) {
            return page("index");
        }
        public Page doList(WebForm form) {
            ....
            return page("list");
        }
        public Page doRemove(WebForm form) {
        ...
            return go("list");
        }
    }
    访问上面的Action,直接使用下面的url:client.ejf?cmd=index,并且会自动查找WEB-INF/views/client/index.html文件来作为视图client.ejf?cmd=list,会自动查找WEB-INF/views/client/list.html文件来作为视图client.ejf?cmd=remove
3、    EasyJWeb中IOC体验。
    使用xml文件实现依赖注入;
    <beans>
    <bean name="userService" class="myapp.service.impl.UserServiceImpl"  scope="singleton">
    <property name="dao" ref="userDao"/>
    </bean>
    </beans>
    使用@Bean、@Action注解标签现依赖注入
    @Bean
    public class UserServiceImpl implements UserService {
    }
    public class UserAction extends AbstractPageCmdAction {
        @Inject
        private UserService service;
    }
4、    与Spring集成。
    要集成Spring,直接在easyjf-web.xml中配置如下的SpringBean及EasyJWeb内部容器即可。当然,也可以直接引入com/easyjf/core/spring-container.xml文件即可。
    <beans>
    <bean name="springContainer"
            class="org.springframework.web.context.support.XmlWebApplicationContext">
            <property name="configLocations">
                <list>
                    <value>WEB-INF/classes/application.xml</value>
                </list>
            </property>
    </bean>
    <bean name="innerSpringContainer"
            class="com.easyjf.container.impl.SpringContainer">
            <property name="factory" ref="springContainer" />
        </bean>
    </beans>
5、    泛型DAO支持。
    EasyJWeb提供了泛型DAO实现,DAO接口只需要继承GenericDAO即可。
public interface IClientDAO extends GenericDAO<Client> {

}
对应该DAO的配置文件:
 <bean id="clientDao" parent="abstractDao">
    <property name="proxyInterfaces">
      <value>com.lanyotech.pps.dao.IClientDAO</value>
    </property>  
    <property name="target">
      <bean parent="baseDAO">
        <constructor-arg>
          <value>com.lanyotech.pps.domain.Client</value>
        </constructor-arg>
      </bean>
    </property>
  </bean>  
6、    POLoad详解。
    对于关联属性,前端只传入一个ID值,此时可以通过在属性上加一个POLoad标签,使得WebForm的toPo方法可以加载关联属性。
示例:
public class Employee implements IJsonObject{
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;

    @ManyToOne(fetch=FetchType.LAZY)
    @POLoad
    private Department dept;
    ...
}
当在Action中调用toPo的时候,会把dept这个值转换成后台对应的持久化对象。
7、    分页引擎IPageList简介。
    public interface IPageList extends Serializable {
    // 得到查询结果集
    public List getResult();
    //返回总页数
    public int getPages();
      //返回查询总记录数
    public int getRowCount();
    //返回有效的当前页
    public int getCurrentPage();
    //返回下一页
    public int getNextPage();
    //返回上一页
    public int getPreviousPage();
}
8、    QueryObject简介。
    QueryObject类用来表示具有分页功能的查询对象。
可以使用addQuery方法来添加各种查询组合条件。
示例:
public Page doList(WebForm form) {
        QueryObject qo = form.toPo(QueryObject.class);
        String searckKey=CommUtil.null2String(form.get("searchKey"));
        if(!"".equals(searckKey)){
            qo.addQuery("(obj.sn like ? or obj.name like ?)",new Object[]{"%"+searckKey+"%","%"+searckKey+"%"});
        }
        IPageList pageList = service.getProductBy(qo);
        form.jsonResult(pageList);
        return Page.JSONPage;
    }
    QueryObject类还有一些分页查询的设置。
    qo.setCurrentPage(currentPage);//当前页设置。
    qo.setLimit(limit);//查询条数限制。
    qo.setOrderBy(orderBy);//排序查询,orderBy为排序的依据。例如:ID
    qo.setOrderType(orderType);//desc为倒序排序,acs我为升序排序。
    qo.setPageSize(pageSize);//查询的页数。
    qo.setStart(start);//查询的开始条
9、Ajax,ExtJS框架支持。
    AjaxUtil,简化普通Ajax应用。
    JSON生成器,把后台Java对象转变成。
    Web远程脚本调用。
10、    代码生成。
    easyjweb project命令用于创建项目。
    Easyjweb crud命令用于创建CRUD模块。
    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyJWeb是基于java技术,用于企业级Java Web应用程序快速开发的MVC框架。框架设计构思来源于国内众多项目实践,框架的设计及实现借鉴当前主要流行的开源Web框架,如Rails、Struts、JSF、Tapestry等,吸取其优点及精华,是一个完全由来自的中国开源爱好者开发,文档及注释全部为中文的开源框架。 EasyJWeb由主要由四个部分组成:   1、核心MVC。EasyJWeb的核心是一个基于模板技术实现的MVC框架;他能让我们用非常简洁的代码写基于Java的Web应用。    2、容器及通用业务逻辑封装。作为一个旨在让基于Java的Web应用程序开发变得直接、快速、简易的框架,EasyJWeb提供了一个IoC容器,并对企业级应用中的一些通用业务逻辑(如分页、查询、DAO等)进行了抽象及封装,提供了一套可以直接操作、应用企业资源的组件及API。    3、代码生成引擎及工具。仅仅依靠一个灵活、简易的MVC核心引擎还不能最大限度的提高开发速度,因此EasyJWeb还提供了一个灵活、易用的代码生成引擎及工具,通过使用代码生成引擎,可以快速完成基于JavaEE平台的企业级应用程序生成。如数据库添删改查(CRUD)代码生成、自动页面模版生成、自动配置文件管理等。    4、EasyJWeb插件体系,项目中的各种实用功能的扩展,可以灵活地通过基于插件的形式安装到EasyJWeb中,提供各种针对性的功能。如ajax实用插件、代码生成插件等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值