积累,创造,分享!

BlogJava 首页 新随笔 联系 聚合 管理
  25 Posts :: 13 Stories :: 26 Comments :: 0 Trackbacks

#

          本文将不涉及EJB3.0的设计以及编码.
          主要内容是关于JBOSS下EJB3.0的第一个例子的配置与运行。
首先下载JBOSS4,并安装成功。目前JBOSS提供的ejb3有2种版本,一种是Embeddable(可嵌入),一种是直接运行。这些都可以在jboss的官方网站获得。
Embeddable版本的主要的好处是可以独立运行,方便测试,甚至无需部署在jboss环境当中,当然这是需要它提供的conf以及lib包里面的几个配置来支撑的。如果是在web应用当中运行,还需要将jboss-EJB-3.0_Embeddable_ALPHA_8\conf 里面的配置文件引入到web-inf\classes下的。
lib包里面的3个包也需要放在web-inf\lib下面。然后对web.xml进行修改,加上:
   <context-param>
      <param-name>jboss-kernel-deployments</param-name>
      <param-value>embedded-jboss-beans.xml, jboss-jms-beans.xml</param-value>
   </context-param>
   <listener>
      <listener-class>org.jboss.ejb3.embedded.ServletBootstrapListener</listener-class>
   </listener>
否则会报关于jndi方面的错误。

          前面提到的另一个版本则是需要基于JBOSS环境的完全版。它的配置相对于Embeddable来说更简单一些。   实际上针对这个版本的web应用当中调用EJB3 是无需任何额外配置的.
然而在此之前我走了一段弯路:
比如看到网上一些介绍性的文章当中提到需要将{jboss_home}\client 当中的一些包拷到web-inf\lib的下面,然后在初始化InitialContext时需要加上java.naming.factory.initial,java.naming.factory.url.pkgs等等的参数。这样反而会抛出CommunicationException: Receive timed out异常。实际上JBOSS都已经将初始化环境设置好了。
以下实例是web环境下调用jboss 下ejb3的客户端:
http://www.myjavaserver.com/~nighthawk/EJBClient.war
部署在jboss下的ejb3例子,以上2个客户端都是调用的它:
http://www.myjavaserver.com/~nighthawk/MyEJB.jar
web环境下调用Embeddable ejb的客户端的实例比较大,空间不够,不往上放了。
不过配置起来也很简单,只需将Embeddable版本当中的conf与lib包放在war包的classed与lib下即可。
以上例子均在jboss-4.0.4.GA下测试过。
                                                                                                                              ©2006 nighthawk.All rights reserved

posted @ 2006-07-28 16:21 nighthawk 阅读(743) | 评论 (1)编辑 收藏

研究spring不深,但最近在使用spring的过程中,发现它总能给人带来点惊喜。
相信大家在做程序的时候应该会碰到时序调度一类的问题,即希望在指定时刻执行某段程序,在spring之前我的第一反应便是在数据库中加job。然而现在,Spring提供了支持时序调度的整合类Quartz,它把复杂的事情完全简单化了,在此我不想再赘叙关于spring中如何去整合Quartz,具体的spring详细配置请参照http://www.jactiongroup.net/reference/html/scheduling.html。使用过程很简单,
关于Quartz的说明参照官网的一段描述
What is Quartz?
Quartz is a full-featured, open source job scheduling system that can be integrated with, or used along side virtually any J2EE or J2SE application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components or EJBs. The Quartz Scheduler includes many enterprise-class features, such as JTA transactions and clustering.
您也可以参考以下链接进行更深入的了解http://www.opensymphony.com/quartz

在使用的过程中,需要再对cronExpression的配置解释一下,如果没有使用过unix的cron,这里确实有点让人迷惑,我便在这里迷惑了一把。
Cron表达式是字符串,它由六个或七个子表达式组成,它描述了不同的调度细节。这些子表达式被白色表达式隔开,格式为* * * * * *
以下的表格对表达式做出了解释
域          是否必须 允许的值       允许的字符
Seconds      YES       0-59                   , - * /
Minutes      YES       0-59                   , - * /
Hours        YES       0-23                    , - * /
Day of month YES       1-31              , - * ? / L W C
Month        YES       1-12 or JAN-DEC, - * /
Day of week  YES   1-7 or SUN-SAT , - * ? / L C #
Year         NO         empty,1970-2099,   - * /

比如:字符串“0 0 12 ? * WEB 意味着每周三上午12:00。
特殊字符的一些说明:
* 表示的是所有的值,比如在秒的位置上有* 则表示为每一秒种。所以,你在表示每5分钟执行一次的时候便不能写成 * 0/5 * * * ? 而应该是0 0/5 * * * ?
? 表示没有指定特别的值,是允许为月的某一天或者周的某一天字段的。它被用来限定"没有限定值"。这是有用的,当你需要限定一些事情在一个或两个字段中,但不是这里的。
有一个特别需要主意的地方便是*与?的搭配使用。比如在Day of month与Day of week全是* ,那边自相矛盾了。官网中给出的例子没出现过这种情况。
- 表示范围,比如Hours域中10-12,则表示 "the hours 10, 11 and 12".
,表示指定特别的附加值,比如"MON,WED,FRI" 在 day of week 域表示"the days Monday, Wednesday, and Friday"
/ 表示指定的增长范围。比如"0/15" 在秒的区域表示"0, 15, 30, and 45"秒。

"L"字符是允许用来月某天和周某天字段。这个字符是一个"last"的缩写,但是它有不同的意义在两个字段的其中之一。例如,这个值"L"在月字段的某一天意味着" 这个月的最后一天",31或者28等等。

