`
zhouxuanyi
  • 浏览: 9223 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

xyz,pojo的mvc框架

阅读更多
         http://sourceforge.net/projects/jxyzsourceforge的框架源码
  在我用过的web 开发框架中,在我享受他们给我带来的便利时,却不得不忍受着他们给我带来的折磨。Struts的FormBean,jsf的不成熟的jsp标签绑定,tapestry的陡峭的学习曲线,等等等等,等用了webwork,似乎一切都结束了,他的简单的结构,出色的aop,ognl支持,和web环境的脱离,似乎意味着我们结束了开发噩梦,然而,不,事实并非如此。当webwork讥笑struts必须继承org.apache.struts.action.Action类的同时,他自己却必须实现com.opensymphony.xwork.Action接口,在pojo肆虐的当今,这无疑是五十步笑百步,还有,webwork对struts FormBean的改造,是使用ModelDriven拦截器来实现的,然而,ModelDriven只支持一个java对象,如果你的Action中想支持一个以上的Model,对不起,你自己做去吧。同时,Action的结构混乱,传入和传出的对象,属性无法区分,这一点,SpringMvc做的不错,SpringMvc也似乎是理论上最完美的mvc,可惜,SpringMvc对web框架的耦合和对jstl的偏爱以及过于灵活导致的复杂性让我和他不能走得过近。而且,这些所谓j2ee的框架一概带有java推崇的不厌其烦的xml配置文件,看看红的发紫的Rails On Ruby吧,那是怎样的利用命名规范来达到减少配置文件的,来降低复杂性的,是怎样利用代码生成来减少编程工作量的。而且,这些框架可以说,一个一个比赛着高大全,webwork,800多个类,spring,2000多个类,tapestry,甚至还带有自己的ioc容器,和jboss seam的100多个类的框架相比,无疑是过于复杂了,牛刀杀鸡了。当然,这些并不意味着我是一个ro r或者seam迷,毕竟,ror在易用性上站了优势,却在组件化上处于劣势,seam的jsf和ejb也不是一个轻量级的选择。
   所以,我这自己开发的这个mvc框架有以下几个特点。
1. Pojo。任何一个java类都可以做Action(logic),为了改造现在常用的ssh,tsh,wsh框架成sh,支持spring bean做Action(logic)
2. 0配置,根据命名规范来查找Action类和view
3. 和web环境松耦合,从理论上讲可以用在swing里
4. 支持tdd开发,框架本身就是以tdd开发方式开发
5. 代码少,一般mvc需要5个类,xyz只要3个,还可以通过GenericDAO,GenericLogic来减少重复代码
6. 对开发者来说,一切实现都可以自己定制,由于hivemind支持迭代开发


我们来写一个java logic类:
package test.logic;

import xyz.frame.annotations.Out;
import xyz.frame.annotations.Read;

public class InLogic {
@Read
@Out
private String in;

public void in(){
System.out.println("in--"+in);
}

}
再写一个测试类:
package test;

import java.util.HashMap;
import java.util.Map;

import xyz.frame.core.LogicContext;
import xyz.frame.core.LogicProxy;

public class InTest extends MainTest {
   public void testIn(){
   System.out.println("=================simple Out Test begin=========");
       try {
Map params = new HashMap();
   //自己添加东西
  params.put("first",new String[]{"first"});
    Map extraContext = new HashMap();

    extraContext.put(LogicContext.PARAMETERS, params);
  
   //由于logic config可能需要合并,所以个namespace可能需要修改
    LogicProxy proxy =
    logicProxyFacory.createLogicProxy(
            "/test/logic",
            "FirstLogic",
            "testIn",
            extraContext);

    proxy.setExecuteResult(true);
    assertEquals(proxy.execute(), "ok");
System.out.println("----------------------------------------------------------------------");
System.out.println("----------------------------------------------------------------------");
Map inparams = new HashMap();
   //自己添加东西
  inparams.put("in",new String[]{"in"});
    Map inextraContext = new HashMap();

    inextraContext.put(LogicContext.PARAMETERS, inparams);
  
   //由于logic config可能需要合并,所以个namespace可能需要修改
    LogicProxy inproxy =
    logicProxyFacory.createLogicProxy(
            "/test/logic",
            "InLogic",
            "in",
            inextraContext);

    inproxy.setExecuteResult(true);
    assertEquals(inproxy.execute(), "ok");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
   }
}

通过web调用的url如下:http://.../test/logic/InLogic!in.xyz?in=myin
结果的View可以是jsp,velocity,freemark,fastm,excel,jasper,chart等,如果使用jsp做缺省的view,结果就把in用in做id放到request里面了,当然需要在conf/xyz.hivemind.xml里面保证
   <service-point id="NullResultMaker" interface="ResultMaker"> 
    <invoke-factory>
        <construct class="impl.NullResultMaker">
           <set-service property="nullResult" service-id="NullResult"/>
        </construct>
    </invoke-factory>
  </service-point>
 
  <service-point id="NullResult" interface="Result"> 
    <invoke-factory>
        <construct class="xyz.frame.web.view.DispatcherResult">
        </construct>
    </invoke-factory>
  </service-point>

Jsp就是/test/logic/InLogic!in.ok.jsp
In==<%=(String)request.getAttribute(“in“)%>

上面方法不返回值,如果返回值,想把返回值放到request里可面,可以。
package test.logic;

import xyz.frame.annotations.Out;

public class Return {
   @Out(key="return")
   public Integer showTest(){
   System.out.println("test==");
   return new Integer(100);
   }
}

如果想通过参数来做:
package test.logic;

import java.util.Date;

import test.ognl.property.User;
import xyz.frame.annotations.Out;
import xyz.frame.annotations.Read;

public class ModelParaMethod {

public void showTest(
@Read User user,
@Read(key="test") @Out(key="test")int test,
@Read(key="integer") Integer integer,
@Read(key="date") @Out(key="date")Date date,
@Read(key="double") double dl) {
System.out.println("read user== " + user);
System.out.println("read test== " + test);
System.out.println("read integer== " + integer);
System.out.println("read date== " + date);
System.out.println("read dl== " + dl);
}

}

如果想使用改造ssh,wsh,tsh框架,去掉struts,webwork,tapestry这些,就要支持spring bean做logic,或者说,支持接口做logic
接口:
package test.logic;

public interface IDemo {
public void showTest();
}
实现:
package test.logic.impl;

import test.logic.IDemo;
import test.ognl.property.User;
import xyz.frame.annotations.Out;
import xyz.frame.annotations.Read;

public class DemoImpl implements IDemo {
@Read
@Out
public String test="测试";

@Read(create=true)
@Out
    private User user=new User();

public void showTest() {
System.out.println("Spring read test== " + test);
System.out.println("Spring read user== " + user);
}

public String toString(){
return super.toString()+":test=="+test+",you==";
}
}
Spring bean配置:
<bean id="IDemo" class="test.logic.impl.DemoImpl"/>

测试:
package test;

import java.util.HashMap;
import java.util.Map;

import xyz.frame.core.LogicContext;
import xyz.frame.core.LogicProxy;

public class SpringSimpleTest extends MainTest {

  
   public void testSipleOut(){
   System.out.println("=================simple Out Test begin=========");
       try {
Map params = new HashMap();
   //自己添加东西
   params.put("test",new String[]{"test 总喜欢咱 我要输出!"});
   params.put("you",new String[]{"哈立德撒罗杰斯防空洞!"});
    Map extraContext = new HashMap();

    extraContext.put(LogicContext.PARAMETERS, params);
  
   //由于action config可能需要合并,所以个namespace可能需要修改
    LogicProxy proxy =
    logicProxyFacory.createLogicProxy(
            "/test/logic",
            "Spring:IDemo",
            "showTest",
            extraContext);

    proxy.setExecuteResult(true);
    assertEquals(proxy.execute(), "ok");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
   }
}

使用hibernate扩展包支持GenericDAO,GenericLogic,减少代码量
Domain文件:
在、test/domain/目录利用hibernate工具生成Test.java&Test.hbm.xml
Dao接口:
package test.dao;

import test.domain.Test;
import xyz.ext.dao.IGenericDAO;

public interface ITestDAO extends IGenericDAO<Test,Integer>{

}
Dao实现:
package test.dao.impl;

import test.dao.ITestDAO;
import test.domain.Test;
import xyz.ext.dao.impl.GenericDAOHibernateImpl;

public class TestDAOImpl extends GenericDAOHibernateImpl<Test,Integer> implements ITestDAO{

}
Logic类:
package test.logic;

import test.dao.ITestDAO;
import test.domain.Test;

import xyz.ext.dao.IGenericDAO;
import xyz.ext.logic.GenericLogic;
import xyz.frame.annotations.Read;

public class TestLogic extends GenericLogic<Test,Integer>{
@Read(object="Spring:testDAO")
private ITestDAO dao;

@Override
public IGenericDAO<Test, Integer> getIGenericDAO() {
return dao;
}

}

Testcase:
package test;

import java.util.HashMap;
import java.util.Map;

import xyz.frame.core.LogicContext;
import xyz.frame.core.LogicProxy;

public class ModelTest extends MainTest {
   public void testModel(){
   System.out.println("=================simple Out Test begin=========");
       try {
Map params = new HashMap();
   //自己添加东西
  params.put("name",new String[]{"userName"});
  params.put("id",new String[]{"2"});
    Map extraContext = new HashMap();

    extraContext.put(LogicContext.PARAMETERS, params);
  
   //由于logic config可能需要合并,所以个namespace可能需要修改
    LogicProxy proxy =
    logicProxyFacory.createLogicProxy(
            "/test/logic",
            "TestLogic",
            "doInsert",
            extraContext);

    proxy.setExecuteResult(true);
    assertEquals(proxy.execute(), "ok");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
   }
}

运行testcase,Test表里面加了一条数据
[/url][url]
分享到:
评论
8 楼 leyen 2006-12-27  
很佩服楼主,不过我觉得即使使用annotaition也要尽量避免繁琐,annotation应该尽可能的简化
7 楼 ellie 2006-10-19  
学习
6 楼 yuliming5219 2006-10-18  
 
女儿像你哦!以后会经常光顾!也要向你学习啊。
5 楼 zhouxuanyi 2006-10-18  
框架在http://sourceforge.net/projects/jxyz/,大家可以下下来给些指点
4 楼 zhouxuanyi 2006-10-18  
谢谢大家的鼓励,我的这些想法都已经实现,事实上这篇文章就是xyz框架的使用指南。
另外,我在支持拦截器或者aop上有困惑:
如果用java注解做成:
@before(class="a.b.CInterceptor")
@after(class="d.e.FInterceptor")
public class A{
    @before(class="g.h.IInterceptor")
    @after(class="j.k.LInterceptor")
    public void aM(){
    }
}
是可以,但是却不是声明式的编程,如果做成webwork那样的,申明编程,又需要大量的xml文件,和我的0配置不一致,请大家提自己的意见,我好改进,现在想用的话,需要使用spring的aop,这样,必须使用spring bean做logic了,也不是太好!
3 楼 linlin83820 2006-10-18  
努力!加油!向你学习
2 楼 linlin83820 2006-10-18  
努力!加油!像你学习
1 楼 carpenter.g 2006-10-18  
你的想法很有见地,pf pf  有机会向您请教。

相关推荐

    基于MVC框架的java web开发

    **基于MVC框架的Java Web开发** 在Java Web开发领域,Model-View-Controller(MVC)模式是一种广泛采用的设计模式,它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller),以实现业务...

    servlet简单实现的MVC框架

    在IT行业中,MVC(Model-View-Controller)框架是一种广泛应用的设计模式,它将应用程序的业务逻辑、数据处理和用户界面分离,使得开发更加模块化和易于维护。Servlet是Java Web开发中的一个重要组件,用于接收和...

    java mvc框架任务书

    【Java MVC框架任务书】是一份详细的实验指导文档,旨在帮助学习者深入理解和掌握Java MVC框架的应用。MVC(Model-View-Controller)模式是软件工程中广泛采用的一种设计模式,尤其在Web开发中,它将业务逻辑、数据...

    我的mvc小框架

    "我的mvc小框架"是一个基于Java的轻量级MVC(Model-View-Controller)框架,作者通过这个项目分享了自己的编程实践和理解。在Web开发中,MVC模式是一种广泛采用的设计模式,它将应用程序分为三个主要部分:模型、...

    talent mvc(最简约的Java MVC框架)

    在talent MVC中,模型通常由Java POJO(Plain Old Java Object)对象组成,它们代表了应用中的实体或业务对象。模型对象与数据库或其他数据源交互,更新或获取数据。 3. **View**:视图层负责数据的展示。talent ...

    手写spring mvc框架

    在Spring MVC中,我们通常创建JavaBeans或POJO(Plain Old Java Object)作为模型对象,它们持有数据并提供处理业务逻辑的方法。 2. **视图(View)**:视图负责展示数据。Spring MVC支持多种视图技术,如JSP、...

    自定义MVC框架-MyMVC Framework

    *户完全以POJO的方式开发MVC Web应用;同时并不限制用户POJO以及业务逻辑的选择, *框架对表单使用用户自定义类进行了封装,用户需要强制类型转换为具体类型拆出数据。 *整体上MyMVC 博文链接:...

    Spring MVC框架实例

    **Spring MVC 框架实例详解** Spring MVC 是 Spring 框架的重要组成部分,它是一个用于构建 Web 应用程序的 Model-View-Controller (MVC) 模型的实现。在基于 Spring 2.5 的项目中,XML 配置是主要的配置方式,相比...

    AspMvc框架 v1.1

    AspMvc是一个快速、简单的面向对象的轻量级Asp开发框架,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。 借鉴了国内外很多优秀的(Java Ssh/Net NetMvc3.5 ThinkPhp)框架和模式,使用面向对象的开发结构和MVC...

    MVC框架struts学习笔记

    Struts 是一个基于 Model-View-Controller (MVC) 设计模式的 Java Web 开发框架,主要用于构建可维护性高、结构清晰的Web应用程序。在Struts框架中,MVC模式帮助开发者将业务逻辑、数据处理和用户界面解耦,提高了...

    MVC框架优缺点

    "MVC框架优缺点" MVC(Model-View-Controller)是一种程序开发设计模式,它实现了显示模块与功能模块的分离,提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、...

    基于spring的微pojo框架[ORACLE数据库]

    标题中的“基于Spring的微POJO框架[ORACLE数据库]”指的是使用Spring框架构建轻量级的、基于Plain Old Java Object(POJO)的微服务架构,并且与Oracle数据库进行集成的应用开发。在这个主题中,我们将深入探讨...

    对比分析Struts和Spring两种MVC框架.pdf

    3. **模型(Model)**:Spring MVC 中的模型组件通常是 POJO(Plain Old Java Object),无需继承特定的框架类,这增强了代码的可测试性和可维护性。 4. **视图(View)**:Spring MVC 允许开发者选择多种视图技术...

    使用Spring MVC框架 实现的云音乐网站.zip

    【Spring MVC 框架详解】 Spring MVC 是 Spring 框架的一个模块,它为构建基于 Java 的 Web 应用程序提供了一个模型-视图-控制器(MVC)架构。这个框架简化了从前端到后端的数据传递和控制流程,提高了开发效率和...

    MVC框架中英文对照外文翻译文献.docx

    在 Spring MVC 中,模型通常由 POJO(Plain Old Java Object)对象表示,这些对象可以与数据库或其他数据存储进行交互。 2. **视图(View)**:视图是用户看到和与之交互的界面。在 Web 应用中,视图通常是 HTML、...

    MVC实例MVC实例

    MVC(Model-View-Controller)是一种广泛应用的软件设计模式,尤其在Web开发领域中,如Java平台上的Spring MVC框架。这个模式将应用程序的业务逻辑、用户界面和控制逻辑分离,提高了代码的可维护性和可扩展性。 **1...

    POJO In action 代码

    5. **MVC(Model-View-Controller)架构**:POJOs在Web开发中的应用,如Spring MVC框架中,作为模型层的实现。 6. **RESTful服务**:可能有使用POJOs构建REST API的案例,展示了如何利用JAX-RS(Java API for ...

    ssm框架自动生成pojo,mapper

    在SSM框架中,POJO对象对应数据库中的表,每个属性对应表中的列。创建POJO对象时,我们需要根据数据库表结构手动定义这些属性及其访问方法。 接着,Mapper接口是MyBatis的核心组件,它定义了SQL操作的方法。例如,...

    mojave:一个基于注释的基于POJO的Java Web MVC框架,支持Guice的DI

    Mojave MVC Web框架======================== Mojave(发音为Mo-hav-ee)是一个注释驱动的基于POJO的Java Web应用程序开发框架。 它借鉴了Spring Web MVC和EJB 3.1的思想,并合并了Guice。 它试图: 通过提供IoC功能...

Global site tag (gtag.js) - Google Analytics