J2EE剑侠行

直觉我的J2EE应用生涯,打造我心中的一把利剑。

常用链接

统计

技术链接

最新评论

2006年7月21日 #

找到一个好用的UML建模工具-argouml

 很不错的一个UML建模工具-argouml
     argouml下载地址
     我一眼就看上他的原因是:生成的用例和包图可能直接生成JAVA代码,而且准备无误,这正是我要找的。
     我想:以后使用一些框架的话,可能由PD生成一些实体,然后Hibernate生成pojo等,加入到argouml,然后根据一个框架的特性生成一些包 和类.就等于详细设计了吧.应该来说是比详细设计还实用的东西.总比哪些WORD文档好吧.还有让人看不懂的概要设计.
    我想从技术出发,这个是一条比较适用的路子.下班了.我明天将会汇报一下我使用的情况和一些范例.
    反过来又想像.这好象是一个组合的脚手架.好象ROR的零星操作步骤.应该学习.ROR毕竟是一个新生事物,JAVAEYE的推广也需要一个时间.如果像我这样的打工,混口饭吃的人还是专心的研究J2EE好一点.否则明天就没有饭吃了.

    呵呵.我的文章可被JAVAEYE收回到水贴里了,可能自己的能力不如人吧,好好学习,天天向上,如果看客有什么好的工具和软件生产思路,可以共同交流。

posted @ 2007-06-20 13:29 @家军 阅读(1835) | 评论 (1)编辑 收藏

ROR:习惯约定优于配置(学习ROR的第一天)

今天学习了一下ROR,有一些学习经验东西要与大家分享。
给ROR加一个座右铭--------狭窄心肠的日本产物。
首先,不要一个一个的下载Ruby,Rails,建议使用一键安装,下载地址如下:
InstantRails-1.3-win
版本说明:ruby 1.8.4 (2005-12-24) [i386-mswin32]
其次,下载一个目前为止比较好的一个ROR的实践工具:RadRails
下载地址:radrails-0.7.1-win32
接下来,设置一下Radrails的环境
1)、Windows/perferences/Ruby/Installed Inteperters/ ->add ruby所在路径:比如D:\InstantRails\ruby\bin\ruby.exe
2)、Windows/perferences/Rails/Configuration ->Rails path:比如D:\InstantRails\ruby\bin\rails
->Rake path:比如D:\InstantRails\ruby\bin\rake 绝不是bat/cmd
->mogrel path:比如D:\InstantRails\ruby\bin\mongrel_rails绝不是bat/cmd

有了如上的配置后,就只需要和在JAVA当中ANT一样使用。(成功用过APPFUSE的人就不用害怕了)

看看日本人写的第一步:
1),在RadRails中创建一个Rails Project,怎么样会出来一堆的东东。
2),进入DOS命令吧,后面的工序都是这样的,好象买了海尔的洗衣机,第一次是送货、第二次是用户回访,第三次是.....
进入到你的项目处,运行ruby script\generate controller MyTest,
则得到的服务如下:
exists app/controllers/
exists app/helpers/
create app/views/my_test
exists test/functional/
create app/controllers/my_test_controller.rb
create test/functional/my_test_controller_test.rb
create app/helpers/my_test_helper.rb
修改一下my_test_controller.rb

代码
       class  MyTestController  <  ApplicationController
      def index
        render_text 
" Hello world!! "
      end 
      end

在浏览器里输入:http://127.0.0.1:3000/my_test/
会出现 Hello world!!字样,
不过有意思的是你可以输入:http://127.0.0.1:3000/My_test/
http://127.0.0.1:3000/My_Test/
http://127.0.0.1:3000/my_Test/
都可以得到这个值,可能没有JAVA哪样严格吧。
3)、还有对数据库的操作,要配置一个database.yml(好象Log4j的东东)
4)、创建数据库表的时候只能够使用复数起名,比如User就不行,只能够起Users
下面只要执行几个命令就可以使用增删改查了。
如下是我的操作,下班了,就不多写了,例子能够说明一切问题:
代码
 1 E:\RORProject\demo>ruby script/generate model user
 2 
 3       exists  app/models/
 4 
 5       exists  test/unit/
 6 
 7       exists  test/fixtures/
 8 
 9       create  app/models/user.rb