posted @ 2006-02-28 12:57 nighthawk 阅读(1065) | 评论 (0)编辑 收藏

看Larman的UML和模式应用,感觉浑身上下都是宝,一遍两遍都不过瘾。
这几天又在看GRASP(general responsibility assignment software patterns的缩写),把该记的都记一下,加深印象,也与大家分享。网上这方面的资料并不多。
五个基本模式:information expert,creator,High Conhersion,Low Coupling,Controller

四个扩展模式:Polymorphism,indirection,pure fabrication,protected variations

不想一一详叙,挑重点看。
1,information expert:把职责分配给具有实现这个职责所需要信息的对象。它表述的是一种“直觉”。
2,creator:顾名思义,谁应该负责产生类的实例?类B聚合,包含,记录,密切使用类A的数据。
3,high conhersion与Low coupling:应该是到了面向对象的高层境界了。高耦合:依赖性过强。内聚:功能性内聚。降低一切不稳定元素之间的耦合。
4,controller:如果直接通过UI来访问业务层,后果是不堪想像的。C/S模式的开发中它是用来接收事件的,它通常不实现职责,只是委托给其他对象。在B/S中,我把它理解为serlvet。
5,polymorphism:多态?这个词很别扭,一句话解释:多态是设计系统如何处理相似变化的基本方法。便于扩展,可嵌入。比如以下代码:

abstract class Square
{…
  
abstract void landedOn();
…}

class RegularSquare extends Square
{…
  
void landedOn()
 
{ … } // implementation
}

class IncomeTaxSquare extends Square
{…
  
void landedOn()
 
{ … } // implementation
}


6,indirection与pure fabrication:目的无非是为了降低耦合。对象的设计分为两类:表示分离与行为分解。indirection与pure fabrication都是行为分解的产物。比如说我们常见的DAO模式,我认为就是很好的pure fabrication。
7,protected variations:书中翻译为受保护变化。叫做受保护的变化似乎更容易被理解。受保护的变化机制的具体体现:多态,接口,中介,数据封装。与LSP(liskov替换原理)很相似。

posted @ 2005-11-30 14:11 nighthawk 阅读(704) | 评论 (0)编辑 收藏

今天看struts源码,发现了这么一个东西。在此是用来读取struts的XML配置文件的。以前没有大在意,现记下来,以备后用。
Digester是Jakarta 子项目Commons下的一个模块,是基于SAX接口的,它简化了SAX方法的解析过程。用的时候集中精力处理XML数据而不是花太多的时间在如何解析文件本身上。
以下是刚刚写的一个小例子:
 1import org.apache.commons.digester.*;
 2import org.xml.sax.SAXException;
 3import java.io.*;
 4
 5public class DigesterSample {
 6  public DigesterSample() {
 7    Digester digester = new Digester();
 8    digester.push(this);
 9    digester.addCallMethod("rocket/member""print"2);
10    digester.addCallParam("rocket/member/name"0);
11    digester.addCallParam("rocket/member/age"1);
12    try {
13      digester.parse(getClass().getResourceAsStream("rocket.xml"));
14    }

15    catch (SAXException e) {
16      e.printStackTrace();
17    }

18    catch (IOException ex) {
19      ex.printStackTrace();
20    }

21
22  }

23
24  public void print(String name, String age) {
25    System.out.println("name : " + name + "  age : " + age);
26  }

27
28  public static void main(String[] args) {
29    DigesterSample dig = new DigesterSample();
30  }

31}
相应的rocked.xml文件如下:
1<rocket>
2<member>
3<name>YaoMing</name>
4<age>25</age>
5</member>
6</rocket>
放在编译后的class同等目录下即可。

相关资源 http://jakarta.apache.org/commons/digester/
posted @ 2005-11-21 15:42 nighthawk 阅读(342) | 评论 (0)编辑 收藏

用同步器令牌来防止客户端的重复提交,这的确是个好注意!
特别是防止用户在浏览器当中点击后退或者刷新按钮所产生的不良影响。
道理其实很简单,大概流程为:输入请求-->比较值-->处理请求-->生成令牌-->保存令牌-->
准备响应-->外发响应。
在客户请求当中携带服务器前一次响应时发给客户端的令牌,去与服务器端保存的令牌相比较,如果相等,则说明当前是合法提交。而不过不匹配,则可能是重复提交了。
在具体的实现当中以jsp为例,在控制器当中采用servlet来负责管理令牌,将服务器端的令牌保存在session当中,通过每次的请求来更新这个令牌。然后在将要处理的业务逻辑之前判断提交上来的令牌是否合法。如果合法则继续执行,如果不合法,则避免执行正常的操作。
servlet当中生成token代码可如下:
public void saveToken(HttpServletRequest request){
         HttpSession session
=request.getSession();
         String token
=generateToken(request);
         session.setAttribute(Constants.TOKEN,token);
}
检查令牌合法性
public boolean isTokenValid(HttpServletRequest request){
        HttpSession session
=request.getSession();
        String saved
=session.getAttribute(Constants.TOKEN);
        String token
=request.getParameter(Constants.TOKEN);
if(saved.equals(token)){
      
return true;
}

     
return false;
}


在JSP端,通过助手类将当前生成的令牌保存在HTML的表单的隐含域当中。
比如
<input type="hidden" name="TOKEN" value="as8d7j3sk">

通过这种手段实现起来并不十分复杂。当然这只是防止用户提交的手段之一。其他的方法有待大家不断补充。
来源参考:Core J2ee patterns 2 


posted @ 2005-11-15 11:14 nighthawk 阅读(957) | 评论 (0)编辑 收藏

仅列出标题
共5页: 上一页 1 2 3 4 5 下一页