文章列表
 
2010-02-24 15:11
<local-tx-datasource>
<jndi-name>auditDatasource1</jndi-name>
<use-java-context>false</use-java-context>
<connection-url>jdbc:sqlserver://my-sqlserverDB:1433</connection-url>
<driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
<user-name>sa</user-name>
<password>pass</password>

<min-pool-size>5</min-pool-size>
<max-pool-size>100</max-pool-size>
<blocking-timeout-millis>5000</blocking-timeout-millis>
<idle-timeout-minutes>15</idle-timeout-minutes>

    <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MSSQLValidConnectionChecker</valid-connection-checker-class-name>
<check-valid-connection-sql>select getdate()</check-valid-connection-sql>
<new-connection-sql>select getdate()</new-connection-sql>


</local-tx-datasource>
 
2009-11-19 8:45

  Stateless Bean Stateful Bean Entity Bean Java Bean Message-driven Bean  
默认Context Stateless Conversation Conversation Event /  
实例 每次请求,从实例池中,取出一个新的实例 每个客户端,对应一个实例 多个实例 每次请求,创建一个新实例(如果该实例已经和客户端分离) /  
             
  Stateless context Event context Page context Conversation context Session context Application context
多线程(多客户端并发) 上下文无关(多线程,遵循实力池化的原则) 单线程 单线程 通过把同一个长时间运行的对话上下文中的并发请求序列化来实现每对话单线程 多线程,Session范围内的组件总是被Seam保护以防止并发操作,Seam默认把针对Session范围的Session Bean和JavaBean的请求序列化 多线程

context中其实保有的也只是Bean的引用,所以即使它被放到了某一个context中,其他的进程还是有可能调用该Bean的实体的,所以你不可能通过把stateless放到page,session等scope中,来保存用户数据的。

 
2009-10-28 17:08
当页面触发onunload事件时,判断richfaces fileUpload控件中文件是否已经全部上传完成:

<script type="text/javascript">
<!--
window.onbeforeunload = function (){
var entries = $('upload:hoyobaUpload').component.entries;

var photoNumber = entries.length;
var pendingNum = 0;

for(i = 0; i < photoNumber; i++){
if(entries[i].state == FileUploadEntry.INITIALIZED ||
entries[i].state == FileUploadEntry.UPLOAD_IN_PROGRESS ||
entries[i].state == FileUploadEntry.READY){
pendingNum ++;
}
}

if(pendingNum > 0){
return '照片还没有全部上传完成,离开页面您将需要重新上传未完成的照片。';
}
};
-->
</script>
 
2009-10-28 9:58
在seam中使用richfaces的fileupload,是需要进行少许的配置的,否则有些功能是不work的,比如:限制文件的大小。
配置如下:
1. 在web.xml中添加或修改:
功能:限制上传文件大小3MB,如果上传大文件就要设定createTempFiles为true
<filter>
<filter-name>Seam Filter</filter-name>
<filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
<init-param>
<param-name>createTempFiles</param-name>
<param-value>true</param-value>
</init-param>

<init-param>
<param-name>maxRequestSize</param-name>
<param-value>3145728</param-value>
</init-param>
</filter>

2. FileUpload控件代码如下:
<rich:fileUpload
id="hoyobaUpload"
addControlLabel="选择图片"
cancelEntryControlLabel="取消"
clearAllControlLabel="清除已完成"
clearControlLabel="清除"
doneLabel="已完成"
sizeErrorLabel="上传失败,图片最大不能超过3MB"
stopControlLabel="全部停止"
stopEntryControlLabel="停止"
transferErrorLabel="上传出错啦,可能您的网络连接不稳定或者出现了未知的错误"
uploadControlLabel="上传"
allowFlash="true"
autoclear="true"
maxFilesQuantity="100"
listWidth="580"
listHeight="315"
noDuplicate="true"
acceptedTypes="gif,jpg,png"
fileUploadListener="#{uploadPhotoAction.uploadPhoto}"
styleClass="hoyobaUpload">
<f:facet name="label">
<h:outputText value="正在上传  {_KB}KB / {KB}KB" />
</f:facet>
</rich:fileUpload>
 
2009-10-19 16:50
<rich:fileUpload allowFlash="true" maxFilesQuantity="50" listHeight="200px"
listWidth="500px" noDuplicate="true" cancelEntryControlLabel="取消" clearAllControlLabel="全部清除" clearControlLabel="清除"
stopControlLabel="全部停止" uploadControlLabel="开始上传" addControlLabel="选择照片" doneLabel="完成" sizeErrorLabel="文件超过最大限制(2MB)"
transferErrorLabel="上传出错" stopEntryControlLabel="停止">

