颠覆软件

关注 : 架构与设计,敏捷,快速开发,项目管理,执行力,SSH,RoR

Archive for January, 2007

上传文件放在哪里比较合适?

January 31, 2007

目里面有上传文件的需求,我想了一下不外乎下面两种处理方法: 1. 在数据库表中建立一个blob字段存放用户上传文件. 2. 在服务器上建立一个文件夹保存用户上传文件,数据库表中只存放该文件的url地址. 我本人现在比较倾向于第2种方案, 主要原因是担心方案1的效率(我用的是mysql数据库)。 但是处理过程中除了维护数据库中表的字段还要维护上传的文件,稍微麻烦一点。 大家在项目里面又是怎么做呢? 给我点建议!谢谢 讨论内容见: javaeye robin更建议第二种方案,放在数据库中主要的问题是 AppServer吃不消,开销比较大. 上面是摘录,不过我们这里用的是Oracle9i AS,在Oracle的协作套间里一般文档或者上传的文件都是保存在数据库里,还把这个特性作为Oracle 与别的协作套件之间不同的卖点。 大家以为如何? 我直觉是Oracle的DB和oc4j的AppServer对付这个似乎没有开销上的担心,但是没有实际检测过。 换句话说,文件的管理是放在文件夹里方便还是数据库里方便? 有点为难 update (2007-5-13): 还有一种方案结合了数据库和IO,我认为比较可行,就是文件存在数据库,但是下载的时候第一次从数据库下载,然后第一次这个文件保存在一个临时文件夹下面,以后每次下载的时候总是先检查此临时文件夹,如果已经存在则直接下载,如果没有则从数据库重复这个动作。当然,保存在临时文件夹下的文件的命名需要唯一,这个应该没有问题。

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

powerdesigner中外建问题

January 31, 2007

key words: pd, powerdesigner,外建

在PD中建立外键碰到一个问题,如: forum(id,name)表,forum_thread(id,forum_id)表,需要将forum的id设为forum_thread的外建,指向forum_id,默认的在 PD中是将主键设为外建.

需要如下设置才可以:

foreign_key.png

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

[zt] Hibernate+Spring 对DAO的处理实列!

January 25, 2007

key words : hibernate spring dao

come from : http://lpacec.javaeye.com/blog/46220

   1.  package infoweb.dao;
   
2.
   
3import java.util.List;
   
4import java.util.Iterator;
   
5.
   
6import infoweb.pojo.Info;
   
7.
   
8import net.sf.hibernate.HibernateException;
   
9import net.sf.hibernate.Query;
  
10import net.sf.hibernate.Session;
  
11.
  
12import org.springframework.orm.hibernate.HibernateCallback;
  
13import org.springframework.orm.hibernate.support.HibernateDaoSupport;
  
14.
  
15/**
  16.  *

      Title:

  17.  *

      Description:

  18.  *

      Copyright: Copyright (c) 2004

  19.  *

      Company:

  20.  * 
@author 段洪杰
  21.  * 
@version 1.0
  22.  
*/

  
23.
  
