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]
分享到:
相关推荐
**基于MVC框架的Java Web开发** 在Java Web开发领域,Model-View-Controller(MVC)模式是一种广泛采用的设计模式,它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller),以实现业务...
在IT行业中,MVC(Model-View-Controller)框架是一种广泛应用的设计模式,它将应用程序的业务逻辑、数据处理和用户界面分离,使得开发更加模块化和易于维护。Servlet是Java Web开发中的一个重要组件,用于接收和...
【Java MVC框架任务书】是一份详细的实验指导文档,旨在帮助学习者深入理解和掌握Java MVC框架的应用。MVC(Model-View-Controller)模式是软件工程中广泛采用的一种设计模式,尤其在Web开发中,它将业务逻辑、数据...
"我的mvc小框架"是一个基于Java的轻量级MVC(Model-View-Controller)框架,作者通过这个项目分享了自己的编程实践和理解。在Web开发中,MVC模式是一种广泛采用的设计模式,它将应用程序分为三个主要部分:模型、...
在talent MVC中,模型通常由Java POJO(Plain Old Java Object)对象组成,它们代表了应用中的实体或业务对象。模型对象与数据库或其他数据源交互,更新或获取数据。 3. **View**:视图层负责数据的展示。talent ...
在Spring MVC中,我们通常创建JavaBeans或POJO(Plain Old Java Object)作为模型对象,它们持有数据并提供处理业务逻辑的方法。 2. **视图(View)**:视图负责展示数据。Spring MVC支持多种视图技术,如JSP、...
*户完全以POJO的方式开发MVC Web应用;同时并不限制用户POJO以及业务逻辑的选择, *框架对表单使用用户自定义类进行了封装,用户需要强制类型转换为具体类型拆出数据。 *整体上MyMVC 博文链接:...
**Spring MVC 框架实例详解** Spring MVC 是 Spring 框架的重要组成部分,它是一个用于构建 Web 应用程序的 Model-View-Controller (MVC) 模型的实现。在基于 Spring 2.5 的项目中,XML 配置是主要的配置方式,相比...
AspMvc是一个快速、简单的面向对象的轻量级Asp开发框架,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。 借鉴了国内外很多优秀的(Java Ssh/Net NetMvc3.5 ThinkPhp)框架和模式,使用面向对象的开发结构和MVC...
Struts 是一个基于 Model-View-Controller (MVC) 设计模式的 Java Web 开发框架,主要用于构建可维护性高、结构清晰的Web应用程序。在Struts框架中,MVC模式帮助开发者将业务逻辑、数据处理和用户界面解耦,提高了...
"MVC框架优缺点" MVC(Model-View-Controller)是一种程序开发设计模式,它实现了显示模块与功能模块的分离,提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、...
标题中的“基于Spring的微POJO框架[ORACLE数据库]”指的是使用Spring框架构建轻量级的、基于Plain Old Java Object(POJO)的微服务架构,并且与Oracle数据库进行集成的应用开发。在这个主题中,我们将深入探讨...
3. **模型(Model)**:Spring MVC 中的模型组件通常是 POJO(Plain Old Java Object),无需继承特定的框架类,这增强了代码的可测试性和可维护性。 4. **视图(View)**:Spring MVC 允许开发者选择多种视图技术...
【Spring MVC 框架详解】 Spring MVC 是 Spring 框架的一个模块,它为构建基于 Java 的 Web 应用程序提供了一个模型-视图-控制器(MVC)架构。这个框架简化了从前端到后端的数据传递和控制流程,提高了开发效率和...
在 Spring MVC 中,模型通常由 POJO(Plain Old Java Object)对象表示,这些对象可以与数据库或其他数据存储进行交互。 2. **视图(View)**:视图是用户看到和与之交互的界面。在 Web 应用中,视图通常是 HTML、...
MVC(Model-View-Controller)是一种广泛应用的软件设计模式,尤其在Web开发领域中,如Java平台上的Spring MVC框架。这个模式将应用程序的业务逻辑、用户界面和控制逻辑分离,提高了代码的可维护性和可扩展性。 **1...
5. **MVC(Model-View-Controller)架构**:POJOs在Web开发中的应用,如Spring MVC框架中,作为模型层的实现。 6. **RESTful服务**:可能有使用POJOs构建REST API的案例,展示了如何利用JAX-RS(Java API for ...
在SSM框架中,POJO对象对应数据库中的表,每个属性对应表中的列。创建POJO对象时,我们需要根据数据库表结构手动定义这些属性及其访问方法。 接着,Mapper接口是MyBatis的核心组件,它定义了SQL操作的方法。例如,...
Mojave MVC Web框架======================== Mojave(发音为Mo-hav-ee)是一个注释驱动的基于POJO的Java Web应用程序开发框架。 它借鉴了Spring Web MVC和EJB 3.1的思想,并合并了Guice。 它试图: 通过提供IoC功能...