如果想在添加文件时判断文件大小可以使用如下方法:
添加onadd 方法,onadd="checkFileSize(event.memo.entries);"
/**
* Each file max size 2MB
**/
function checkFileSize(entries) {
var containMax = false;
if (entries.length == 0) {
return;
} else {
for (var i = 0; i < entries.length; i++) {
if (entries[i].size > 2097152) {
containMax = true
entries[i].uploadObject.clear(entries[i]);
}
}

if(containMax){
alert("您选中的照片中,大小超过2MB的,将不会被上传。");
}
}
}

实例站点:www.hoyoba.com
 
2009-10-19 16:46

Java被设计为跨平台的语言,在内存管理上,显然也要有一个统一的模型 (JMM: Java Memory Model)。而且Java语言最大的特点就是废除了指针,把程序员从痛苦中解脱出来,不用再考虑内存使用和管理方面的问题。可惜世事总不尽如人意,虽然JMM设计上方便了程序员,但是它还是增加了虚拟机的复杂程度。

根据JMM的设计,系统存在一个主内存(Main Memory)Java中所有类变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中类变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。

线程若要对某变量进行操作,必须经过一系列步骤:首先从主存复制/刷新数据到工作内存,然后执行代码,进行引用/赋值操作,最后把变量内容写回Main MemoryJava语言规范(JLS)中对线程和主存互操作定义了6个行为,分别为loadsavereadwriteassign use,这些操作行为具有原子性,且相互依赖,有明确的调用先后顺序。

JMM的角度来重新审视synchronized关键字。
假设某条线程执行一个synchronized代码段,其间对某变量进行操作,JVM会依次执行如下动作:

(1) 获取同步对象monitor (lock)
(2)
从主存复制变量到当前工作内存 (read and load)
(3)
执行代码,改变共享变量值 (use and assign)
(4)
用工作内存数据刷新主存相关内容 (store and write)
(5)
释放同步对象锁 (unlock)

可见,synchronized的另外一个作用是保证主存内容和线程的工作内存中的数据的一致性。如果没有使用synchronized关键字,JVM不保 证第2步和第4步会严格按照上述次序立即执行。因为根据JLS中的规定,线程的工作内存和主存之间的数据交换是松耦合的,什么时候需要刷新工作内存或者更 新主内存内容,可以由具体的虚拟机实现自行决定。如果多个线程同时执行一段未经synchronized保护的代码段,很有可能某条线程已经改动了变量的 值,但是其他线程却无法看到这个改动,依然在旧的变量值上进行运算,最终导致不可预料的运算结果。

讨论完了JMM,现在回到Web Framework上来,我们拿Struts 2.0EJB 3.0来进行对比分析其线程的安全性。

使用Struts 2.0,我们通常会对action class声明为@Scope("prototype"),意思是为每一个请求创建一个新的实例,这样我们就可以在action中使用类变量,而不会在并发访问的时候发生数据安全的问题。如果不作此声明,那么每一个请求,都会返回同一个action实例,那么上次调用的结果,也会在改实例中保留,此时如果使用了类变量,那么就有可能存在数据安全的隐患。

在并发问题的处理上,我觉得EJB 3.0的处理方式是比较好的。相对于StrutsactionEJB 3.0提供了Stateless Stateful 两种Session bean

对于StatelessEJB采用实例池化的方式来处理,客户端不会直接的和Stateless打交道,而是通过容器来决定,到底使用哪个实例来响应用户的请求。用完后,即放入到实例池中。因此Stateless往往会保留上次调用的痕迹,所以应尽量避免使用类变量(EJB 3.0说绝对不能把类变量暴露给客户端,但我觉得不尽然,如果你可以确保客户端每次请求,都重新初始化该实例变量,则曝露之也未尝不可)。而对于Stateful,每一个客户端的请求都会有一个相应的实例来处理。当该实例长期处于非活动状态,则会被从内存中消除,并且序列化到辅助存储中去,即是:钝化。当新的请求到来时,则通过反序列化的方式,重新生成一个实例,并恢复调用的状态,即:激活。(对于反序列化中的简单类型(int, long etc)的处理,不同EJB 厂商采用了不同的处理方式。有些采用了,java默认值的方式:int0,但另一些则采取了恢复现场的方式)

参考:

1. Enterprise JavaBeans 3.0 -- Bill Burke

2. JMM相关资料来源于Google Search

