• struts2的时间格式转换问题

    struts2提供了一个时间标签:

     但这个标签很只能在显示的时候用,但如果我想在输入框里显示时间,让用户直接修改时间,怎么弄?datepicker?选择太麻烦,我想让用户输入,并且
    兼容多种日期格式。还有,如果用时间标签的话,每个地方都需要指定format,如果我想修改一下格式,所有的时间显示都变,怎么弄?

    *  In some situations you may wish to apply a type converter globally.
     *  This can be done by editing the file
     * xwork-conversion.properties in the root of your class path
     * (typically WEB-INF/classes) and providing a
     * property in the form of the class name of the object you wish to convert
     * on the left hand side and the class name of
     * the type converter on the right hand side. For example, providing
     * a type converter for all Point objects would mean
     * adding the following entry:
     *
     * com.acme.Point = com.acme.PointConverter
    

     XWorkConverter,先在classpath root下找xwork-conversion.properties文件,这个文件定义了全局转换。然后每遇到新的类需要转换,便查找是否有特殊的自定义转换配置。特殊自定义转换配置文件的路径是:

    className.replace('.', '/')   "-conversion.properties";
    

     比方com.acme.Point的转换配置就是classpath 下的/com/acme/Point-coversion.properties文件。

    ok,这个问题好解决了。

    我的xwork-coversion.properties文件:

    java.util.Date=cn.jolstar.struts.type.DateTypeConverter
    

      我的DateTypeConverter代码:

    /**
     *
     */
    package cn.jolestar.struts.type;
    
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;
    
    import org.apache.log4j.Logger;
    import org.apache.struts2.util.StrutsTypeConverter;
    
    /**
     * @author jolestar
     *
     */
    public class DateTypeConverter extends StrutsTypeConverter {
    
    	private static final Logger log = Logger.getLogger(DateTypeConverter.class);
    	public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    
    	//暂时只考虑这几种日期格式
    	public static final DateFormat[] ACCEPT_DATE_FORMATS = {
    			new SimpleDateFormat(DEFAULT_DATE_FROMAT),
    			new SimpleDateFormat("yyyy年MM月dd日"),
    			new SimpleDateFormat("yyyy/MM/dd") };
    
    	/**
    	 *
    	 */
    	public DateTypeConverter() {
    	}
    
    	/*
    	 * (non-Javadoc)
    	 *
    	 * @see org.apache.struts2.util.StrutsTypeConverter#convertFromString(java.util.Map,
    	 *      java.lang.String[], java.lang.Class)
    	 */
    	@Override
    	public Object convertFromString(Map context, String[] values, Class toClass) {
    		if (values[0] == null || values[0].trim().equals(""))
    			return null;
    		for (DateFormat format : ACCEPT_DATE_FORMATS) {
    			try {
    				return format.parse(values[0]);
    			} catch (ParseException e) {
    				continue;
    			} catch (RuntimeException e) {
    				continue;
    			}
    		}
    		log.debug("can not format date string:"   values[0]);
    		return null;
    	}
    
    	/*
    	 * (non-Javadoc)
    	 *
    	 * @see org.apache.struts2.util.StrutsTypeConverter#convertToString(java.util.Map,
    	 *      java.lang.Object)
    	 */
    	@Override
    	public String convertToString(Map context, Object o) {
    		if (o instanceof Date) {
    			SimpleDateFormat format = new SimpleDateFormat(
    					DEFAULT_DATE_FORMAT);
    			try {
    				return format.format((Date) o);
    			} catch (RuntimeException e) {
    				return "";
    			}
    		}
    		return "";
    	}
    
    }
    

     

    这样,从字符串转换为日期对象的时候,会尝试上面列出的多种日期格式,但输出的时候,则会统一按照DEFAULT—DATE—FORMAT转换。 需要修改格式,只需要修改DEFAULT—DATE—FORMAT。当然,你也可以把它方在配置文件里,便于修改。

     

    了解了这一点,其实也就 明白了struts的类型转换模式。然后,无论是字符串id到持久化对象的转换,还是自定义的字符串到对象之间的转换,都容易了。

  • Dspace架设经验

    1.Dspace是什么?
          dspace.org
          The DSpace digital repository system captures, stores, indexes, preserves, and distributes digital research material.
          简单一点,Dspace是一个数字图书馆系统,一般用于研究机构储存和发布研究资源.

    2.Dspace的安装:
       windows
        wiki.dspace.org/index.php/DSpaceOnWindows
        linux:
        wiki.dspace.org/index.php/Installing_DSpace_on_Ubuntu_6.06_(LTS)

    3.Dspace架设的一些经验
         我当时使用的版本是dspace3.2
        中文问题
         Dspace会把每个item的标题和作者的首字母截取下来,做为按字母索引.但这对中文就不起作用了.所以我用pinyin4j这个开源项目,把标题和作者转换为拼音,然后截取首字母.
         邮件验证问题
         Dspace中只让用户设置邮件服务器,但并没让设置用户和密码,所以你必须用自己的邮件服务器.这个可以修改一下org.dspace.core.Email类的源码,加入验证.在代码Transport.send(message)处,加入以下代码:

    java 代码

    //jolestar add for mail auth
             String user = ConfigurationManager.getProperty("mail.user");
             String password = ConfigurationManager.getProperty("mail.password");
             Transport transport=session.getTransport("smtp");
             if(user==null||password==null)
             {
                 user = "";
                 password="";
             }
             transport.connect(server,user,password);
             transport.sendMessage(message,message.getAllRecipients());
             transport.close();
    
             //Transport.send(message); 
    

     并将上面那行代码注释了.在配置文件中就可以用mail.user和mail.password配置邮件用户了.不过这个问题在最新版的dspace中已经不存在了.

  • struts2 checkboxlist 的一个问题

    下面是java对象。

    package cn.jolestar.struts;
    
    /**
     * @author jolestar
     *
     */
    public class Language {
    
    	private Long id;
    	private String name;
    
    	/**
    	 *
    	 */
    	public Language() {
    	}
    
    	public Long getId() {
    		return id;
    	}
    
    	public void setId(Long id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result   ((id == null) ? 0 : id.hashCode());
    		return result;
    	}
    
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		final Language other = (Language) obj;
    		if (id == null) {
    			if (other.id != null)
    				return false;
    		} else if (!id.equals(other.id))
    			return false;
    		return true;
    	}
    
    }
    

     

     

     

    package cn.jolestar.struts;
    
    import java.util.List;
    
    /**
     * @author jolestar
     *
     */
    public class Album {
    
    	private Long id;
    	private String name;
    	private List languages;
    	/**
    	 *
    	 */
    	public Album() {
    	}
    	public List getLanguages() {
    		return languages;
    	}
    	public void setLanguages(List languages) {
    		this.languages = languages;
    	}
    
    }
    

     

     下面是jsp标签:

     

     

     

     

    action中有个getLanguages()方法,返回数据库中的所有语言。按道理我编辑Album的时候,checkboxlist中Album的已经拥有的语言会自动选中。但怎么弄,它就是不选中。没办法,看了一下struts2的相关源码,才明白了。

     

    struts2 checkboxlist 的freemarker模板:

     

    ${itemValue?html}
        
    
       
    

     

     if tag.contains(parameters.nameValue,
    itemKey)这个if语句决定该checkbox是否选中。tag.contains()最终调用的是
    org.apache.struts2.util.ContainUtil中的这个方法:

     

    public static boolean contains(Object obj1, Object obj2) {
            if ((obj1 == null) || (obj2 == null)) {
                //log.debug("obj1 or obj2 are null.");
                return false;
            }
    
            if (obj1 instanceof Map) {
                if (((Map) obj1).containsKey(obj2)) {
                    //log.debug("obj1 is a map and contains obj2");
                    return true;
                }
            } else if (obj1 instanceof Collection) {
                if (((Collection) obj1).contains(obj2) || ((Collection) obj1).contains(obj2.toString())) {
                    //log.debug("obj1 is a collection and contains obj2");
                    return true;
                }
            } else if (obj1.getClass().isArray()) {
                for (int i = 0; i < Array.getLength(obj1); i  ) {
                    Object value = null;
                    value = Array.get(obj1, i);
    
                    if (value.equals(obj2)) {
                        //log.debug("obj1 is an array and contains obj2");
                        return true;
                    }
                }
            } else if (obj1.toString().equals(obj2.toString())) {
                //log.debug("obj1 is an object and it's String representation equals obj2's String representation.");
                return true;
            } else if (obj1.equals(obj2)) {
                //log.debug("obj1 is an object and equals obj2");
                return true;
            }
    
            //log.debug("obj1 does not contain obj2: "   obj1   ", "   obj2);
            return false;
        }
    

     

     

    tag.contains(parameters.nameValue,
    itemKey)的参数parameters.nameValue是該标签的值,在这里就是album.languages,
    parameters.list
    是languages,itemKey是循环中的当前language的id。album.languages包含的是Language对象,而
    struts2却在其中查找itemKey–就是Language的id,当然就无法查找到,所以不能自动选中。

     

    我把checkboxlist的模板改了一下。

     

    ${itemValue?html}
    	
    
      &nbsp;
    

     就是将tag.contains(parameters.nameValue,
    itemKey)改成了tag.contains(parameters.nameValue,it),it就是当前循环的Language对象,在
    struts2的iterator 标签里设置

     

    .(注意:如果是最新版的struts2,应该用var 而不是id).

     

    这样就好了。需要注意的是language必须正确overwrite  equals和hashCode方法。

     

  • SUSE10.3的桌面

     

       虽然认识linux也有三年多了,但这三年多里,从windows到linux,不习惯,再换到windows,兴趣来了,再换过来。翻来覆去,折
    腾了好多遍。终于在半年前完全抛弃了windows,转移到linux下来。linux和windows是两种不同的思维方式,思维方式换了,别的就都习
    惯了。最近把我的笔记本的系统升级到suse10.3,贴几张桌面截图。

       我的笔记本是联想F40A,装上suse之后,除了声卡需要特别配置,别的都完全正常使用,包括无线网卡以及蓝牙。因为声卡用了一个微软的啥UAA技术,windows下安装声卡驱动都要先装那个UAA驱动。
    当然,那些鸡肋似的按钮是没办法用了。所以建议打算买本装linux的朋友们优先考虑预装linux的笔记本。

     

     

  • javascript获取网页元素的最终样式

        今天遇到个问题,用js获取网页元素的样式,如果直接用 document.getElementById(“idname”).style
    获取的话,只能获取该元素的专有样式,即在该元素上直接用style=“”指定的样式,而无法获取由class设置的和从上级元素继承来的样式,也就是浏
    览器生成dom后最终的样式,所以很头痛。网上搜索了一下,找到一个办法。

         
         
         div.special{
          background-color:red;
          height:50px;
          width:50px;
          margin:10px;
         }
        
        
        function getBackgroundColor()
        {
         var oDiv=document.getElementById("div1");
         alert(oDiv.currentStyle.backgroundColor||document.defaultView.getComputedStyle(oDiv,null).backgroundColor);
        }
        
        
        
        
        
          
        
          
    

     

    注意:oDiv.currentStyle.backgroundColor是IE使用的方法,document.defaultView.getComputedStyle(oDiv,null).backgroundColor是DOM使用的方法。

           内容来源:http://blog.tianya.cn/blogger/post_show.asp?BlogID=666817&PostID=7224874&idWriter=0&Key=0

  • 读巴别塔之犬

    去书店逛,本来是要找本计算机方面的书的,但出来后瞄了一眼热门书榜,一本薄薄的书吸引了我,主要是封面上那短短的几十字介绍:

    写道

    一个女人从苹果树上坠地身亡。
    是意外还是自杀?无人知晓。
    唯一的目击者,就是她心爱的狗。
    女人的丈夫是一位语言学家,
    哀伤又困惑的他,
    思念妻子却无从得知她真正的死因。
    他决定以自己毕生的研究,
    教这只狗开口说话,
    让它道出事情的真相…..

     

    于是买了本回来。

            基本是一口气读完的,开始的时候还想着女人的死因和这只狗到底会说话了么?但到后来这些都不重要了。

            作者并没有直接描写那个女人—露西,而是通过女人的丈夫,那个语言学家,也就是保罗的回忆,慢慢一点一点在大家的想象中勾勒出了这个女人,一个精灵般的女人,一个很难用语言形容的女人,一个不属于这个现实世界的女人。

            有人说这本小说是本爱情小说,我不同意,你不能因为小说描写了爱情就是爱情小说,这都是人们的帖标签习惯带来的。好的小说或者作品就是一个鲜活的生命,有很多种可能,有很多种表现,能给你带来无限的思考空间,很难用一个简单的标签来区分的。

          
    “其实书里想要表达的东西并不是这个,巴别塔象征了人和人之间难以融通的隔阂,主人公保罗所要面对的不是如何让他家的狗开口说话的难题,而是他和妻子间幸福生活下潜藏着的观念鸿沟。他们彼此相爱,但并不能彼此理解,对于生活习惯和爱好的争端从未停止。保罗深爱妻子露西,因为她带给他惊喜和快乐,但他忽略了在快乐表面下露西那颗伤痕累累的心。在断断续续讲述自己过去的时候,露西渴望抚慰,然而保罗没有给。在冲着像自己孩子一样的面具发火时,露西渴望理解,但保罗没有给。 ”——-摘自豆瓣()

           但我觉得并非保罗不理解露西,而是保罗不善于表达,虽然他是个语言学家,甚至想让狗说话。当保罗看到露西做的第一个面具时,那个面具带给保罗内心的震动,我想他理解了露西在用面具阐释的生命和死亡的关系,但当表述为语言时,两个人的理解就发生歧义了。当露西认为保罗不理解她,冲着面具发火并把面具扎碎时,我竟然能体会到保罗的那种心碎的感觉。我想他当时一定非常恨上帝,恨上帝造人的时候为什么只能让人用语言交流?而相对于人的内心,语言本身又是如此的苍白无力。

          每个人都是孤独的。

subscribe via RSS