WireframeSketcher – a UI design plugin for Eclipse

今天又发现了一个UI设计工具--WireframeSketcher,和上一个工具差不多,用来进入界面草图设计,不过WireframeSketcher是一个Eclipse插件,如果开发环境是基于Eclipse,可能会方便很多。

不过也有一些问题,比如没有MenuItem,没有快速搜索Component的功能,在Component列表中不支持滚动。

对于License,也可以通过blog推广的方式来获取,试一下 😀

网站:http://wireframesketcher.com/index.html

Mockups For Desktop

今天在网上发现一个不错的工具,Mockups For Desktop,一款基于Adobe AIR的程序,使用它可以非常快捷地设计出程序界面。

Mockups For Desktop提供了很多“控件”进行选择,Button, Checkbox, Dialog Windows等等,直接拖到设计区域就可以,效果看起来像“手绘”的草图,感觉相当不错。

下面是偶画的一个程序界面:

程序没有右键菜单,感觉挺奇怪的,而且似乎不支持中文字符输入。
售价$79,不过可以通过Blog推广等方式来免费获取注册码。未注册版本还不能保存设计稿,这点相当不爽。

================
2月9日更新:
昨晚发布了日志后,马上给作者发了邮件,告知已经在Blog上进行推广,另外还有右键菜单建议和中文问题,今天就收到了作者的回复,他们会在以后的版本中增加右键功能菜单;如果需要输入中文,则可以在View菜单下,选中Use System Fonts,即可支持中文输入。

使用作者提供的注册码激活后,就可以保存文件了,格式为BMML,其实是一个XML格式的文件。

下载 Mockups For Desktop

在JBoss Seam中使用GWT

这几天在JBoss Seam集成GWT,试了很多时间,总结出一些问题:

JBoss Seam版本:2.1.0.SP1