3.实例站点:www.hoyoba.com

 
2009-10-19 16:40
关于有状态还是无状态的Session Bean,业界有太多的争议。但在Seam中,你完全可以忽略这些争议的声音。我们所要做的就是正确的使用他们。
1. 无状态Bean:
无状态bean,其实是最没意思的,但确实是非常有用的。它可以被多个线程并发的访问,大大的提高系统的性能。但无状态Bean,会像DB pool一样,生存在实例池中,并被反复的使用。所以他们往往保留着上一次被调用的痕迹。
如果你仅仅需要就像对工具类一样,仅仅是调用其中的一些方法,那么无疑stateless是你最理想的选择。如果你能保证每次调用,都对类变量重新初始化,那么也可以使用类变量来传递参数,但切记,这些类变量绝对不能对page公开。所以要么你不使用类变量,要么在任何一次调用,他们都必须被重新初始化过
2. 有状态Bean:
有状态Bean是很方便的,但它不可以被多个线程并发的访问,它总能保持你想要的任何信息,所以当你有太多的信息需要server来记录的话,有状态Bean将是一个很好的选择。
如果不考虑性能的话,有状态Bean可以用于任何地方(事实上有状态Bean,采用钝化的方式来处理,使得它们并不像传说中的那样是性能的杀手)。

总而言之:如果对性能要求较高,且不需要使用类变量,那么stateless是最好的选择。
如果需要记录客户端状态,或者需要和page交互的话,那就应该使用statefull

来源www.hoyoba.com
 
2009-10-16 10:40
亲爱的好友吧用户:
感谢您对好友吧一如既往的关注!

如果您对好友吧有任何的建议或者新功能的要求,
请把您的宝贵意见,通过发表评论的方式,告知我们。
我们将慎重的考虑您的每一个建议,意见,要求,甚至是指责。

您的意见对我们的改进有着非常重要的意义!

此致!

好友吧开发小组
 
2009-10-12 14:19

双向注入

Dependency injection(依赖注入)inversion of control(控制反转)对于现在大多数的Java开发者来说那是再熟悉没有的了。依赖注入允许一个组件通过容器“注入”另一个组件到一个setter方法或者实例变量的方式,来获得被“注入”组件的引用(reference)。我们之前看过的所有依赖注入的实现,注入都是发生在组件创建的时候,而在此后实例的整个生命周期中不再改变。对无状态组件,这么做是有道理的。从客户端的角度来看,特定种类的无状态组件的所有实例都是可以替换的(实例池化)。另一方面,对于有状态的组件(Stateful session bean), 在用户的整个对话过程中,由于需要随时的保持用户的操作,其他Bean共享当前数据,此时传统的依赖注入不再是非常有效了。因此Seam引入了 bijection(双向注入) 这个名词,用来作为注入的广义概括。

injection(单向注入)相比,bijection具有如下特点:

·         contextual(上下文相关的) - 双向注入用来针对不同的上下文来组装有状态组件(你可以把Java实例任意的注入,任何有效的context: session, request, event等)

·         bidirectional(双向的) - 被触发后,值从上下文变量中注射到组件属性中,也可以从组件属性outjected(反向注入) 回上下文,这样被调用的组件可以只通过改写自己的实例变量就同时操作了上下文变量的值

·         dynamic(动态的) - 因为上下文变量的值随着时间不断改变,而且因为Seam组件是有状态的,双向注入在每次组件被调用的时候都发生。

概念是高深的,然而使用却是异常的简单:

// session context中,把monitor对象注入进来,同时调用结束后注入到event context.

@In(scope=ScopeType.SESSION)

@Out(scope=ScopeType.EVENT)

Private Monitor monitor;

 

当然被Out出去的变量,不仅仅在java bean中可以访问,而且在任何需要的page中也同样的可以被EL表达式使用(如果它还没有被销毁的话):

 

<h:inputText value="#{monitor.name}" />
 
相比之下struts property标签却有点让人感觉莫名其妙,摸不着头脑。
 

组件式开发,提升效率

我们在谈论EJB的时候,往往只看到了EJB而忽略了它的定义。

Sun微系统公司有关Enterprise JavaBeans架构的定义如下:

Enterprise JavaBeans架构是一个用于开发和部署基于组件的分布式业务应用的组件架构。采用Enterprise JavaBeans架构编写的应用是可伸缩的、事务性的、多用户安全的。可以一次编写这些应用,然后部署于任何支持Enterprise JavaBeans规范的服务器平台上

说穿了,EJB其实就是一个运行在server端的组件。我觉得组件的概念,远远比EJB本身的意义大的多。
其实对于component模式,我觉得卖家具的比起java来,那是好得太多了,回家仔细看看吧,你的那一件家具,不是一块板,一颗钉,拼装起来的?理想状态下,我们只需要在action bean中从组件的实例池中,取出一个个的组件来,拼装一下他们的结果就可以了。如此,还需要考虑什么耦合,什么重用么?
那么我们怎么才能有效的进行组件式开发呢?其实也很简单,只需要使用注解声明一下就可以了,如下例:
// 定义一个EJB组件,用@AutoCreate声明该组件在被调用时,自动创建
@Name("editMonitorBean")
@Stateless
@AutoCreate
public class EditMonitorBean extends StatelessHome implements EditMonitor {
    @Begin(join = true)
    public Monitor showMonitor() {
        Monitor monitor = em.find(Monitor.class, monitorId);
        List<Component> componentList = em.createQuery(
            "select c from Component c " + " where c.monitor = :monitor "
                            + " order by c.catalogName, c.modifiedDate desc").setParameter("monitor", monitor)
            .getResultList();
        return monitor;
    }
}
 