24public class InfoDAOImpl extends HibernateDaoSupport implements IInfoDAO {
  
25.   /**
  26.    * 构造函数
  27.    
*/

  
28.   public InfoDAOImpl() {
  
29.     super();
  
30.   }

  
31.
  
32.   /**
  33.    * 增加记录
  34.    * 
@param info Info
  35.    
*/

  
36.   public void setInfo(Info info) throws Exception {
  
37.     getHibernateTemplate().save(info);
  
38.   }

  
39.
  
40.   /**
  41.    * 通过ID取得记录
  42.    * 
@param id String
  43.    * 
@return Info
  44.    
*/

  
45.   public Info getInfoById(String id) throws Exception {
  
46.     Info info = (Info) getHibernateTemplate().load(Info.class, id);
  
47.     return info;
  
48.   }

  
49.
  
50.   /**
  51.    * 修改记录
  52.    * 
@param Info info
  53.    
*/

  
54.   public void modifyInfo(Info info) throws Exception {
  
55.     getHibernateTemplate().update(info);
  
56.   }

  
57.
  
58.   /**
  59.    * 删除记录
  60.    * 
@param Info info
  61.    
*/

  
62.   public void removeInfo(Info info) throws Exception {
  
63.     getHibernateTemplate().delete(info);
  
64.   }

  
65.
  
66.   ////////////////////////////////////////////////////////      
  67.   /////                                                ///      
  68.   /////以下部份不带审核功能                              ///      
  69.   /////                                                ///      
  70.   ////////////////////////////////////////////////////////      
  71.
  
72.   /**
  73.    * 取记录总数
  74.    * 
@return int
  75.    
*/

  
76.   public int getInfosCount() throws Exception {
  
77.     int count = 0;
  
78.     String queryString = select count(*) from Info;
  
79.     count = ((Integer) getHibernateTemplate().iterate(queryString).next()).
  
80.             intValue();
  
81.     return count;
  
82.   }

  
83.
  
84.   /**
  85.    * 取所有记录集合
  86.    * 
@return Iterator
  87.    
*/

  
88.   public Iterator getAllInfos() throws Exception {
  
89.     Iterator iterator = null;
  
90.     String queryString =  select info from Info as info order by info.id desc;
  
91.     List list = getHibernateTemplate().find(queryString);
  
92.     iterator = list.iterator();
  
93.     return iterator;
  
94.   }

  
95.
  
96.   /**
  97.    * 取记录集合
  98.    * 
@return Iterator
  99.    * 
@param int position, int length
 100.    
*/

 
101.   public Iterator getInfos(int position, int length) throws Exception {
 
102.     Iterator iterator = null;
 
103.     String queryString =  select info from Info as info order by info.id desc;
 
104.     Query query = getHibernateTemplate().createQuery(getSession(), queryString);
 
105.     //设置游标的起始点      
 106.     query.setFirstResult(position);
 
107.     //设置游标的长度      
 108.     query.setMaxResults(length);
 
109.     //记录生成      
 110.     List list = query.list();
 
111.     //把查询到的结果放入迭代器      
 112.     iterator = list.iterator();
 
113.     return iterator;
 
114.   }

 
115.
 
116.   /**
 117.    * 取第一条记录
 118.    * 
@throws Exception
 119.    * 
@return Station
 120.    
*/

 
121.   public Info getFirstInfo() throws Exception {
 
122.     Iterator iterator = null;
 
123.     Info info = null;
 
124.     String queryString = select info from Info as info order by info.id desc;
 
125.     Query query = getHibernateTemplate().createQuery(getSession(), queryString);
 
126.     //记录生成      
 127.     List list = query.list();
 
128.     //把查询到的结果放入迭代器      
 129.     iterator = list.iterator();
 
130.     if (iterator.hasNext()) {
 
131.       info = (Info) iterator.next();
 
132.     }

 
133.     return info;
 
134.   }

 
135.
 
136.   /**
 137.    * 取最后一条记录
 138.    * 
@throws Exception
 139.    * 
@return Station
 140.    
*/

 
141.   public Info getLastInfo() throws Exception {
 
142.     Iterator iterator = null;
 
143.     Info info = null;
 
144.     String queryString = select info from Info as info order by info.id asc;
 
145.     Query query = getHibernateTemplate().createQuery(getSession(), queryString);
 
146.     //记录生成      
 147.     List list = query.list();
 
148.     //把查询到的结果放入迭代器      
 149.     iterator = list.iterator();
 
150.     if (iterator.hasNext()) {
 
151.       info = (Info) iterator.next();
 
152.     }

 
153.     return info;
 
154.
 
155.   }

 
156.
 
157.   ////////////////////////////////////////////////////////      
 158.   /////                                                ///      
 159.   ///// 以下部份表中要有特定字段才能正确运行   个人和企业     ///      
 160.   /////                                                ///      
 161.   ////////////////////////////////////////////////////////      
 162.
 
163.   /**
 164.    * 取符合条件记录总数, [表中要有 isperson 字段]
 165.    * 
@return int
 166.    * 
@param int isPerson
 167.    
*/

 
168.
 
169.   public int getInfosCountByIsperson(int isPerson) throws Exception {
 
170.     int count = 0;
 
171.     String queryString =
 
172.         select count(*) from Info as info where info.isperson = + isPerson;
 
173.     count = ((Integer) getHibernateTemplate().iterate(queryString).next()).
 
174.             intValue();
 
175.     return count;
 
176.   }

 
177.
 
178.   /**
 179.    * 取所有符合条件记录集合, 模糊查询条件.[表中要有 isperson 字段]
 180.    * 
@return Iterator
 181.    * 
@param int isPerson
 182.    
*/

 
183.
 
184.   public Iterator getAllInfosByIsperson(int isPerson) throws Exception {
 
185.     Iterator iterator = null;
 
186.     String queryString =  select info from Info as info where info.isperson = +
 
187.                          isPerson +  order by info.id desc;
 
188.     List list = getHibernateTemplate().find(queryString);
 
189.     //把查询到的结果放入迭代器      
 190.     iterator = list.iterator();
 
191.     return iterator;
 
192.   }

 
193.
 
194.   /**
 195.    * 取符合条件记录集合, 模糊查询条件.[表中要有 isperson 字段]
 196.    * 
@return Iterator
 197.    * 
@param int isPerson,int position, int length
 198.    
*/

 
199.
 
200.   public Iterator getInfosByIsperson(int isPerson, int position, int length) throws
 
201.       Exception {
 
202.     Iterator iterator = null;
 
203.     String queryString =  select info from Info as info where info.isperson = +
 
204.                          isPerson +  order by info.id desc;
 
205.     //创建查询      
 206.     Query query = getHibernateTemplate().createQuery(getSession(), queryString);
 
207.     //设置游标的起始点      
 208.     query.setFirstResult(position);
 
209.     //设置游标的长度      
 210.     query.setMaxResults(length);
 
211.     //记录生成      
 212.     List list = query.list();
 
213.     //把查询到的结果放入迭代器      
 214.     iterator = list.iterator();
 
215.     return iterator;
 
216.   }

 
217.
 
218.   ////////////////////////////////////////////////////////      
 219.   /////                                                ///      
 220.   ///// 以下部份表中要有特定字段才能正确运行   查询部份      ///      
 221.   /////                                                ///      
 222.   ///////////////////////////////////////////////////////      
 223.   /**
 224.    * 取符合条件记录总数, 模糊查询条件.[表中要有 title 字段]
 225.    * 
@return int
 226.    * 
@param String text
 227.    
*/

 
228.   public int getInfosCount(String text) throws Exception {
 
229.     int count = 0;
 
230.     count = ((Integer) getHibernateTemplate().iterate(
 
231.         select count(*) from Info as info where info.title like ’% + text +
 
232.         %’).next()).intValue();
 
233.     return count;
 
234.   }

 
235.
 
236.   /**
 237.    * 取所有符合条件记录集合, 模糊查询条件.[表中要有 title 字段]
 238.    * 
@return Iterator
 239.    * 
@param String text
 240.    
*/

 
241.
 
242.   public Iterator getAllInfos(String text) throws Exception {
 
243.     Iterator iterator = null;
 
244.     String queryString =
 
245.          select info from Info as info where info.title like ’% + text +
 
246.         %’ order by info.id desc;
 
247.     //创建查询      
 248.     Query query = getHibernateTemplate().createQuery(getSession(), queryString);
 
249.     //记录生成      
 250.     List list = query.list();
 
251.     //把查询到的结果放入迭代器      
 252.     iterator = list.iterator();
 
253.     return iterator;
 
254.   }

 
255.
 
256.   /**
 257.    * 取符合条件记录集合, 模糊查询条件.[表中要有 title 字段]
 258.    * 
@return Iterator
 259.    * 
@param String text,int position, int length
 260.    
*/

 
261.   public Iterator getInfos(String text, int position, int length) throws
 
262.       Exception {
 
263.     Iterator iterator = null;
 
264.     String queryString =
 
265.          select info from Info as info where info.title like ’% + text +
 
266.         %’ order by info.id desc;
 
267.
 
268.     //创建查询      
 269.     Query query = getHibernateTemplate().createQuery(getSession(), queryString);
 
270.     //设置游标的起始点      
 271.     query.setFirstResult(position);
 
272.     //设置游标的长度      
 273.     query.setMaxResults(length);
 
274.     //记录生成      
 275.     List list = query.list();
 
276.     //把查询到的结果放入迭代器      
 277.     iterator = list.iterator();
 
278.     return iterator;
 
279.   }

 
280.
 
281.   ////////////////////////////////////////////////////////      
 282.   /////                                                ///      
 283.   ///// 以下部份表中要有特定字段才能正确运行   注册相关      ///      
 284.   /////                                                ///      
 285.   ////////////////////////////////////////////////////////      
 286.
 
287.   /**
 288.    * 取符合条件记录总数.[ 表中要有 registername 字段]
 289.    * 
@return int
 290.    * 
@param String text
 291.    
*/

 
292.   public int getInfosCountByRegisterName(String registerName) throws Exception {
 
293.     int count = 0;
 
294.     count = ((Integer) getHibernateTemplate().iterate(
 
295.         select count(*) from Info as info where info.registername = ’ +
 
296.         registerName + ).next()).intValue();
 
297.     return count;
 
298.   }

 
299.
 
300.   /**
 301.    * 通过注册名取得一条记录,如有多条,只取第一条.[表中要有 registername字段]
 302.    * 
@param registername String
 303.    * 
@return Info
 304.    
*/

 
305.   public Info getInfoByRegisterName(String registerName) throws Exception {
 
306.     Iterator iterator = null;
 
307.     Info info = null;
 
308.     String queryString =
 
309.          select info from Info as info where info.registername=’ +
 
310.         registerName + ‘ order by info.id desc;
 
311.     //创建查询      
 312.     Query query = getHibernateTemplate().createQuery(getSession(), queryString);
 
313.     //记录生成      
 314.     List list = query.list();
 
315.     //把查询到的结果放入迭代器      
 316.     iterator = list.iterator();
 
317.     if (iterator.hasNext()) {
 
318.       info = (Info) iterator.next();
 
319.     }

 
320.     return info;
 
321.   }

 
322.
 
323.   /**
 324.    * 通过注册名取得所有记录集合.[表中要有 registername字段]
 325.    * 
@param registername String
 326.    * 
@return Iterator
 327.    
*/

 
328.   public Iterator getAllInfosByRegisterName(String registerName) throws
 
329.       Exception {
 
330.     Iterator iterator = null;
 
331.     String queryString =
 
332.          select info from Info as info where info.registername=’ +
 
333.         registerName + ‘ order by info.id desc;
 
334.     //创建查询      
 335.     Query query = getHibernateTemplate().createQuery(getSession(), queryString);
 
336.     //记录生成      
 337.     List list = query.list();
 
338.     //把查询到的结果放入迭代器      
 339.     iterator = list.iterator();
 
340.     return iterator;
 
341.   }

 
342.
 
343.   /**
 344.    * 通过注册名取得记录列表.[表中要有 registername字段]
 345.    * 
@param registername String
 346.    * 
@return Iterator
 347.    
*/

 
348.   public Iterator getInfosByRegisterName(String registerName, int position,
 
349.                                          int length) throws Exception {
 
350.     Iterator iterator = null;
 
351.     String queryString =
 
352.          select info from Info as info where info.registername=’ +
 
353.         registerName + ‘ order by info.id desc;
 
354.     //创建查询      
 355.     Query query = getHibernateTemplate().createQuery(getSession(), queryString);
 
356.     //设置游标的起始点      
 357.     query.setFirstResult(position);
 
358.     //设置游标的长度      
 359.     query.setMaxResults(length);
 
360.     //记录生成      
 361.     List list = query.list();
 
362.     //把查询到的结果放入迭代器      
 363.     iterator = list.iterator();
 
364.     return iterator;
 
365.   }

 
366.
 
367.   ////////////////////////////////////////////////////////      
 368.   /////                                                ///      
 369.   ///// 以下部份表中要有特定字段才能正确运行     树型版块     ///      
 370.   /////                                                ///      
 371.   ////////////////////////////////////////////////////////      
 372.
 
373.   /**
 374.    * 取记录总数.[ 表中要有 board_id 字段]
 375.    * 
@return int
 376.    * 
@param String boardId
 377.    
*/

 
378.   public int getInfosCountByBoard(String boardId) throws Exception {
 
379.     int count = 0;
 
380.
 
381.     count = ((Integer) getHibernateTemplate().iterate(
 
382.         select count(*) from Info as info where info.boardId = ’ + boardId +
 
383.         ).next()).intValue();
 
384.
 
385.     return count;
 
386.   }

 
387.
 
388.   /**
 389.    * 通过版块名取得所有记录集合.[表中要有 board_id字段]
 390.    * 
@param BoardId String
 391.    * 
@return Iterator
 392.    
*/

 
393.   public Iterator getAllInfosByBoard(String boardId) throws Exception {
 
394.     Iterator iterator = null;
 
395.     String queryString =  select info from Info as info where info.boardId=’ +
 
396.                          boardId + ‘ order by info.id desc;
 
397.     //创建查询      
 398.     Query query = getHibernateTemplate().createQuery(getSession(), queryString);
 
399.     //记录生成      
 400.     List list = query.list();
 
401.     //把查询到的结果放入迭代器      
 402.     iterator = list.iterator();
 
403.     return iterator;

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

用js检查上传文件大小

January 25, 2007

key words: js,javascript,检查上传文件大小

有时需要在客户端获得待上传得文件大小,google了一下,发现下面这个用法.

<html>
<input type=”file” name=”file1″ onchange=”ShowSize(this.value)”>
<script language=”JavaScript”>
<!–
function ShowSize(files)
{
  
var fso,f;
  fso
=new ActiveXObject(Scripting.FileSystemObject);
  f
=fso.GetFile(files);
  
var mySize = f.size/1024;
  alert(mySize
+ K );
}

//–>  
</script>
</html>

BTW: 奇怪,COS上传组件里怎么没有获得上传文件大小的方法?  MultipartRequest里是没有,有知道的兄弟通知下哦

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: -1 (from 1 vote)

[zt]学习 REST

January 23, 2007

key words: REST webservice

转自廖宇雷的Weblog

REST 是由 Roy Fielding 在他的论文《Architectural Styles and the Design of Network-based Software Architectures》中提出的一个术语。

REST 是英文 Representational State Transfer 的缩写,有中文翻译为“具象状态传输”(参考:《SIP/IMS网络中的Representational State Transfer (REST)和数据分布》)。

—————————————

前面的内容比较枯燥,我说说我自己的理解。

但是 REST 到底是什么呢?论文我看不懂,不过找到一篇更简单易懂的东西:《Building Web Services the REST Way》

根据这篇文章,我整理了一下我自己对 REST 的理解:

REST 首先只是一种架构样式,不是一种标准。这点和 Ajax 类似,两者都是利用现有的成熟技术。

在 REST 的定义中,一个 Web 应用总是使用固定的 URI 向外部世界呈现(或者说暴露)一个资源

URI 是英文 Uniform Resource Identifier 的缩写,中文翻译“通用资源标志符”。

“通用资源标志符”是指唯一标识一个资源(xhtml 文件、图片、css 样式表)的字符串。当然了,RFC 中定义的 URI 复杂得多,不过我们此处将 URI 想象成一个人的身份证号码就行了(你不能有两个同时有效的身份证号码,一个号码也不可能同时对应两个人)。而我们天天挂在嘴边的 URL 地址就是 URI 的一种表现形式(个人理解,有错请纠正)。

知道什么是 URI 后,我们来看一个实际例子:

http://www.example.com/photo/logo 指向 example.com 网站(可以视为一个 Web 应用)中类型为 photo,名字为 logo 的资源。我们用浏览器访问这个 URI,看到的将可能是一个 xhtml 文档,其中用 <img src=”……” /> 来显示实际的照片。

http://www.example.com/photo/logo 很容易让你想到 URL 重写。事实上,这个地址很可能会在服务器内部处理为 http://www.example.com/photo.php?name=logo 这样的地址。photo.php 是服务器端的一个动态脚本文件,根据 name 参数生成 xhtml 文档返回给浏览器。

现在假设我们要获取这张照片的 XML 文档。XML 文档中包含照片的文件名、文件大小、拍摄日期等等信息。也就是说我们要获取“同一个资源的不同表现形式的数据”。对于这个要求,我们可以很容易的用另一个 URL 地址达到:http://www.example.com/xml/logo。

但是,这就违背了“URI 唯一标识一个资源”的定义。如果我们要获取同一个资源的多种表现形式,那么就要使用更多的 URL,从而给一个资源指定了多个不同的 URI。

而在 REST 中,不管是获取照片的 xhtml 文档还是 XML 文档,或者照片文件本身,都是用同一个 URI,就是 http://www.example.com/photo/logo。

那这是怎么办到的呢?Ruby On Rails 中是通过分辨 HTTP Request Header 信息来分辨客户端是想要取得资源的哪一种表现形式的数据。

当我们用浏览器访问一个网址时,浏览器会构造一个 HTTP 请求。这个请求有一个头信息,其中包括了本次请求接受何种类型的数据。通常浏览器发送的 HTTP 请求头中,Accept 的值都是 */*,也就说接受服务器返回的任何类型的数据。

看到这里,聪明的家伙应该知道了。只要我们指定一个特定的 Accept 参数,那么服务器就可以通过判断该参数来决定返回什么类型的数据。所以在一个采用 REST 架构的应用中,要获取同一个资源的不同表现形式的数据,只需要使用不同的 HTTP 请求头信息就行了。

如果考虑为 Web 应用增加 Web Services,这种技术的价值就体现出来了。比如我写了一个 Delphi 程序,现在只需要构造一个包含 Accept: text/xml 的 HTTP 请求头,然后将请求发送到 http://www.example.com/photo/logo 就可以了。返回的结果就是一个 XML 文档,而不是 xhtml 文档。

因为我们的 HTTP 请求头信息有不同的状态,从而可以获得不同的数据,所以叫做“具象状态传输” :)

—————————————

除了上面的用法,REST 还有进一步的扩展。

我们在 Web 应用中处理来自客户端的请求时,通常只考虑 GET 和 POST 这两种 HTTP 请求方法。实际上,HTTP 还有 HEAD、PUT、DELETE 等请求方法。而在 REST 架构中,用不同的 HTTP 请求方法来处理对资源的 CRUD(创建、读取、更新和删除)操作:

  • POST: 创建
  • GET: 读取
  • PUT: 更新
  • DELETE: 删除

经过这样的一番扩展,我们对一个资源的 CRUD 操作就可以通过同一个 URI 完成了:

http://www.example.com/photo/logo(读取)

仍然保持为 [GET] http://www.example.com/photo/logo

http://www.example.com/photo/logo/create(创建)

改为 [POST] http://www.example.com/photo/logo

http://www.example.com/photo/logo/update(更新)

改为 [PUT] http://www.example.com/photo/logo

http://www.example.com/photo/logo/delete(删除)

改为 [DELETE] http://www.example.com/photo/logo

从而进一步规范了资源标识的使用。

通过 REST 架构,Web 应用程序可以用一致的接口(URI)暴露资源给外部世界,并提供对资源的操作服务。这对于以资源为中心的 Web 应用来说非常重要。例如照片共享网站、用户社区等。

—————————————

Ruby On Rails 1.2 版对 REST 有很好的支持,但要在 PHP 中应用 REST 还需要解决不少问题:

  • 如何在服务端判断 PUT、DELETE 请求方法;
  • 如何获取用 PUT、DELETE 请求方法中传递的数据;
  • 如何获取 HTTP 请求头信息中的 Accept 参数值;
  • 如何在浏览器端发起 PUT 和 DELETE 请求。

不过我仔细看了 PHP 文档,我觉得上面几个问题都是可以解决的。

服务端综合使用 $_SERVER[’HTTP_ACCEPT’]、$_SERVER[’REQUEST_URI’]、$_SERVER[’REQUEST_METHOD’]、$_SERVER[’QUERY_STRING’] 这些变量应该可以搞定前面三个问题。而第四个问题则可以用 JavaScript 的 XMLHttpRequest 对象来实现。

不过我想 REST 的真正价值在于 Web Services,而不是通过浏览器操作的应用程序。

—————————————

参考:

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

web快速开发相关技术和产品

January 20, 2007

key words : web快速开发

web快速开发是一个值得期待的东西,最早我接触过codecharge,是一个商业软件,功能据说很强大,我试用过,支持php,asp,jsp等多语言,但是感觉对java的支持不是很顺手,接着就是asp,这个好也不好,原因就不说了,因为我对java关注。

2. 接着就是dorado ,刚看到的,感觉也不错,有asp的风格,不过更适合j2ee的环境 ,这里是他们的在线演示demo,有兴趣的可以看一下

3. 最后,刚google了一下,Oracle也有一个基于Oracle数据库的快速开发产品  : APEX,基于浏览器做DB 开发,原来的名字叫做HTML DB,名字很直观,据说Oracle的metalink就是用这个实现的,应该功能不赖。

4.对了,再补充一个现在很热的,Ror,听说javaeye的网站要重新用ruby1.2开发,试用过一点,感觉确实令人震惊,值得关注。

java的技术其实是看着很热闹,比较大的东西也不少,但是真正关注web这一块的其实不多,无论是struts还是webwork,离我们所说的真正的“快速开发”的距离很远,而以上一些工具的出现也许会逐步改善j2ee在这一领域的现状。

我之所以对这个目前有点兴趣,确实有一种强烈的反差在折磨着我,因为我相信在j2ee的web开发里确实存在本来要开发1周多的工作量很可能用一个好的工具几个小时就搞定了,这是一件多么荒唐搞笑的事情?如果dorado在它的产品中真的能做到这样那我们的java开发那么坑吃坑吃的折腾个什么劲啊? 也许真的有奇迹,我宁愿相信有这样的奇迹。

大家有什么好的想法可以讨论一下。

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

[zt]PowerDesigner 11 使用心得

January 17, 2007

key words: powerdesign,power , design

引言:
发现powerdesign的文档真的是不多,不过powerdesign还是很有用的,见到此类文档就收藏下吧.

转自edeed

附上一些使用pd11的心得:

1、安装PD v11.0版

2、由pdm生成建表脚本时,字段超过15字符就发生错误(oracle)
原因未知,解决办法是打开PDM后,会出现Database的菜单栏,进入Database - Edit Current DBMS -script-objects-column-maxlen,把value值调大(原为30),比如改成60。出现表或者其它对象的长度也有这种错误的话都可以选择对应的objects照此种方法更改!
或者使用下面的这种方法:
生成建表脚本时会弹出Database generation提示框:把options - check model的小勾给去掉,就是不进行检查(不推荐)!
或者可以修改C:\Program Files\Sybase\PowerDesigner Trial 11\Resource Files\DBMS\oracl9i2.xdb文件
修改好后,再cdm转为pdm时,选择“Copy the DBMS definition in model”把把这个资源文件拷贝到模型中。

3、生成的建表脚本中如何把对象的双引号去掉?
打开cdm的情况下,进入Tools-Model Options-Naming Convention,把Name和Code的标签的Charcter case选项设置成Uppercase或者Lowercase,只要不是Mixed Case就行!
或者选择Database->Edit current database->Script->Sql->Format,有一项CaseSensitivityUsingQuote,它的 comment为“Determines if the case sensitivity for identifiers is managed using double quotes”,表示是否适用双引号来规定标识符的大小写,可以看到右边的values默认值为“YES”,改为“No”即可!
或者在打开pdm的情况下,进入Tools-Model Options-Naming Convention,把Name和Code的标签的Charcter case选项设置成Uppercase就可以!

4、建立一个表后,为何检测出现Existence of index的警告
A table should contain at least one column, one index, one key, and one reference.
可以不检查 Existence of index 这项,也就没有这个警告错误了!
意思是说没有给表建立索引,而一个表一般至少要有一个索引,这是一个警告,不用管也没有关系!

5、创建一个表在修改字段的时候,一修改name的内容,code也跟着变化,如何让code不随着name变化
Name和Code 的右侧都有一个按钮“=”,如果需要不同步的话,把这个按钮弹起来就可以了。
Tools->General Options->Dialog->Name to Code Mirroring (去掉)

6、由CDM生成PDM时,自动生成的外键的重命名
PDM Generation Options->Detail->FK index names默认是%REFR%_FK,改为FK_%REFRCODE%,其中%REFRCODE%指的就是CDM中Relationship的code!另外自动生成的父字段的规则是PDM Generation Options->Detail->FK column name template中设置的,默认是%.3:PARENT%_%COLUMN%,可以改为Par%COLUMN%表示是父字段!

7、如何防止一对一的关系生成两个引用(外键)
要定义关系的支配方向,占支配地位的实体(有D标志)变为父表。
在cdm中双击一对一关系->Detail->Dominant role选择支配关系

8、修改报表模板中一些术语的定义
即文件:C:\Program Files\Sybase\PowerDesigner Trial 11\Resource Files\Report Languages\Chinese.xrl
Tools-Resources-Report Languages-选择Chinese-单击Properties或双击目标
修改某些对象的名称:Object Attributes\Physical Data Model\Column\
ForeignKey:外键
Mandatory:为空
Primary:主键
Table:表
用查找替换,把“表格”替换成“表”
修改显示的内容为别的:Values Mapping\Lists\Standard,添加TRUE的转化列为是,FALSE的转化列为空
另外Report-Title Page里可以设置标题信息

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

beanShell不错

January 9, 2007

key words : beanShell ,动态脚本

原来第一次是在osworkflow中听说过beanShell,最近又碰到,感觉还是挺有用的,比如对于我来说我就想有一些class文件拿过来直接调用看看,但有不想搭建一个麻烦的环境,而beanshell就可以满足我这个需求。

假设我欲调用的java为MyShit

package com.app;

public class MyShit
{
    
static{
        System.out.println(
this is in static blog);
    }

    
public static void main(String[] args){
        System.out.println(
this is in main method : hello shit);
    }

    
public void shit(){
        System.out.println(
hello shit!!!);
    }


    
public static void haha(){
        System.out.println(
this is static method haha);
    }

}

javac …
java ..

在dos中设置classpath,指向该class文件

set classpath=%classpath%;c:\beanshell

编写一个 bsh的bat文件,便于dos直接调用beanshell脚本

java bsh.Interpreter %1

编写一个test.bsh脚本

//mytest
import com.app.*;

print(
hello,it’s a beanShell test);

List list  
= new ArrayList();
list.add(
111);
list.add(
222);
list.add(
333);

print(
the list =  + list);

Date date 
= new Date();
print(
the date =  + date);

//method test

add( a, b ) 
{
    
return a + b;
}


foo 
= add(12);            // 3
print(foo =  + foo);
foo 
= add(Oh baby);   // ”Oh baby”
print(foo =  + foo);

//about object
foo() {
    print(
foo);
    x
=5;

    bar() 
{
        print(
foo’s method bar());
    }


    
return this;
}


myfoo 
= foo();    // prints ”foo”
print( myfoo.x ); // prints ”5″
myfoo.bar();      // prints ”bar”

MyShit shit 
= new MyShit();
shit.shit();
shit.main(
null);
print(
do you shit);

//MyShit.haha();

在dos下运行 bsh test.bsh就OK了

另外,beanshell作为动态脚本语言可以结合 spring2.0的新特性,你新写的业务类可以直接修改而不用重新发布,怎么样,是不是比较方便,详细操作请参考Springframework 2.0 与 ZK 混合开发实例

试一试!

详细使用请参考官方文档

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)

2007计划

January 3, 2007

key words: 2007 plans

新的一年开始了,制定一个计划吧

说说你有什么计划

如图:

2007-plans.png

VN:F [1.6.3_896]
Rating: 0.0/10 (0 votes cast)
VN:F [1.6.3_896]
Rating: 0 (from 0 votes)