10 
11       create  test/unit/user_test.rb
12 
13       create  test/fixtures/users.yml
14 
15       exists  db/migrate
16 
17       create  db/migrate/001_create_users.rb
18 
19 E:\RORProject\demo>ruby script/generate controller user
20 exists app/controllers/
21 exists app/helpers/
22 create app/views/user
23 exists test/functional/
24 create app/controllers/user_controller.rb
25 create test/functional/user_controller_test.rb
26 create app/helpers/user_helper.rb
27 

修改user_controller.rb如下:
代码
1    class UserController < ApplicationController
2        scaffold:user
3    end

最后你的浏览器当中输入:http://127.0.0.1:3000/user/list,就包括了对数据库表的四个操作.当然你也可以自己定义四个操作的任意一种.
最后总结:
ROR可能是敏捷开发的一个好实践,但是我觉得他完成复杂应用进不会有大做为,而至于这一点还需要再做探究。不过现阶段最好的需求就是能够给用户快速的写出一个不完整的DEMO,这一点为以后打单取得主动。

posted @ 2006-09-29 11:47 @家军 阅读(1987) | 评论 (1)编辑 收藏

三个JAVA文件完成你的MVC应用

     摘要: 只需要你三个JAVA类和两个配置文件,就可以完成你的MVC应用,我们就做一个示例吧。本文以一个登录为例。第一个JAVA文件Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/**======================================...  阅读全文

posted @ 2006-09-29 11:43 @家军 阅读(1890) | 评论 (3)编辑 收藏

struts标签,请你走开(系列一)

在项目开发的很多时候,用户需要更友好,更容易理解的操作界面,而为了能够达到这种表现界面,struts标签显得力不从心,本人经过几个项目的开发当中 逐渐的摈弃了struts标签,而由JSTL来做为JSP页面的表达者。
struts标签之死穴一 不支持嵌套
看看这种常见的需求吧。一个用户隶属于一个职能部门,比如
项目要求 职能部门有五个(乱写的)
1、企划部
2、网络集成部
3、行政部
4、营销部
5、产品部
项目要求 一共有二个员工
1、张三 隶属于行政部
2、李四 隶属于营销部
而你想把张三和李四都列表出来,显示为如下:
姓名 部门名称
张三 行政部
李四 营销部
而且还需要用户的列表链接到修改页面当中(假如只修改部门)应该如何做呢。
在使用struts标签是很难做到的,除非你非常不在意内存的使用(乱写技术性代码)
看看JSTL是如何做的吧。
从STRUTS的ACTION当中加载两个对象

List GetAllDept  =  UserDAO.GetAllDept(); // 取得所有部门

List GetALLUser 
=  UserDAO.GetAllUser(); // 取得所有用户

request.setAttribute(
" View_Dept " , GetAllDept);

request.setAttribute(
" View_User " , GetALLUser);
在页面当中加入对JSTL的引用
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

然后写代码如下:
<table>

<tr>

<td align="center">

<href="User.do?method=EditUser&UserId=<c:out value='${View_User.UserId}'/>">

<c:out value="${View_User.UserName}" /> </a>

</td>

<td align="center">

<c:forEach items="${View_Dept}" var="View_Dept">

<c:if test="${View_User.Dept.DeptId==View_Dept.DeptId}">

<c:out value="${View_Dept.DeptName}" />

</c:if>                            

</c:forEach>

</td>

</tr>

</table>

其中View_User.Dept.DeptId表示USER表与DEPT表的一个关系(外键)
你就可以看到所显示的列表了。

还有如果在修改用户时,则也与上面的差不多,首先在ACTION当中加入:

String ModifyUserId = request.getParameter("GroupUserId");

if (ModifyUserId == null && ModifyUserId.equals("")) {

//这是出错处理

request.setAttribute(
"UserMsg""User.ValidateUser");

return mapping.findForward("Fail");

}

DynaValidatorForm UserActionForm 
= (DynaValidatorForm) form;

User user 
= UserDAO.GetUser(ModifyUserId);        

List GetAllDept 
= UserDAO.GetAllDept();//取得所有部门

request.setAttribute(
"View_Dept", GetAllDept);

UserActionForm.set(
"User", User);
然后页面当中显示如下(部门为LISTBOX),例子当中只显示部门
<html:select property="DeptAsString">            

<c:forEach items="${View_Dept}" var="View_Dept">        

<c:choose>                        

<c:when test="${User.Dept.DeptId==View_Dept.DeptId}">

<option    value="<c:out value='${View_Dept.DeptId}' />"selected>    

<c:out value="${View_Dept.DeptName}" />            

</option>                            

</c:when>                            

<c:otherwise>                        

<option value="<c:out value='${View_Dept.DeptId}' />">        

<c:out value="${View_Dept.DeptName}" /></option>        

</c:otherwise>                        

</c:choose>

</c:forEach>

</html:select>

可以看到HTML的SELECT有一个DeptAsString,你可以在FORM当中指定一个STRING的FORM属性。
这样用户的要求就可以完成了。
本次只说明方法,而代码没有经过测试。希望大家多多观注我的BLOG,下一次将臭骂ACTIONFROM不支持的DATE类型及解决方法。

posted @ 2006-09-25 16:36 @家军 阅读(443) | 评论 (0)编辑 收藏

用二维数组管理好你零乱的状态、分类和其它常用选项

     摘要: 在大家的编码过程当中,有没有遇到过这么一种情况,很多零乱的状态、分类和其它常用选项常常是定义死了。但是没有一个完整的东东来约束他,在每个模块当中使用相关的信息时,往往重新COPY一次,或者COPY过来修改一次。如果多人协作的话,务必会让代码变的零乱、不好管理等。
本次主要是把一些静态的分类、状态或者其它常用选项使用二维数组管理起来。如果你是一个使用JSTL或者STRUTS做前台表现的话,你就更应该好好关注了.......  阅读全文

posted @ 2006-09-05 13:31 @家军 阅读(1267) | 评论 (0)编辑 收藏

如果失去工作会怎么办?

    在工作当中,遇到了一个不明智的上级,我是刘罗锅,但是领导不一定是乾隆。设计当中的争执成为私下做对的理由,从此,我感觉到今年的财运不佳。
    因为工作当中的争执,而让领导失去了面子??我在郁闷当中,为什么呀!好事反而成了坏事。
    领导的报复心理,让我失去了绩效,所以我感觉到财运不佳。我很想跳出这个魔鬼圈,是不是能够改善一下自己的经济收入呢?正在想离开这个公司......
    发现自己的软肋:UML整体设计(最好有代码生成)和XP敏捷开发。近期需要加强这两方面的学习,可以以权限设计为UML做为训练(生成代码??),以CRM->VtigerCRM为业务主线,做一个XP开发,不过VtigerCRM的表设计真是很糟糕,Indiea人呀。
    今年的公司很乱,是一个很糟糕的管理层,可能我以后离开这个公司后才感觉到领导者的“聪明才智”吧!完全在内耗当中生存。我已经被领导国边缘化,我会在灰色的区域彷徨很长的时间,或许公司另有高人吧,我已经被领导逐渐忽视,自己发光的时间也只有一年,好象知了一样。
    “人贵有自知之明”,如果领导没有重视,只是为了发挥自己的最低性能的话,我完全有很多的时间来学习知识,我很庆幸自己和开源代码有很大的信心,我将在以后的时间里,为开源界展示自己的能力。
    首先要把自己学习到的知识透明化,其次我会在开源中小型的CRM软件当中做出自己应有的贡献。

posted @ 2006-07-24 11:37 @家军 阅读(459) | 评论 (1)编辑 收藏

struts表单 vs JSTL表现之多条件查询示例

    struts表单主要是利用actionform来取得JSP页面所有的request的,所有的Struts标签无非在取得request当中的所有INPUT,并赋值回标签值的,同理,JSTL能够在JSP表单当中轻易的表现要输出的结果。
    如果你是高手,你就知道这个标题有误,是的,struts表单与JSTL表现没有可比性,但是如果我们要在实现一个多条件的查询页面时,这个比较就比较有效了。
    我不妨比较一下利用struts表单的查询实现 和 利用JSTL做为表现而实现的查询功能有什么不同,让读者寻其方便。
    示例说明:
    用户表-USER
    username  用户名称
    loginid   登录ID
    sex       性别
    一、利用struts表单的查询实现
        实现步骤:
        创建多条件的序列化对象(java)->在struts.config当中申明actionform->Action当中实现->输出结果
       
    /** The value of the simple userName property. */
    
