在resin-ee-2.1.5上构建j2ee应用服务
(100101)北京信息工程学院 蔡君 www.justhis.com
----如果要转载请注明来处和作者
一、所需软件
1.JDK
因为resin自己不带j2sdk,所以必须在安装resin之前要安装j2sdk,这样的话,我们可以使用任何版本的j2sdk, 与有些AppServer相比较,省去了千方百计修改jdk的苦恼。
Sun公司相关下载连接
http://Java.sun.com/j2se/downloads.Html
2.resin-ee
caUCho公司的resin虽然现在没有多少人知晓,但是他的调试能力,他的执行速度实在让人惊叹,caucho 公司的resin对jsp、servlet的解析能力更是略胜一筹,国内许多大型网站都采用了resin的服务器(尽管许多 开发人员并未使用),象:http://www.163.com http://www.chinaren.com http://www.justhis.com.
resin-ee经过几次修订之后,已经越来越稳定了,他的CMP(容器管理)更是显示出强大的威力,可配置性、即使更新的功能更是让人瞠目结舌。
caucho相关下载
http://www.caucho.com/download/
PS:本人系统环境为win2kServerSP3+j2sdk1.4+resin-ee-2.1.5
二、构建环境
1、在Resin的目录下发布
在resin.conf中查找<web-app>标签,该标签表示一个web应用。
标签中,id属性表示该应用的Web路径。如<web-app id=’/test’>,表示该应用在Web上访问的时候应该用http://hostname/test/来访问。app-dir属性表示该应用的实际路径。如<app-dir>d: esindoc est</app-dir>表示该应用在d: esindoc est目录下面。默认值为根下面的和id同名的目录。Resin可以配置3种error-page:404错误也就是文件找不到错误页;Exception违例页;不能连接java引擎页。他们分别可以这样子设置。
404文件找不到页
<web-app id=′/app1′>
<error-page error-code=′404′ location=′/file_not_found.jsp′/>
</web-app>
Exception 违例页
<web-app id=′/foo′>
<error-page exception-type=′java.lang.NullPointerException′
location=′/nullpointer.jsp′/>
</web-app>
不能连接到srun Servlet引擎错误页
该页设置和应用无关,属于服务器的设置。
<http-server>
<error-page exception-type=′connection′
location=′/missing_file.html′/>
</http-server>
classpath的设置
参见下面的语句:
<classpath id=′WEB-INF/classes′ source=′WEB-INF/src′ compile=′true′/>
id参数的值表示classpath中编译后的classpath的存放路径;source参数的值表示classpath中java源代码的存放路径;compile中的值可能是true或者false,表示是否由Resin的srun自动编译java源代码。Classpath的设置一般和javaBean或者Servlet的使用有关。id的值表示javaBean的编译好的包存放的根,source的值表示javaBean的java源代码存放的根。Servlet相同。
Servlet的设置
参见下面的语句:
<servlet-mapping url-pattern=′*.xtp′ servlet-name=′xtp′/>
<servlet-mapping url-pattern=′*.jsp′ servlet-name=′jsp′/>
<servlet-mapping url-pattern=′/servlet/*′ servlet-name=′invoker′/>
一般就是指定那些需要通过srun的解析。比如在这里,把*.jsp改成*.jss,其他不变,那么只要在访问时遇到*.jss的文件就和原来遇到*.jsp一样处理。通过这个可以指定解析的引擎,如以下的配置:
<servlet-mapping url-pattern=′*.xtp′ servlet-name=′com.caucho.jsp.XtpServlet′/>
在Servlet中,也可以指定servlet。如
<servlet servlet-name=′hello′ servlet-class=′test.HelloWorld′/>
<servlet-mapping url-pattern=′/hello.html′ servlet-name=′hello′/>
在servlet-mapping中有个重要的参数case-sensitive 如果在windows上,最好配置成false,忽略大小写,从而和windows的约定一致。
Session的配置
参见如下的配置语句:
<session-config>
<session-max>4096</session-max>
<session-timeout>30</session-timeout>
<enable-cookies>true</enable-cookies>
<enable-url-rewriting>true</enable-url-rewriting>
<file-store>WEB-INF/sessions</file-store>
</session-config>
session-max :最大 session数量
session-timeout :session过期时间,以分钟为单位。
是否允许cookie :指session是否采用cookies。如果采用cookies,浏览器必须支持session才能使用,发布时建议改成false。enable-url-rewriting和enable-cookies一般配合使用。如果enable-cookies是false,enable-url-rewriting应该设成true比较合适。
file-store :该配置指示服务器是否把session作为文件存放在服务器上。如果把该项注释掉,则在你的web-app目录下的WEB-Inf/sessions目录不保存序列化后的session对象。Session还有jdbc-store配置,对应着把session通过jdbc永久保存在数据库中。其实也就是会话变量的序列化后的保存和重新载入的物理实现。在这里session还支持了多服务器的设置问题,
通过tcp-store参数设置。由于涉及到负载平衡的问题,在这里不详细叙述,只简单写一个例子:
<http-server>
<http id=′a′ port=′80′/>
<srun id=′a′ host=′host-a′ port=′6802′/>
<http id=′b′ port=′80′/>
<srun id=′b′ host=′host-b′ port=′6802′/>
<host id=′′>
<web-app id=′′>
<session-config>
<tcp-store/>
<always-load-session/>
</session-config>
</web-app>
</host>
</http-server>
这个例子表示session是按照tcp ring的方式传递。
temp-dir 的设置
temp-dir指的是应用的临时目录。也就是在javax.servlet.context.tempdir中用到的目录。模认是应用目录下的WEB-INF mp目录。
以上的设置都可以在<web-app>标签对中设置,控制某个web应用的设置。
2、打包成War发布
以下是介绍对如何在resin下使用已经打包成War的java Web应用进行发布。
其实这个是最简单也是最清晰的良好方法。在j2ee中,所有的项目都打包成ear发布。其中,Web应用打包成war,ejb应用打包成jar。在resin中,这些都可以直接部署。这里我只对打包成war的Web应用的部署做介绍。
在resin.conf中,查找这个:<war-dir id=′webapps′/>。他表示war文件应该被拷贝的路径。这里指的是相对于resin的安装路径,如以上的设置表示d: esinwebapps。只要重新启动Resin就可以了。Resin会把该war自动解包到webapps目录下。你可以在command控制台或者stdout.log中看到类似于
[2002-04-27 09:56:21.680] initializing application http://haitaiserver:8080/rwtest 的语句。这个表示该Web应用是自动安装的。只要这个应用是符合j2ee标准的Web应用,应该不会有问题。通过如上显示的路径就可以访问到这个应用。如果你到d: esinwebapps wtest中浏览,你会看到Resin已经为你生成了rwtest目录,下面是META-INF和WEB-INF还有你自己的JSPservlet 文件和目录。是完全符合j2ee的结构的。你可以在rwtest目录下建立新的jspservlet,一样可以被编译和解析并运行的。在实际操作中,可以使用Jbuilder 或者 WebSphere等Ide工具进行集成调试和打包,非常的方便。
3、打包成Ear发布
一个ear的发布带有就j2ee的一些文件,譬如一个jzjweb.ear他包涵有jzjwebEjb.jar和jzjweb.war,部署相当简单,就是把此文件拷贝到web-apps文件夹下面,这个时候您就可以看到resin的控制台显示有一些初始化的一些信息。这个时候可以通过浏览器进行浏览您的基于j2ee的应用服务器的webApplication了,呵呵,岂不很爽?
三、用resin作为AppServer进行开发的相关配置。
看到resin的这么多优点是不是已经迫不及待了?让我们进行深度探险吧。
1. 进行DataSource的配置
打开<resin_home>/confi/resin.conf,您可以看见里面已经有了这么一段
<resource-ref>
<res-ref-name>jdbc/test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param driver-name="com.caucho.jdbc.mysql.Driver"/>
<init-param url="jdbc:mysql_caucho://localhost:3306/test"/>
<init-param user="root"/>
<init-param passWord=""/>
<init-param max-connections="20"/>
<init-param max-idle-time="30"/>
</resource-ref>
这些东西我想您一看就知道是什么意思了吧,略作介绍:
<resource-ref> 为资源参引
<res-ref-name>就是资源引用的名字,这个您可要记好了,这是在程序中LookUp的标识哟。
<res-type>就是为引用的类型,在此为DataSource同样也可以为其他的类型。
<ini-param >为初始化的参数
driver-name:为数据库的驱动程序
url: 为数据库的连接URL
user: 为数据库的用户名字
password:为数据库的连接密码
max-connections为数据库的最大连接量
max-idle-time:为最长连接时间
如果我们相配置一个基于Oracle的Datasource应该怎么作呢,我不作解释了,只给出相应的代码,我想您肯定能够知道的。^_^
<resource-ref>
<res-ref-name>jzjwebDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<init-param driver-name="oracle.jdbc.driver.OracleDriver"/>
<init-param url="jdbc:oracle:thin:@10.1.7.128:1521:ora817"/>
<init-param user="ecid"/>
<init-param password="ecid"/>
<init-param max-connections="120"/>
<init-param max-idle-time="30"/>
</resource-ref>
2. 进行web.XML的配置
Web.xml的配置可以说是关键的,不要听我这么一说感觉很难,其实resin自带一个例子cmp里面的配置说明已经相当经典,我们可以很容易的配置我们所需的webApp,其实有的时候在resin.conf里面的配置的东西,同样在web.xml也是适用,为了自动读取.ejb文件,并且观察ejb文件变化,我们先要引用一些资源文件,如下面的一段设置:
<resource-ref>
<res-ref-name>java:comp/env/cmp</res-ref-name>
<class-name>com.caucho.ejb.EJBServer</class-name>
<init-param data-source="java:comp/env/jdbc/test"/>
<!-- sets the JDBC isolation level -->
<init-param jdbc-isolation="serializable"/>
</resource-ref>
此定义中引用一个CMP的引用,其他的引用也是大同小异,如果要是引用remote的Bean,我们可以通过定义下面的Servelet映射,此映射主要是用来调用远程的EJB,如果您使用一个CMP就不必使用下面的映射了,可以将其删掉
<servlet-mapping>
<url-pattern id=′/burlap/*′/>
<servlet-name id=′com.caucho.burlap.EJBServlet′/>
<init-param url-prefix="http://localhost:8080/hello/burlap"/>
</servlet-mapping>
我们还需要定义对于远程jndi的调用URL,这与前面定义的Servelet要对应的,一个例子:
<jndi-link>
<jndi-name>java:comp/env/ejb</jndi-name>
<jndi-factory>com.caucho.burlap.BurlapContextFactory</jndi-factory>
<init-param java.naming.provider.url="http://localhost:8080/hello/burlap"/>
</jndi-link>
此处hello为App的名称,您可以在不同的地方修改。
通过以上的配置我们就可以运行我们的j2ee程序了,在默认的情况下,文件的存放为:
<<web-App>>/--
-----.jsp
---web-inf/
.ejb
web.xml
<<classes>>/XXX/XXX/XXX.class
<<lib>>/.jar
目录结构完全是安j2ee规范的。
四.一个使用resin服务器的Hello程序。
现在一个<<resin_home>>webapps目录下面建立一个目录hello
这个时候您要是通过浏览器浏览http://localhost:8080/hello 此时会在hello目录下面自动创建一个WEB-INF文件夹,然后在WEB-INF/目录下面建立web.xml文件 和 hello-stateless.ejb
在<<resin_home>>webappshelloWEB-INF 目录下面创建两个目录分别为classes , lib
其中classes为您的class的文件,而lib为您的jar文件存放地。程序代码,见附件。
后记:自己花了一个下午地时间把一个oracle+iplanet的j2ee的程序移至resin服务器下面,虽然还有一些问题,但是个人认为,利用resin进行开发再好不过了,不用把大把大把的时间花在重新启动服务器的,resin对于web.xml 和 java class文件改变都会重载应用程序。
GOOK Luck!
在resin-ee-2.1.5上构建j2ee应用服务
(100101)北京信息工程学院 蔡君( 阿菜) www.justhis.com
----如果要转载请注明来处和作者
(出处:http://www.knowsky.com)