posts - 41,  comments - 72,  trackbacks - 0
  2009年3月19日

最近做了一个日志管理系统
个人觉得采用了一套非常非常创新或者变态的开发方式,就像题目说的那样,使用web的方法开发桌面应用程序,当然所有的技术都是基于java的。
总结一下在整个项目中使用到的技术

1、底层服务器的开发socket通信、http报文解析、反射机制(这些技术其实就是开发了一款小型的服务器,让我们的web代码能够在本地运行起来,之所以选择自己开发服务器的原因是,tomcat对于我们这个小桌面程序来说还是太大了点,如果作为桌面启动,用户不可能等待程序启动这么长的时间,我给这个服务器起了个名字叫做jnet
2、SWT,包括的浏览器控件和窗口等。
3、使用installanywhere来打包程序,方便发布
4、前台展现数据使用了ext2.2
5、扩展自己开发的服务器jnet,开发出自己的“action”,应该来说还是符合MVC的
数据库使用的是access,采用jdbc的方式访问,你知道,如果在桌面软件上使用hibernate...

好了,不说废话
先贴出成品的效果图

1、桌面图标


2、登录界面


3、登录效果图


4、主界面


是不是觉得还不错呢?JAVA也可以扬眉吐气开发出这样的桌面系统,可惜的是因为使用到了SWT,所以整个项目并不能跨平台,放到linux系统下去运行。
好了先理一理,发一张项目的原理图


看图说话,我们整个项目的构架,就是这个样子的,采用SWT封装了IE作为前台展现,后台使用自己开发的服务器作为后台来处理数据,中间数据通信方式当然就只能是http了

所以中心思想就是,我开发了个服务器,这个服务器能够让用户扩展自己的类,自己的方法,然后用户就可以根据自己的需要来书写自己的系统,最最最重要的就是,让我们这些写惯了J2EE的人能够使用已经形成的思维来编写桌面系统,我们可以不需要再去学swing和swt,可以使用html的方式来做前台的布局,因为老实说我每次写桌面程序的时候,总会把代码弄得一团糟,在web系统上容易规规矩矩的写出分层的代码,桌面系统...布局就让我头大(我的意思是当你跑出去接私活干的时候,不用再学一套东西,呵呵)。

好了,这个帖子只是一个简单的介绍,整个系统具体的实现方式,会在后续的帖子中一步步解析,大家有什么意见或者建议可以给我留言,谢谢!
posted @ 2009-03-19 15:16 Dong 阅读(2705) | 评论 (21)编辑 收藏
  2008年6月5日

  开发的时候有时候会碰到这样的情况,我们在写程序的时候并不知道需要调用某个对象的哪个方法,只有程序运行后,我们才能够知道。或许我们需要根据客户端传过来的某个String参数的值来判断我们应该执行哪个方法。在这种情况下JAVA的反射执行就可以帮上忙了。下面是我做的一个简单的测试代码,提供给大家做个参考。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 
@author Dong
 * 测试JAVA reflect机制
 
*/

public class TestRef{
    
/**
     * 
@param args
     
*/

    
public static void main(String[] args){
            TestBean test 
= new TestBean();
            Method[] methods 
= test.getClass().getMethods();
            test.setAbc(
"---");
            
for(int i=0;i<methods.length;i++){
                
if(methods[i].getName().equalsIgnoreCase("getabc")){
                    
try {
                        System.out.println(methods[i].invoke(test));
                    }
 catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    }
 catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
 catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }

                }

            }

    }

}

posted @ 2008-06-05 16:36 Dong 阅读(5246) | 评论 (4)编辑 收藏
  2008年6月2日
(String[])ArrayList.toArray(new String[0]);
posted @ 2008-06-02 11:25 Dong 阅读(298) | 评论 (0)编辑 收藏
  2008年5月21日
XML里是无法直接正常输出&等特殊字符的,可用&amp;转义表示!
posted @ 2008-05-21 09:03 Dong 阅读(115) | 评论 (0)编辑 收藏
  2008年5月20日
1、数字格式化
<fmt:formatNumber value="33.33333" pattern="#.0"></fmt:formatNumber>-->输出33.3
pattern中符号的约束规定
0                     一个数位
#                     一个数位,前导零和追尾零不显示
.                      小数点分割位置
,                     组分隔符的位置
-                      负数前缀
%                    用100乘,并显示百分号
其他任何符号    在输出字符串中包括指定符号
2、日期格式化
<fmt:formatDate value="${vo.lateCompleteDate}" type="both" pattern="yy-MM-dd"/>
posted @ 2008-05-20 09:29 Dong 阅读(637) | 评论 (0)编辑 收藏
  2008年5月19日
HashMap<String,String> testMap = new HashMap<String,String>();
for (Map.Entry<String, String> entry : testMap .entrySet()) {
entry.getKey();
entry.getValue();
}
posted @ 2008-05-19 17:09 Dong 阅读(120) | 评论 (0)编辑 收藏
ApplicationContext ctx = new ClassPathXmlApplicationContext("application-config.xml");
Map<String,String> bureauMap = ((DictionaryService)ctx.getBean("dictionaryService")).getBureauMap();
posted @ 2008-05-19 16:45 Dong 阅读(54) | 评论 (0)编辑 收藏
  2008年4月17日
今天在调试一个Servlet程序的时候,报了以下错误!
java.lang.IllegalStateException: Cannot forward after response has been committed
根据字面理解的话,意识是在response已经提交后程序不能再一次的跳转!

研究代码以后发现,是因为前面已经执行过一次request.request.getRequestDispatcher().forward()
但是后面的request.request.getRequestDispatcher().forward()依然被执行到了!

那么很有理由相信request.request.getRequestDispatcher().forward()跳转本身是不会返回什么,也不会终止程序体的执行!
程序体后面该执行的还是会执行!
posted @ 2008-04-17 10:28 Dong 阅读(2958) | 评论 (1)编辑 收藏
  2008年2月24日
<Resource name="jdbc/dong"  auth="Container" type="javax.sql.DataSource"/>
 
 
<ResourceParams name="jdbc/dong">
  
<parameter>
   
<name>factory</name>
   
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
  
</parameter>
  
<parameter>
   
<name>maxActive</name>
   
<value>100</value>
  
</parameter>
  
<parameter>
   
<name>maxIdle</name>
   
<value>30</value>
  
</parameter>
  
<parameter>
   
<name>maxWait</name>
   
<value>5000</value>
  
</parameter>
  
<parameter>
   
<name>username</name>
   
<value>root</value>
  
</parameter>
  
<parameter>
   
<name>password</name>
   
<value>colorful</value>
  
</parameter>
  
<parameter>
   
<name>driverClassName</name>
   
<value>org.gjt.mm.mysql.Driver</value>
  
</parameter>
  
<parameter>
   
<name>url</name>
   
<value>jdbc:mysql://localhost:3306/dong</value>
  
</parameter>
   
</ResourceParams>
使用如上配置的时候一直报这个
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'错误

在网络上寻觅后发现是因为Tomcat版本引起的,改成如下问题就消失了

<Resource
    
name="jdbc/dong"
    type
="javax.sql.DataSource"
    password
="colorful"
    driverClassName
="org.gjt.mm.mysql.Driver"
    maxIdle
="2"
    maxWait
="5000"
    username
="root"
    url
="jdbc:mysql://localhost:3306/dong"
    maxActive
="4"/>
posted @ 2008-02-24 13:47 Dong 阅读(2217) | 评论 (1)编辑 收藏
  2008年2月12日
 

1、 解决Action过多问题

通过DispatchAction的方式

建立一个继承自DispatchActionAction

此类Action允许我们在表单中带有参数,根据参数执行Action中的不同方法,以此实现Action的多用

步骤

     建立一个继承自DispatchActionAction规定方法名称

     在表单页面中添加一个隐藏域值,假设为codi   value=”insert”

     Struts-config.xml的相应Formaction项目中设置parameter参数值为codi

那么当表单提交的时候,Action中的insert()方法就会被执行,可以通过改隐藏域中的值的方式来改变Action要执行的方法

2、 解决ActionForm过多的问题

通过动态ActionForm的方式,即DynaActionForm

步骤

     Struts-config.xml

<form-beans>

 <form-bean name=”abcForm” type=”org.apache.struts.action.DynaActionForm”>

         <form-property name=”userid” type=”java.long.String”></form-property>             

</form-bean>

</form-beans>

     Struts-config.xml

更改相应的action中的attributenameabcForm

这样就配置好了一个动态的ActionForm

3、 解决动态ActionForm的验证问题

通过动态验证ActonForm的方式,即DynaValidatorForm

步骤

     Struts-config.xml

2的第一步,但是type需要改成org.apache.struts.action.DynaValidatorForm

     配置一个validation.xml文件

<form-validation>

    <formset>

        <form name="abcForm">

            <field property="userid" depends="required">

                <arg key="err.userid" resource="true"/>

            </field>

        </form>

    </formset>

</form-validation>

    在Struts资源文件中配置err.userid、以及errors.required

    在Struts-config.xml配置相应的action,添加validate=true添加验证支持

    添加struts Plugin插件

设置plugin class为org.apache.struts.validator.ValidatorPlugIn

添加propertys

Propertyà pathnames

Valueà /WEB-INF/validator-rules.xml,/WEB-INF/validation.xml

这样一个验证框架就配置好了!

posted @ 2008-02-12 13:47 Dong 阅读(2737) | 评论 (5)编辑 收藏
仅列出标题  下一页