private java.lang.String userName;
    
/** The value of the simple loginId property. */
    
private java.lang.String loginId;
    
/** The value of the simple sex property. */
    
private java.lang.String sex;
    
/**
     * Return the value of the USER_NAME column.
     * 
@return java.lang.String
     
*/
    
public java.lang.String getUserName()
    {
        
return this.userName;
    }

    
/**
     * Set the value of the USER_NAME column.
     * 
@param userName
     
*/
    
public void setUserName(java.lang.String userName)
    {
        
this.userName = userName;
    
/**
     * Return the value of the LOGIN_ID column.
     * 
@return java.lang.String
     
*/
    
public java.lang.String getLoginId()
    {
        
return this.loginId;
    }

    
/**
     * Set the value of the LOGIN_ID column.
     * 
@param loginId
     
*/
    
public void setLoginId(java.lang.String loginId)
    {
        
this.loginId = loginId;
    }
    
/**
     * Return the value of the sex column.
     * 
@return java.lang.String
     
*/
    
public java.lang.String getSex()
    {
        
return this.sex;
    }

    
/**
     * Set the value of the sex column.
     * 
@param loginId
     
*/
    
public void setSex(java.lang.String sex)
    {
        
this.sex = sex;
    }
<!-- struts_fonfig -->
       
<form-bean name="UserActionForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="userCondition" type="com.antbee.searchCondition.UserFindCondition" />        
        
</form-bean>
Action当中
DynaValidatorForm UserForm = (DynaValidatorForm) form;
        UserFindCondition Condition 
= (UserFindCondition) UserActionForm
                .get(
"userCondition");// 取得查询条件
List user = userManager.find(Condition,
                (iCurPageNo 
- 1* pageCon.PAGE_SIZE, pageCon.PAGE_SIZE);//呵呵,加入了hibernate的分页
具体实现:
    public List find(UserFindCondition Condition, int begin,
            
int count) {
        StringBuffer sql 
= new StringBuffer("from User as a where 1=1");              
       
if (Condition != null) {
            makeSql(sql, shipmentFindCondition);
        }
        String fsql 
= sql.toString();
        Query query 
= this.getSession().createQuery(fsql);
        
if (Condition != null) {
            setParameter(query, Condition);
        }
        query.setFirstResult(begin);
        query.setMaxResults(count);
        List tt 
= query.list();
        
return tt;
    }

--
    /**
     * 根据条件生成一个sql语句
     *
     * @author 和
     * @param sql
     *            初始的sql语句(一般为select a from A as a where 1=1)
     * @param condition
     *            查询的条件
     * @return
     * @version 1.0
     */
private
 void makeSql(StringBuffer sql, UserFindCondition condition) {
        
if (condition.getUsername() != null
                
&& !condition.getUsername().toString().equals("")) {
            sql
                    .append(
" and a.username like :username");
        }

        
if (condition.getLoginid() != null
                
&& !condition.getLoginid(().equals("")) {
            sql
                    .append(
" and a.loginid( = :loginid(");
        }

        
if (condition.getSex() != null
                
&& !condition.getSex().equals("")) {
            sql.append(
" and a.sex = :sex");
        }


    }

    
/**
     * 根据条件设置query的值
     * 
     * 
@author 和
     * 
@param query
     *            一个hibernate的Query对象
     * 
@param condition
     *            查询的条件
     * 
@return
     * 
@version 1.0
     
*/
    
private void setParameter(Query query, UserFindCondition condition) {

        
if (condition.getUsername() != null
                
&& !condition.getUsername().equals("")) {
            query.setString(
"username""%" + condition.getUsername()
                    
+ "%");
        }

        
if (condition.getLoginid() != null
                
&& !condition.getLoginid().equals("")) {
            query.setString(
"loginid", condition.getLoginid());
        }

        
if (condition.getSex() != null
                
&& !condition.getSex().equals("")) {
            query.setString(
"sex", condition.getSex());
        }     

    }

呵呵,笑死人了,这个方法很通用,我才在我的第二个项目当中才用到,真是可惜,当然了,使用Actionform有一个毛病就是对date类型要转换成STRING类型来处理,这是actionform的一个死穴。还有对Actionform不能够重置,只能够回来从前。不知道这群设计者怎么想的,真是由于这一点,所以我们有必要使用最原始的方法来解决问题了。使用页面当中的input,我们来拼request如何?
   二、利用JSTL做为表现而实现的查询功能
     步骤:在JSP页面布置很多的input,当然,你可以加入value了。(省略了...)
           创建查询条件的序列化对象(同样user.java)
           在action当中拼个condition了,做为查询条件,后面的处理类同第一种方式。
     UserSearchCondition userSearchCondition = null;
     userSearchCondition 
= makeUserSearchCondition(request);

private UserSearchCondition makeUserSearchCondition(HttpServletRequest request) throws Exception{
       
UserSearchCondition userSearchCondition = new OrderSearchCondition();
        String username
= request.getParameter("Username");
        String loginid
= request.getParameter("Loginid");
        String sex
= request.getParameter("Sex");  
       

                
        
if(username!= null && !username.trim().equals("")){
           
usernameSearchCondition.setUsername(username);
        }
        
        
if(loginid  != null && !loginid.trim().equals("")){
            userSearchCondition.set
Loginid (loginid );
        }
        
        
if(sex != null && !sex.trim().equals("")){        
            userSearchCondition.setSex(
sex);
        }      

        
        
return userSearchCondition;
    }

     以后的方法,我就不用再做举例了吧,可以参考如上第一种方法的实现.
     第二种方法的好处就是:在页面上比较好控制,比如重置,又比如日期性数据等。
     (所有过程当中的代码没有经过测试,只是说明这种方法而已)

posted @ 2006-07-21 11:20 @家军 阅读(2698) | 评论 (1)编辑 收藏

hibernate的延迟加载通用方法

呵呵,在忙一个项目,潜水很久,现在冒个泡:
(本文适用在struts+spring+hibernate3上做开发的虫虫们)
类名:HibernateUtil

package com.antbee.j2eemodel.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Iterator;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class HibernateUtil extends HibernateDaoSupport {

/**
* 初始化POJO类
@author @家军
@param object POJO对象
@param methodName 方法名称
@return
@version 1.0
*/
public void initialize(Object object, String methodName) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {

String[] methodArray 
= methodName.split("\\.");
Method method 
= null;
Object initializeObject 
= object;

if(methodArray.length == 1){
this.getHibernateTemplate().lock(initializeObject, org.hibernate.LockMode.NONE);
method 
= object.getClass().getMethod(methodArray[0], new Class[] {});
initializeObject 
= method.invoke(initializeObject, new Object[] {});
this.getHibernateTemplate().initialize(initializeObject);
}
else{
for(int i=0;i<methodArray.length;i++){
method 
= initializeObject.getClass().getMethod(methodArray[i], new Class[] {});
initializeObject 
= method.invoke(initializeObject, new Object[] {});
}
this.getHibernateTemplate().lock(initializeObject, org.hibernate.LockMode.NONE);
this.getHibernateTemplate().initialize(initializeObject);
}
}

/**
* 初始化POJO类
@author @家军
@param object POJO对象
@param methodName 方法名称数组
@return
@version 1.0
*/
public void initialize(Object object, String methodName[])
throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException, InvocationTargetException {

for (int i = 0; i < methodName.length; i++) {
String[] methodArray 
= methodName[i].split("\\.");
Method method 
= null;
Object initializeObject 
= object;

if(methodArray.length == 1){
this.getHibernateTemplate().lock(initializeObject, org.hibernate.LockMode.NONE);
method 
= object.getClass().getMethod(methodArray[0], new Class[] {});
initializeObject 
= method.invoke(initializeObject, new Object[] {});
this.getHibernateTemplate().initialize(initializeObject);
}
else{
for(int j=0;j<methodArray.length;j++){
method 
= initializeObject.getClass().getMethod(methodArray[j], new Class[] {});
initializeObject 
= method.invoke(initializeObject, new Object[] {});
}
this.getHibernateTemplate().lock(initializeObject, org.hibernate.LockMode.NONE);
this.getHibernateTemplate().initialize(initializeObject);
}
}

}

/**
* 初始化POJO类
@author @家军
@param object POJO对象
@return
@version 1.0
*/
public void initialize(Object object) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
this.getHibernateTemplate().lock(object, org.hibernate.LockMode.NONE);
this.getHibernateTemplate().initialize(object);
}

/**
* 初始化POJO类
@author @家军
@param collection POJO对象集合
@param methodName 方法名称数组
@return
@version 1.0
*/
public void initialize(Collection collection, String methodName[])
throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException, InvocationTargetException {

for(Iterator i=collection.iterator();i.hasNext()Wink{
Object object 
= i.next();
this.initialize(object,methodName);
}
}

/**
* 初始化POJO类
@author @家军
@param collection POJO对象集合
@param methodName 方法名称
@return
@version 1.0
*/
public void initialize(Collection collection, String methodName)
throws SecurityException, NoSuchMethodException,
IllegalArgumentException, IllegalAccessException, InvocationTargetException {

for(Iterator i=collection.iterator();i.hasNext()Wink{
Object object 
= i.next();
this.initialize(object,methodName);
}
}

这个方法的好外是:可以不在hbm.xml的文件当中,指定为lazy=true这个模式,可以直接使用。使用方法如下:
如果你使用SPRING,则需要把hibernateUtil注入其中:
 <bean id="hibernateUtilTarget" class="com.antbee.j2eemodel.util.HibernateUtil">
<property name="sessionFactory">
<ref local="mssqlSessionFactory" />
</property>
</bean>

<bean id="hibernateUtil" parent="BaseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target">
<ref local="hibernateUtilTarget" />
</property>
</bean>
<!--配置基础事务-->
<bean id="BaseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager">
<ref bean="mssqltransactionManager" />
</property>
<property name="proxyTargetClass">
<value>true</value>
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean> 

使用示例:
如果你使用STRUTS,则需要这样:
List what_ur_view = XXXManager.find(.);//取得你要展示的对象
//如果这个对象当中有延迟加载的对象(SET)时,则需要如下加载就行
this.hibernateUtil.initialize(what_ur_view, "getTbShipmentSale");
//其中getTbShipmentSale是其对象(SET也可以操作) 

在页面显示的时候,你就可以使用JSTL如下表述:
<c:out value="${what_ur_view.tbShipmentSale.goodsReceivePersonPhone}" />//呵呵,是不是很爽呀。 

同样的方法,我们也可以对一个SET在页面进行显示,方法如下:
<c:forEach items="${what_ur_view.tbShipmentProductMappingSet}" var="ProductMapping" varStatus="status">
<c:out value="${ProductMapping.productNum}" />
<c:out value="${ProductMapping.tbOutOfWarehouse.outOfWarehouseNum}" />
</c:forEach>
//呵呵,支持多级嵌套, 

在ACTION当中则需要加入
hibernateUtil.initialize(what_ur_view.getTbShipmentProductMappingSet(),
new String[] { "getTbProduct""getTbOutOfWarehouse",
"getTbProductConfigure" }); 
呵,如果你要是在HIBERNATE当中使用,这个就太简单了吧。

怎么样?呵呵呵,
从此,我对STRUTS的标签深恶痛绝,而对JSTL情有独钟了。

posted @ 2006-07-21 10:09 @家军 阅读(5586) | 评论 (2)编辑 收藏