// action listener中使用@In调用EJB组件
@Name("editMonitorAction")
@Scope(ScopeType.CONVERSATION)
public class EditMonitorAction extends ActionHome {
    @In
    private EditMonitor editMonitorBean;
    private List<Monitor> monitorList;
    public void showMonitor() {
        monitor = editMonitorBean.showMonitor();
        monitorHistoryPaging = editMonitorBean.findMonitorHistory(monitor);
    }
}
seam之妙却不止于此,充其量EJB只不过是server端的组件,但seamrichfacesicefaces等第三方jsf组件库的完美结合,却使之同时兼具客户端和server端两者之长,真是令人其欣喜为何如!试想一下,一堆堆美妙的组件摆在你的面前供你挑选,把你的页面装扮的就如同windows应用一样美妙,你还能不高兴得跳起来?
或许你尚有疑虑20%的数据从何而来。当然,这个无法进行精确的统计,但让我们试想一下,当你全部的开发工作,只是从组件库中,根据自己的业务逻辑,取出合适的组件,然后从容的拼装到一起的时候,在计算上大量的测试时间,我想20%也有些保守了。
一乱一治,这些年来java带给web开发人员的苦痛,远远大于欣喜。我们渴望着一个能够领袖群雄的王者早日归来,尽速结束这种兵戈纷攘,狼烟蔽日的无聊局面。带领着Java,带领着我们这些草民走出山重水复的困顿,再现那柳暗花明的世外桃源。
 
参考资料:
1. 《Enterprise JavaBeans 3.0中文版(第5版) - 电子工业出版社 / Bill Burke JBoss公司的首席架构师
2. Seam Home
3. 《Web开发之华山论剑—Web表现层跑完龙套唱主角 - 《程序员》2006年第10
4. JBoss Seam 2.0.0.GA Chinese (beta)满江红小组翻译
5. Cognos Audit Monitor
6. 《印光大师文抄》
 
2009-10-12 14:18

Ajax Push,推拉自如

你是怎么使用ajax的?

传统的方式?从server端获取一大堆的json,然后一个一个的给页面上的对象赋值?

还是google的方式?把client的处理,一股脑的放到server上去?

试想一想,这样的场景吧:

在页面上点击了一个show monitor detail link,一行js都不用写,页面上定义的所有变量,全部跟随着back bean而刷新了,这是多么惬意的事情!

这就是Ajax push的神奇之处,每一个html代码块都相当于传统的一个页面,想怎么赋值就怎么赋值,这也只有细粒度框架才能做到的。

<h:form id="jobEditForm">

    <h:outputLink

        id="addJobLink"

        value="javascript:;">

        <h:outputText value="Add Jobs" />

         <a:support

                    actionListener="#{editMonitorAction.showDetails}"

            reRender="monitorDetailArea ">

            <a:actionparam

                name="monitorId"

                value="#{param.monitorId}" />

        </a:support>

   </h:outputLink>

</h:form>

 

<s:div id=”monitorDetailArea”>

     

</s:div>

你能想象,这了了数行代码,就完成了以往连篇累牍的json赋值么?效率之高可见一斑。

既然提到了Ajax Push,不得不说一下推模式(Push model)和拉模式(Pull Model)。

简单说来,推模式既是server端准备好全部的数据和页面,客户端只负责显示就可以了;而拉模式则是server端准备好数据,怎么显示,客户端说了算。

在传统Web应用框架中(Struts/WebWork),在表现层功能相对非常薄弱的情况下,控制器往往不得不承担起为表现层准备数据的工作。其直接的后果就是每次都需要刷新整个页面。而ajax却恰恰相反,他们从server端“拉”回数据后,一个一个,一丝不苟的把数据填充到页面上,可谓鞠躬尽瘁,死而后已。

seamajax的处理却颠覆了传统——采取的是推的方式。在细粒度框架中,你可以认为,页面的每一个模块,都相当于传统意义上的一个页面。所以,它可以自由的对每个模块,随意的push,而不再需要一个一个的去赋值。真是推也随心,拉也快意!

 
   
 
 
文章分类
 
   
 
文章存档
 
     
 
最新文章评论
  

seam包含东西太多了 对我这类刚进门的人理解起来有点难 对LZ表示关注
 
 

魅族手机壁纸很多,但为何没有IPhone呢
 

回复匿名网友:感谢关注,我们将对硬件进行升级来解决server负载的问题。
 

网站有时比较慢
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu