论坛首页 Java企业应用论坛

原创Full-Stack框架VIWO开源首发(附源码、示例、教程)

浏览 16889 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-10  

有人说不要重新发明轮子,我说你不能总用别人的轮子。也许VIWO是个木头轮子,也许VIWO不是很结实,经不起大的颠簸,也许VIWO微不足道,你甚至不屑一顾,但是我想:Struts也好Spring也好,iBatis也好,起初无非就是个冲动、想法、无奈一点一点发展起来。

今天我把我写的一些小程序打成包,命名叫做VIWO开源发布在这里,说不上为中国的开源界做什么贡献,就是想抛砖引玉,能让更多的高手把你们写的东西共享出来,让大家一起学习共同进步,而不是泛泛而谈新新技术,求新求变固然无可厚非,只是“勿在浮沙筑高台”。或者你有兴趣拿这VIWO的源代码,添加些新功能,修改些BUG,,亦或者给几块板砖,我都会感激不尽。

因为传输速度,VIWO发布包,源码,示例放在Google Code上面了(JavaEye的访问速度可能和网段有关,我用大连网通访问速度奇慢,文章发好几遍才能发全)。

下载页面:http://code.google.com/p/viwo/downloads/list
直接下载地址:
完整示例:viwo-example.rar
发布程序:viwo-0.4.3.jar
源码:viwo-0.4.3-src.jar

 

   发表时间:2007-07-10  
下面简单讲解一下如何使用VIWO框架(可能VIWO的级别还够不上框架)。

拷贝viwox.x.jar到lib目录下,VIWO框架依赖于Apache的几个子项目,拷贝相应的jar包到lib目录。依赖类库列表:
commons-beanutils.jar
commons-digester.jar
log4j-1.2.13.jar
commons-logging.jar
commons-collections.jar
commons-dbcp.jar
commons-pool.jar
使用数据库时需要相应的数据库驱动。

VIWO框架主要由三个模块组成,分别实现了MVC,IoC,O/R Maping,都是比较简单的实现,如果你对这种简单的实现有什么意见、建议、批评、高见请留言。

MVC部分配置使用指南:
简单来说配置方式类似于Struts,示例如下:
web.xml中做如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <display-name>viwoweb</display-name>
  <servlet>
    <servlet-name>viwo</servlet-name>
    <servlet-class>org.viwo.web.acion.ViwoServlet</servlet-class>
   <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/viwo-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>viwo</servlet-name>
    <url-pattern>*.viwo</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
  	<welcome-file>
     user/index.viwo
  	</welcome-file>
  </welcome-file-list>
</web-app>


新建/WEB-INF/viwo-config.xml ,格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<viwo-config>
	<action path="user" type="com.viwo.test.web.UserAction"/>
	<forward name="adduser" path="jsp/adduser.jsp"/>
</viwo-config>


正如你所见,配置只有两种属性,action用来配置处理请求Action的全类名和URL路径之间的对应关系,forward用来与返回的页面相对应。这里需要说明的是你完全可以空着什么也不配置,而程序照样可以执行,只是需要遵循一些规则(这也勉强叫做规则重于配置吧)。
完成后新建类com.viwo.test.web.UserAction,如下:
package com.viwo.test.web;
import java.sql.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.viwo.bean.factory.BeanFactory;
import com.viwo.test.domain.User;
import com.viwo.test.service.UserService;
public class UserAction 
{
	public String search(HttpServletRequest request,HttpServletResponse response) throws Exception
	{
		UserService userService = (UserService)BeanFactory.getBean("userservice");
		List userList = userService.searchUsers();
		request.setAttribute("userList", userList);
		return "searchResult";
	}
	public String add(HttpServletRequest request,HttpServletResponse response) throws Exception
	{
		User user = new User();
		user.setUsername(request.getParameter("username"));
		user.setPassword(request.getParameter("password"));
		user.setRegisterdate(new Date(new java.util.Date().getTime()));
		user.setUserlevel(Integer.parseInt(request.getParameter("userlevel")));
		UserService userService = (UserService)BeanFactory.getBean("userservice");
		userService.addUser(user);
		response.sendRedirect(request.getContextPath()+"/user/search.viwo");
		return null;
	}
	public String index(HttpServletRequest request,HttpServletResponse response) throws Exception
	{
		return "adduser";
	}
}


上面的示例是VIWO框架中的Action,其中部分的代码用到下面将要讲到的IoC模块,看了下面内容也可以回来看看这个例子。
对于UserAction类不需要继承自任何类,就是一个普通的Java类,com.viwo.test.web.UserAction的方法只需传递HttpServletRequest HttpServletResponse这两个参数,并返回一个字符串类型值(这个返回值对应着viwo-config.xml中的forward属性)即可,部署到Web服务器中后,在浏览器中用如下格式即可调用:
http://127.0.0.1:7001/YourWebApp/user/index.viwo
即可访问com.viwo.test.web.UserAction类中的index方法。

如果viwo-config.xml中既不配置action也不配置forward属性,URL中的路径就是你的类名(不能有包名)和JSP文件的文件名组成(不包括后缀,必须在根目录下)。
0 请登录后投票
   发表时间:2007-07-10  
IoC容器模块使用指南:
VIWO框架实现一个简单的IoC容器,可以满足基本的POJO管理。
要使用VIWO的IoC容器,只需要配置viwo-bean.xml(存放于类路径根目录下),如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="userservice" type="com.viwo.test.service.UserServiceImpl" >
		<ref name="sqlMapClient" value="sqlMapClient"/>
	</bean>
	
	<bean id="sqlMapClient" type="org.viwo.sqlmap.client.SqlMapClient" factory="getInstance"/>

	<bean id="viwo_data_source" type="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
		<property name="url" value="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=winestore"/>
		<property name="username" value="sa"/>
		<property name="password" value=""/>
	</bean>
</beans>

这个配置文件演示了IoC模块的各种配置方式。
配置完成后实现相应的接口和类,即可做如下调用:
UserService userService = (UserService)BeanFactory.getBean("userservice");
下面简单讲解一下viwo-bean.xml的配置参数
最外层一对<beans>,
里面由n个<bean>组成,bean有id(调用时传递的参数),type(POJO的类型),factory(工厂方法,必须是静态工厂方法),transaction(声明式的事务支持)属性。其中transaction还没有实现完成,暂时不能使用。

<bean>里层有<property>和<ref>两个子元素,分别表示POJO的一般属性和引用属性,这两个子元素都具有name和value属性。name为属性名,value为属性值或者引用属性bean的id。
0 请登录后投票
   发表时间:2007-07-10  
