posts - 193,  comments - 520,  trackbacks - 0
 
把firefox下js程序向ie兼容,一直用firefox调试,今天在ie下跑跑遇到了很多问题。
1.程序中用到prototype.js,对于事件监听,我一直这样处理
Event.observe(job.jobDiv.timeDiv, "mousedown", eway.TimeTableDiv.selectMoveJobDiv);
在firefox下完全正常,但在ie下就找不到视图所附加的对象了,改回来
job.jobDiv.timeDiv.onmousedown= eway.TimeTableDiv.selectMoveJobDiv
这样两个浏览器都可以跑。附一个简单的测试
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>    
<title></title>
<script src="lib/prototype/prototype.js" type="text/javascript"></script>
<script>
window.onload
=function(){
  
var b=new Button("wokao",$('simple'));
  }  
function Button(value,domEl){
  
this.domEl=domEl;
  
this.value=value;
  
this.domEl.buttonObj=this;
//  this.domEl.onclick=this.clickHandler;
  Event.observe(this.domEl, "mousedown"this.clickHandler);
}

Button.prototype.clickHandler
=function(){
  
var buttonObj=this.buttonObj;
  
var value=(buttonObj && buttonObj.value) ?
    buttonObj.value : 
"unknown value";
  alert(value);
}
</script>
<div class="resizeMe" id="simple">
    
<p>This is just a clean DIV</p>
</div>
</body>
</html>
2.处理td的跨行和跨列,都必须这样写
td.setAttribute("rowSpan",2);
td.setAttribute(
"colSpan",2);
注意rowSpancolSpan中间字母都是大写的,而写成rowspan,colspan在firefox下是没有任何问题的。
3.在拖拽层的时候会出现鼠标经过的文字被选中的现象,解决这个问题非常简单,当你开始拖拽前即你用鼠标点中你想要拖拽的层,这时候对事件进行处理
e=e||window.event;
if(e.stopProgation){
e.stopPropagation();
}
else{
e.cancelBubble 
= true;
}
if(e.preventDefault){
e.preventDefault();
}
else{
e.returnValue 
= false;

如果使用
prototype.js,可以简单为一行代码
Event.stop(e);

posted @ 2007-02-13 19:07 ronghao 阅读(1441) | 评论 (0)编辑 收藏
昨天发了个很什么的随笔,今天把与集群有关的东西搜了搜。整理一下。
什么是集群,集群的概念。下面这个BLOG讲的非常清楚:
http://blog.csdn.net/ESoftWind/archive/2006/10/19/1341089.aspx
web层次的集群方案讨论,看完javaeye相关的讨论,你会大概了解:
http://www.javaeye.com/topic/20298
注意里面robbin的无共享架构(Share Nothing Architecture)SNA。
web层次的集群主要技术就是:负载均衡和http session的失败转移。
负载均衡不再多说,焦点在于http session的失败转移。各个节点的http session复制会极大的影响性能。如何避免,robbin提出保持每个节点的无状态性,不再使用Session来保持全局状态。用户标示从cookie取得,假设不使用分布式Cache,session直接放在数据库中。他推荐了memcached作为分布式Cache,这样在从数据库读取session时中间又隔了一层Cache来提高性能。
大致的方法是这样:用户登陆的时候给他一个cookie,存放userId,同时给这个用户分配一个Session,存放user对象,然后 把这个session保存到数据库和分布式 Cache里。黏性会话。写一个filter或者 webwork拦截器对用户请求进行拦截,如果他有cookie,但是session里面没有user对象,说明前一个节点down掉了,就根据 cookie里面的userId查数据库或者是分布式 Cache获得先前保存的session,把原先的session复制到他的新session里面。这样各个节点间的 session就不用复制,因为 session是没有状态的。我们的程序对使用session不受影响,只是session里的对象要可序列化,当改变session里的对象时需要同步 到cache和数据库。当然,效率的原因,session里面东西越少越好,越稳定越好。
谁有这方面的经验?
posted @ 2007-02-12 23:18 ronghao 阅读(1294) | 评论 (0)编辑 收藏
最近要开发一个与拍卖有关的大访问量交易网站。一直做电子政务,对这方面没有任何经验。一开始考虑用php,mysql开发,后来由于觉得和交易相关,数据的一致性和安全一定很重要,最后考虑用java开发。
我不清楚在做这个开发时和平时相比有哪些需要注意的地方,我想到的有:
1.webwork+spring+hibernate这种组合方式是否可行。据说tobao用了ejb,虽说个人并未觉得ejb哪点好,但别人 既然用了就肯定有它的一定道理;
2.数据的缓存肯定是必须的,但哪些是最需要被缓存的数据?
3.dba肯定需要,在没有dba的情况下,涉及数据库时应该注意什么;
4.这样的一个系统,它的性能肯定非常主要。它最有可能的瓶颈会发生在什么地方?
5.我们的理想工期会有多长,3到5个开发人员。
6.jms远程异步调用的支持。
目前想到的大概这些,希望有经验的朋友给些建议。我对这个项目目前还没有很大的把握。
posted @ 2007-02-10 11:41 ronghao 阅读(2607) | 评论 (9)编辑 收藏
这个礼拜一直在写日历。把以前的JS全部推翻了,重新再写。开发工具使用了aptana,调试用firefox的javascript debugger.aptana开始使用的时候还是挺爽,随着代码量的增长,然后经常是代码高亮显示不了了,更不要说提示了。这点IDEA6.0显然要更加完善,直接可以方便的查找调用的函数。但是IDEA太笨重,不清爽。aptana写CSS还是相当方便的。
开始使用stripes,一切看起来都不错。
在家里安装了subvision ,可是怎么也跑不起来,难道人品有问题?去年在公司配过一次,一点问题都没有的。
火车票还没着落,着急!
明天公司开年会,要集体K歌,嗓子不好,准备合唱。
posted @ 2007-02-08 23:39 ronghao 阅读(619) | 评论 (0)编辑 收藏
获得列表
在上一步中我们已经把数据保存到了内容仓库中,那我们如何确定数据确实保存进去了呢?getBlogList() 这个方法将返回根节点下所有名为blogEntry.的子节点。
public ArrayList getBlogList() throws BlogApplicationException {
    Session session 
= JackrabbitPlugin.getSession();
    ArrayList blogEntryList 
= new ArrayList();
    Node rootNode 
= session.getRootNode();
    NodeIterator blogEntryNodeIterator 
= rootNode.getNodes();

    
while (blogEntryNodeIterator.hasNext()) {
        Node blogEntry 
= blogEntryNodeIterator.nextNode();
        
if (blogEntry.getName().equals("blogEntry"== false)
            
continue;
        String title 
= blogEntry.getProperty("title").getString();
        String blogContent 
= blogEntry.getProperty("blogContent").getString();
        Value creationTimeValue 
= (Value) blogEntry.getProperty(
                
"creationTime").getValue();
        String userName 
= blogEntry.getProperty("userName").getString();
        BlogEntryDTO blogEntryDTO 
= new BlogEntryDTO(userName, title,
                blogContent, creationTimeValue.getDate());
        blogEntryList.add(blogEntryDTO);
    }
    
return blogEntryList;
}

一旦你获得了根节点这个对象,你就可以通过调用getNodes()这个方法来获取它所有的子节点。如果这个节点没有子节点,将返回一个空的NodeIterator 对象。我们可以遍历这个NodeIterator 对象来获得名为blogEntry 的节点集合,然后通过getProperty()方法来获得节点上的属性,即我们保存的真实数据。getProperty()方法返回Value对象的一个实例。因为存储数据类型的不同,所以返回的Value对象实例是不同的。根据不同的数据类型,你应该调用特定的方法来获取数据,比如getString()来获取字符串,而getDate()获得一个日期。

查找内容(用XPath的方式)
JSR-170定义了两种方式来查找内容(也可以理解为查找节点)。一种使用XPath语法,另一种使用SQL语法。JSR-170要求Level 1必须实现XPath的方式,而SQL的方式则作为一个可选的功能。

XPath原本是一种设计用来查找XML元素的语言。因为我们的workspace是树状的结构,很像XML。所以XPath语法非常适合于在这里查找内容。下面的代码演示了通过作者名来查找节点。
Session session = JackrabbitPlugin.getSession();
    Workspace workSpace 
= session.getWorkspace();
    QueryManager queryManager 
= workSpace.getQueryManager();

    StringBuffer queryStr 
= new StringBuffer(
            
"//blogEntry[@"+PROP_BLOGAUTHOR +"= '");
    queryStr.append(userName);
    queryStr.append(
"']");
    Query query 
= queryManager.createQuery(queryStr.toString(),
            Query.XPATH);

    QueryResult queryResult 
= query.execute();

    NodeIterator queryResultNodeIterator 
= queryResult.getNodes();
    
while (queryResultNodeIterator.hasNext()) {

        Node blogEntry 
= queryResultNodeIterator.nextNode();
        String title 
= blogEntry.getProperty(PROP_TITLE).getString();
        String blogContent 
= blogEntry.getProperty(PROP_BLOGCONTENT).getString();
        Value creationTimeValue 
= (Value) blogEntry.getProperty(
                PROP_CREATIONTIME).getValue();
        BlogEntryDTO blogEntryDTO 
= new BlogEntryDTO(userName, title,
                blogContent, creationTimeValue.getDate());
        blogEntryList.add(blogEntryDTO);
    }

首先获得session 对象,通过它获得它连接的workspace,然后就可以通过workspace获得这个workspace的QueryManager 。QueryManager 接口定义了很多用来查询的方法。接下来我们要做的是创建一条查询语句。我们这里这样写"//blogEntry[@blogAuthor='<bloggerName>'"。这句话的意思是查找所有名为blogEntry ,含有blogAuthor 属性且属性值为<bloggerName>的节点。具体可以看JSR-170规范。

通过queryManager's createQuery()方法创建一个查询对象,这个方法需要两个参数,一个是我们的查询语句,另一个是查询的方式,这里使用XPath。获得这个Query 查询对象后,调用它的execute() 方法开始执行查询,返回一个QueryResult 对象。注意,查询的结果受到当前session的限制,换句话说,就是如果这个session没有权限查看一个特定的节点,哪怕这个节点满足我们查询的条件,在我们的查询结果里也是看不到这个节点的。所有的查询数据来自于该workspace已经持久化的数据,哪些已经改变但还没有通过session.save()(item.save())持久化到workspace的数据不在查询之列。获得QueryResult 对象后,我们就可以通过调用getNodes()方法来获得符合查询条件的节点的一个遍历。

剩下的两个未实现的方法是updateBlogEntry() 和 removeBlogEntry(),它们实现起来都很简单。我们把BOLG 标题作为主键,通过标题来获得相关的节点。在updateBlogEntry()方法里,我们直接设定需要改变的属性;在 removeBlogEntry()方法里,我们获得目标节点后直接在节点上调用remove()方法。最后别忘了一定要调用session.save()方法把我们改变的数据持久化。

处理二进制内容
对内容仓库来说,处理二进制内容是个很基本的要求,比如说图片。现在我们的示例程序容许给每个BLOG附加一张图片。下面分别是附加图片和获取图片的方法。
public void attachFileToBlogEntry(String blogTitle,
  InputStream uploadInputStream) 
throws BlogApplicationException {
    Session session 
= JackrabbitPlugin.getSession();
    Node blogEntryNode 
= getBlogEntryNode(blogTitle, session);
    blogEntryNode.setProperty(PROP_ATTACHMENT, uploadInputStream);
    session.save();

}
public InputStream getAttachedFile(String blogTitle) throws BlogApplicationException {
    InputStream attachFileIS 
= null;
    Node blogEntryNode 
= getBlogEntryNode(blogTitle);
    Value attachFileValue 
= (Value) blogEntryNode.getProperty(PROP_ATTACHMENT).getValue();
    attachFileIS 
= attachFileValue.getStream();
  
return attachFileIS;
}

正如你看到的那样,我们的代码在处理二进制内容和一般内容间并没有什么太大的区别。仅仅一点不同的是你要通过InputStream 对象来保存和获取二进制数据。在我们的配置文件里关于persistent manager会有一个externalBLOBs 属性。把这个属性设为true, 图片将会保存在文件里,相反则会保存在数据库的blob字段里。

总结
到这里,我们对 JSR-170, Jackrabbit以及如何使用 JSR-170 API开发一个简单的应用程序都有了大概的了解。我们的讨论更多的在于基础。相信大家一定会对内容仓库有个初步的认识。
posted @ 2007-01-28 23:55 ronghao 阅读(1841) | 评论 (3)编辑 收藏
仅列出标题
共39页: First 上一页 25 26 27 28 29 30 31 32 33 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

关注工作流和企业业务流程改进。现就职于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

常用链接

留言簿(38)

随笔分类

随笔档案

文章分类

文章档案

常去的网站

搜索

  •  

最新评论

阅读排行榜

评论排行榜