Google Web Toolkit版本:1.5.3

  1. gwt-servlet.jar版本问题:Seam中自带的gwt-servlet.jar版本可能和你使用的GWT版本不一致,如果你编译GWT程序的版本与Seam中gwt-servlet.jar版本不一致,可能会出现一些奇怪的问题,最好的办法是将Seam中的gwt-servlet.jar换成GWT中带的jar。
  2. Seam Resource Servlet的配置和GWT程序中Service Entry Point的设置:Seam中的默认url pattern是/seam/resource/*,所以Seam会把对/seam/resource/gwt/*的请求发送给org.jboss.seam.remoting.gwt.GWT14Service处理,GWTService才会根据GWT客户端发送的请求类和方法来进行调用。需要注意的是,根据跟踪Seam的GWTService发现,客户端发送的请求类似于“5|0|6|http://127.0.0.1:8080/SeamGWT/|5BA8A5B3E35F40698BB0BF65F390BCF2|com.tiandinet.gwt.hello.client.HelloService|sayHello|java.lang.String|your name|1|2|3|4|1|5|6|”,而Seam的GWTService.getResource会根据com.tiandinet.gwt.hello.client.HelloService名称查找Seam组件,此组件即为GWT中的远程服务接口的Seam实现,所以在设置此实现类的@Name属性时,需要将其设置为GWT中远程服务接口的类名。
    所以,对于Service Entry Point的设置,只要URL能匹配到/seam/resource/gwt/即可,而Seam Reference示例中的String endpointURL = GWT.getModuleBaseURL() + “seam/resource/gwt”;可能不一定正确,因为根据GWT编译后页面路径在Seam应用中所处的位置不同,GWT.getModuleBaseURL()返回的路径可能就不能匹配到/seam/resource/gwt。
  3. Seam Resource Servlet映射
    /web=org.jboss.seam.ui.resource.WebResource
    /captcha=org.jboss.seam.captcha.CaptchaImage
    /remoting=org.jboss.seam.remoting.Remoting
    /gwt=org.jboss.seam.remoting.gwt.GWT14Service
    /graphicImage=org.jboss.seam.ui.graphicImage.GraphicImageResource

Eclipse Ganymede下Subclipse插件的安装

Eclipse Ganymede (Eclipse 3.4)版本出来很久了,一直没有在这个版本上搞定离线安装subclipse插件,不论是link,还是copy到dropins目录,却无法识别插件,今天在Mac上捣鼓时无意间问了Roy一句,他说3.4版本下的插件似乎不能有site.xml文件,否则好象会被认为在线安装。我随手删除掉site.xml,重新启动eclipse,居然装好了 😀

Java中的初始化块

在Java中,有两种初始化块:静态初始化块和非静态初始化块。

静态初始化块:使用static定义,当类装载到系统时执行一次。若在静态初始化块中想初始化变量,那仅能初始化类变量,即static修饰的数据成员。
非静态初始化块:在每个对象生成时都会被执行一次,可以初始化类的实例变量。

非静态初始化块会在构造函数执行时,且在构造函数主体代码执行之前被运行。

package com.tiandinet.studyjava;
 
public class TestInitiateBlock {
 
    {
        System.out.println("In non-static initialization block!");
    };
 
    static {
        System.out.println("In static initialization block!");
    };
 
    public TestInitiateBlock() {
        System.out.println("In Constructor1!");
    }
 
    public void show() {
        System.out.println("In show()!");
    }
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        TestInitiateBlock ti = new TestInitiateBlock();
        ti.show();
    }
 
}

运行结果:
In static initialization block!
In non-static initialization block!
In Constructor1!
In show()!

Linux下安装memcached和编译PHP扩展

虽然之前一直做PHP的开发,但一直没有用过memcache,仅是知道一些简单的原理。今天突然来兴趣,想试一下memcache,和PHP下的调用。

1. 安装memcached (服务器版本1.2.6)

服务器OS是RHEL5(Red Hat Linux Enterprise 5),之前已经装好LAMP环境,这是我们的一台测试服务器,LAMP均位于/opt/lamp下。准备将memcached安装在/opt/cache/memcached目录下。

memcached需要libevent(http://monkey.org/~provos/libevent/)的支持,所以需要先安装libevent,安装目录位于/opt/cache/libevent,下载最新版本的libevent(此例中为1.4.8),解压后进入源代码目录,进行配置和安装。

./configure --prefix=/opt/cache/libevent
 
make
 
make install

接着安装memcached,使用的版本是1.2.6,进入解压后的源代码目录,

./configure --prefix=/opt/cache/memcached --with-libevent=/opt/cache/libevent

–with-libevent指令指定libevent的目录
继续阅读“Linux下安装memcached和编译PHP扩展”

解决自定义文件上传处理与Spring MultipartResolver的冲突问题

  在原项目中,对文件上传的处理并不是使用Spring的MultipartResolver,而是使用自定义的MultiPartFilter和HttpServletRequestWrapper结合来进行处理。

  MultiPartFilter是一个定义在web.xml中的<filter>,原理是通过判断HttpServletRequest中的contentType是否包含”multipart/form-data”,若代码中包含此字符品,则表明是一个File Upload请求,就使用JakartaMultiPartRequest来对HttpServletRequest对其进行包装。

  其代码如下:

public class MultiPartFilter extends GenericFilterBean {
 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
 
		HttpServletRequest request = (HttpServletRequest) servletRequest;
 
		String content_type = request.getContentType();
		if (content_type != null && content_type.indexOf("multipart/form-data") != -1) {
			JakartaMultiPartRequest jakartaMultiPartRequest = new JakartaMultiPartRequest(request,
					getFilterConfig().getInitParameter("saveDir"), Integer.valueOf(
							getFilterConfig().getInitParameter("maxUploadSize")).intValue());
 
			request = jakartaMultiPartRequest;
		}
 
		filterChain.doFilter(request, servletResponse);
    }
 
}

  JakartaMultiPartRequest类继承自HttpServletRequestWrapper,在其构造方法中,我们对Request进行分析,并且保存用户上传的文件,将文件名等信息放到Request的attribute中,从而在后续的代码中可以对上传的文件进行处理。

  但在后来客户进出的对产品图片处理的新需求中,因为JakartaMultiPartRequest的问题,没有办法满足我们的要求,所以考虑到使用Spring的MultipartResolver来进行上传处理,但之前的代码不能再进行改动,否则所有处理文件上传的Controller必须更改,代价很大。但如果在Spring中进行配置MultipartResolver的配置后,发现我们旧的文件上传代码都失效了,无法上传文件。
继续阅读“解决自定义文件上传处理与Spring MultipartResolver的冲突问题”

JSF Converter in JBoss Seam

折腾了两天,终于在JBoss Seam中搞定了JSF Converter。

在这个程序中,产品(Product)和分类(Category)是多对多的关系,关系维护方为产品,在创建产品时,允许选择多个分类,因为Product.categories是一个List属性,同时产品选择<select />标签也是由从Action中查询出来的所有Category的List,所以在页面上,需要在页面渲染、用户提交后的category进行转换。

显示时,我们以Category.id为<option />的value值,而Category.title为label。

Entity如下(省略setter和getter):

Category.java

@Entity
@Table(name = "category")
public class Category extends BaseEntity {
 
	@Id
	@GeneratedValue
	@Column(name = "id", unique = true, nullable = false, length = 10)
	private Integer id;
 
	@Column(name = "title")
	@NotNull
	@Length(min = 4, max = 64, message = "{invalid.length}")
	private String title;
 
	@ManyToMany(mappedBy = "categories")
	private List<product> products = new ArrayList</product><product>();
}
</product>

继续阅读“JSF Converter in JBoss Seam”

Pages:  1 2 3 4 5 6