O/R Mappinp模块使用指南:
VIWO框架实现的O/R Mapping类似于iBatis中的SqlMap,要使用此模块配置viwo-sqlmap.xml(同viwo-bean.xml一样存放于类路径根目录下),如下:
<?xml version="1.0" encoding="UTF-8"?>
<sqlmap-config>
	<select id="searchUsers" type="com.viwo.test.domain.User" param="com.viwo.test.domain.User">
		<sql>
		select 
		username,
		password,
		registerdate,
		userlevel
		from viwouser 
		</sql>
	</select>
	<execute id="addUser" param="com.viwo.test.domain.User">
		<sql>
		insert into viwouser (username,password,registerdate,userlevel) 
		values (#username#,#password#,getdate(),#userlevel#) 
		</sql>
	</execute>	
</sqlmap-config>

配置完SQL语句后即可如下调用,执行SQL查询和更新:
SqlMapClient sqlMapConfig = SqlMapClient.getInstance();
或者
SqlMapClient sqlMapConfig
= SqlMapClient.getInstance(“viwo-sqlmap.xml”);
下面的getInstance可以调用任何配置文件,所以viwo-sqlmap.xml这个文件的命名可以随意起,什么的方法去找默认的SqlMap配置文件viwo-sqlmap.xml。

上列中分别演示了带参数select语句,不带参数select语句,update语句,insert语句的配置,下面讲解一下配置参数:
最外层一对<sqlmap-config>,
<sqlmap-config>里层包括n个<select>和<execute>,
<select>表示有返回值的查询语句
<execute>表示没有返回值的insert、update等语句。
<select>包括三个参数id(调用时传递的参数),type(返回结果或结果集中元素类型),param(调用查询或更新语句时接受的参数类型)。
<execute>包括两个参数id(调用时传递的参数),param(调用查询或更新语句时接受的参数类型)。
<select>和<execute>内部 由<sql>标识了相应的SQL语句,此处的SQL语句和普通SQL语句一致,只是多了一些#somevalue#元素用来表示执行时动态写入的值,这些值会被传入的对象的属性动态替换。


因为是操作数据库所以对数据源的配置必不可少,VIWO中数据源的配置有两种方法
方法一:类路径中添加文件:viwo-database.properties,如下:
driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
url=jdbc:microsoft:sqlserver://192.168.0.77:1433;DatabaseName=db
user=sa
password=sa

方法二:通过IoC配置文件viwo-bean.xml配置数据源
在上面列出的viwo-bean.xml文件中其实已经给出了数据源配置:
<bean id="viwo_data_source" type="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver"/>
		<property name="url" value="jdbc:microsoft:sqlserver://192.168.0.77:1433;DatabaseName=db"/>
		<property name="username" value="sa"/>
		<property name="password" value="sa"/>
</bean>

VIWO默认情况下优先选择第二中配置,如果没有找到viwo-bean.xml中数据源的配置,会自动选择第一种配置。
0 请登录后投票
   发表时间:2007-07-12  
引用
羨慕, 我也正想自己弄一個。

开源的目的就是让大家共同拥有
0 请登录后投票
   发表时间:2007-07-12  
挺好,不过没什么特色阿。。。

View 层:实在是看不出特色。。。spring 抽象了视图的概念,这是
          它的特色之一。而你的没有。
Model 层:同样没特色。。。

Controller 层:同样没特色。。。

那么你这个框架出现的目的到底是什么呢???
0 请登录后投票
   发表时间:2007-07-12  
建议楼主吧自己的特色亮出来。
如果没有了自己的亮点,那就没有研究的价值了,毕竟这块轮子太多。大家都习惯了以前的轮子。
0 请登录后投票
   发表时间:2007-07-12  
yananay 写道
挺好,不过没什么特色阿。。。

View 层:实在是看不出特色。。。spring 抽象了视图的概念,这是
          它的特色之一。而你的没有。
Model 层:同样没特色。。。

Controller 层:同样没特色。。。

那么你这个框架出现的目的到底是什么呢???

抽象个视图其实是很简单的,这个我开始也考虑了,最终还是不做这个抽象。因为我认为没有必要,request,和response足够应付绝大部分的情况了,如果做抽象,那么我们写的Action中必然会依赖更多的VIWO框架中的类,也就是说Action中的方法传递的参数就不是request和response,而是xxxxForm,返回值就不是String而是yyyyView,这不又成了Struts和SpringMVC了吗?方法必须传递request和response这个我倒是想再简化一下,因为有写时候传递过来的request和response并没有用到,下一个版本会加进来,让参数个数可以是0个、1个、2个。
如果非要说什么特色,我觉得VIWO的特色就是简单、明了、清晰、实用、全面。可能仁者见仁,智者见智,我认为Form这个东西在很多时候都是没有必要的,所以我简化之用request直接替代,还有taglib,实在想用直接JSTL就可以,而且VIWO也支持velocity,你可以很容易的在VIWO中使用它(其实VIWO中也并没有写多少支持它代码)。
在配置文件上我尽量简化,基本上达到一看就明白的地步,绝对没有Struts、Spring、iBatis那样复杂的配置选项。
总之,我是按照我认为的“简单、明了、清晰、实用、全面”的原则来做VIWO,欢迎大家继续发表看法、建议、意见、批评。
0 请登录后投票
   发表时间:2007-07-12  
jindw 写道
建议楼主吧自己的特色亮出来。
如果没有了自己的亮点,那就没有研究的价值了,毕竟这块轮子太多。大家都习惯了以前的轮子。

一个熟悉Java的人学会并正确使用Struts、Spring、iBatis可能需要3个月(在时间上请不要评论),但是如果学会并正确使用VIWO可能只用3天。
一个熟悉Java的人看完Struts、Spring、iBatis的代码可能要用1年,但是如果看VIWO的源代码可能只用1周。
这或许也叫特色吧!
VIWO只是个开始,肯定还有很多不完善的地方,当然也没法和Struts、Spring、iBatis相提并论,但是我们不能没有我们的想法,Struts、Spring、iBatis也不一定就尽善尽美,也不一定就符合我们每个人的需求。VIWO就是我的一些想法,还是那句话抛砖引玉吧,希望大家更多的把大家的想法发表出来。没有碰撞,怎么能有火花?
0 请登录后投票
   发表时间:2007-07-12  
你熟悉VIWO,所以说只要3天,其实会使用S+S+B,有一个参考的例子,最多也只要3天,出了问题网上有大堆的答案,需要解决方案网上多的是,你的特色在哪?
闪光点???
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics