星期三, 十一月 16, 2005

eclipse+jst+jboss4=j2ee

发现eclipse的插件jst支持session bean开发还不错,花了几天弄出来,写出与人分享。使用jboss4的j2ee容器,一个字:便宜!
这里准备演示一个j2ee的helloworld的开发,需要的软件如下:
jdk:http://java.sun.com
eclipse+jst:http://www.eclipse.org (下载eclipse后使用update manager在线安装jst)
projst:http://www.projst.com/eclipse/updates/ (这个添加jst对jboss4的支持,用update manager安装)
xdoclet:http://xdoclet.sourceforge.net (这个软件可以简化配置文件的编写,是jst必需的)
jboss:http://www.jboss.org
完成这些软件的下载安装以后,需要做一些配置工作:
在菜单上选择Window->preferences
1. 配置xdoclet
在左边展开j2ee annotations,选中xdoclet,指定xdoclet目录和版本,选中enable xdoclet builder选框,如图

然后展开xdoclet,分别在ejbdoclet和webdoclet下将jboss选成4.0版本的,并将其选中,如图


2. 配置jdk
展开java,选中installed jres,点击add,选择你的jdk安装路径,如图

配置完这个以后,在preferences页中点ok,然后重新打开preference使jdk在后面的设置中可用。
3. 配置jboss4
展开左边的server,选中installed runtimes,点击add,选中jboss->jboss4.0.x,在弹出对话框中填入你的jboss的安装路径,如图

设置至此完成,可以开始程序编写。
1.新建一个项目,选择new->project->j2ee->j2ee application project,点next,在name中填入J2EEHello

next,使用new Module给新建的j2ee项目添加一个ejb子项和一个web子项,如图


点击finish回到eclipse编辑界面,可以发现多了一个ejb工程(默认名字是J2EEHelloEJB)、一个web工程(默认名字是J2EEHelloWeb)和一个j2ee工程(第一次使用上面的某一步会提示你切换到j2ee视图,确定就行了)。
2.右键点击J2EEHelloEJB,new->enterprise java bean

选中session,点next,输入ejb的信息,package是ejbs,名字是HelloBean,选中下面的generate an annotated bean,点finish
回到编辑界面,打开HelloBean.java(顺便提一下,是用这个工具只需要手动编辑HelloBean.java文件,其他的remote和home会由xdoclet自动生成),添加一个成员函数,如下:

/**
*
* @ejb.interface-method view-type="remote"
*/
public String helloMsg()
{
return "Hello, J2EE!";
}

注意那段注释,不能省,这是xdoclet可以自动生成remote和home的关键,如图

至此ejb已经做完了,下面写ejb的客户。
3.打开J2EEHelloWeb项目的属性,选中Java jar Dependences,把ejb项目的jar选中,ok,如图

返回编辑器,展开那个J2EEHelloWeb项目,右键点击WebContent,new->JSP,填入名字hello.jsp,然后finish就可以了。
在jsp文件的body标签之间添加如下代码保存
<%
ejbs.HelloHome home = ejbs.HelloUtil.getHome();
ejbs.Hello hello = home.create();
%>
<%= hello.helloMsg() %>
ejbs.HelloUtil是jst生成的一个辅助类,可以简化ejb的使用
4.客户端写完了,可以开始调试了,右键点击那个hello.jsp,run as->run on server
选jboss4.0.x,选中下面的set server as project default,

在最后一页把J2EEHello加入服务器,点finish。

过一会应该可以在右边的内嵌浏览器中看到效果,如图(如果提示404就等一会再刷新一下):

将其地址复制到ie地址栏中也能看到这张页面:

这里使用eclipse和jboss开发j2ee服务器,虽然可能没有商用的工具成熟好用(毕竟他还不支持CMP的开发)。但是这里使用的工具都是免费的,所以有比较大的实用价值。

星期六, 十一月 05, 2005

tomcat+datasource

这两天在调试程序发现tomcat下的工具使datasource用起来很简单,所以把建立过程写出来与大家分享。班门弄斧,有错欢迎指正。
首先要建立一个给应用程序使用的数据源,假如你的应用程序部署在/test下,那么打开并登陆http://localhost:8080/admin/
tomcat server->service->Host(localhost)->Context(/test)->Resources->Datasource
在右上方的下拉列表里选Create New DataSource
Jndi Name是资源引用的名称,由你起,这里用jdbc/user
Datasource URL就是你平时用DriverManager.getConnetion(url)里的url,但不要用户名和密码信息,比如:jdbc:mysql://localhost/database_name?autoReconnect=true (autoreconnect是连接被断开后tomcat会自动重连)
Driver Class就相当于Class.forName(className)里的className,mysql用org.gjt.mm.mysql.Driver
其他你自己看着办,据tomcat-docs上说是用空的数据库密码会导致连接失败,我没试过,但为了安全性还是给数据库加上密码。
点save就ok了。
然后你部署在/test下的应用程序就能用这个datasource了,以后建立数据库连接的时候就这样:
InitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/user");
//也就是java:comp/env + 你起的jndi name
//原理你可以看j2ee tutorial
//由于tomcat的链接池实现是按j2ee标准的,所以你的代码不用修改就可以在
//weblogic等j2ee容器中使用
Connection conn = ds.getConnection();//这句取得了数据库链接
//下面就使你使用Connection的代码了,一切都和以前一样,从这里开始
是不是很简单?以后用class.forname的都不好意思给你打招呼了:-)
最后要注意的就是平时我们使用数据库的时候因为连接很费时,所以要早连接,晚释放,而用datasource(连接池)时,则要晚连接,早释放,因为连接是从链接池中取得的,释放则返回链接池,这样就能保证链接池有足够多的连接数。释放使用conn.close()就可以了,这不是直接关闭到数据库的链接,而是把链接返回链接池。

星期五, 十一月 04, 2005

DOM to XML

// 获得将DOM文档转化为XML文件的转换器,在jdk1.4中,有类TransformerFactory
// 来实现,类Transformer实现转化API。
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer();
// 将DOM对象转化为DOMSource类对象,该对象表现为转化成别的表达形式的信息容器。
DOMSource source = new DOMSource(document);
// 获得一个StreamResult类对象,该对象是DOM文档转化成的其他形式的文档的容器,可以是XML文件,文本文件,HTML文件。这里为一个XML文件。
StreamResult result = new StreamResult(new File(“text.xml”));
// 调用API,将DOM文档转化成XML文件。
transformer.transform(source,result);

apache+tomcat+jk2_jni

今天忙活和一天,终于搞出来apache和tomcat使用jni整合配置,用的jni方式通信,不用让tomcat启动,用的时候apache会自动启动tomcat的。把配置过程共享出来,希望对其他人能有帮助。我是在windowsxp下试成功的,linux下没成功,可能是apache版本太低,如果有人作出来了希望能不吝赐教!
1) (八股?!)下载软件安装
apache2.0.49
tomcat5.19
jk2.0.2
在那下载自己找,我就不提供了吧?
装好后启动服务器,先测试一把
http://localhost           以该能看到apache的默认页
http://localhost:8080      应该能看到tomcat的默认页面
测试成功则关闭apache和tomcat并把tomcat的启动方式改为手动再继续

2)安装jk2
把下载到的jk解压,把那个dll文件改名为mod_jk2.dll(你也可以改成其他名字或不改,以下的过程也跟着变就是了)放到[apache安装目录]\modules下
编辑httpd.conf加入
    LoadModule jk2_module modules/mod_jk2.dll
重启apache,成功则关闭apache继续(不成功能不能继续我没试过:-)

3)编辑配置文件
a)workers2.properties
在[apache安装目录]\conf下新建一个文件,命名为workers2.properties
内容如下,注意,根据你服务器的安装路径可能要作修改(下面有提示的地方)!
[config:]
file=${serverRoot}/conf/workers2.properties
debug=0
debugEnv=0

[shm:]
disabled=1

#在tomcat4中从这里开始到下一个标记处不需要
# Example socket channel, override port and host.
[channel.socket:localhost:8009]                    
port=8009
host=127.0.0.1

# define the worker
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
#在tomcat4中从这里到上一个标记之间的不需要

[channel.jni:jni]
info=The jni channel, used if tomcat is started inprocess

[vm:]
info=Parameters used to load a JVM in the server process
classpath=D:/server/Tomcat5/lib                 #可能需要修改
OPT=-Dtomcat.home=D:/server/Tomcat5             #可能要修改
OPT=-Dcatalina.home=D:/server/Tomcat5           #可能要修改
OPT=-Xmx128M
disabled=0

[worker.jni:onStartup]
info=Command to be executed by the VM on startup. This one will start tomcat.
class=org/apache/jk/apr/TomcatStarter
ARG=start
disabled=0
stdout=${serverRoot}/logs/stdout.log
stderr=${serverRoot}/logs/stderr.log

[worker.jni:onShutdown]
info=Command to be executed by the VM on shutdown. This one will stop tomcat.
class=org/apache/jk/apr/TomcatStarter
ARG=stop
disabled=0

[status:]
info=Status worker, displays runtime informations

[uri:/jkstatus/*]
info=Display status information and checks the config file for changes.
group=status:

[uri:/jsp-examples/*]
info=Map the whole webapp (for tomcat5)

[uri:j.e16.dhs.org/*.jsp]                  #虚拟主机用,根据你的域名修改
info=e16 test site

[uri:j.e16.dhs.org/servlet/*]              #也是虚拟主机映射
info=servlets

然后在[tomcat安装目录]下新建个目录,命名为lib,把tomcat带的所有jar文件解压到这个目录下(有点劲大,但这样最省事,好像)。

b)jk2.properties
好像[tomcat安装目录]\conf下本来就有,编辑它,内容如下:
## THIS FILE MAY BE OVERRIDEN AT RUNTIME. MAKE SURE TOMCAT IS STOPED
## WHEN YOU EDIT THE FILE.

## COMMENTS WILL BE _LOST_

## DOCUMENTATION OF THE FORMAT IN JkMain javadoc.

# Set the desired handler list
handler.list=apr,request,channelJni        #这行原来是被注释掉的
#
# Override the default port for the socketChannel
# channelSocket.port=8019
# Default:
# channelUnix.file=${jkHome}/work/jk2.socket
# Just to check if the the config  is working
# shm.file=${jkHome}/work/jk2.shm

# In order to enable jni use any channelJni directive
# channelJni.disabled = 0
# And one of the following directives:

# apr.jniModeSo=/opt/apache2/modules/mod_jk2.so

# If set to inprocess the mod_jk2 will Register natives itself
# This will enable the starting of the Tomcat from mod_jk2
apr.jniModeSo=inprocess                   #这行也是
下面,激动人心……
启动apache,打开浏览器,输入
http://localhost/jsp-examples/
看到JSP Samples页面就成功了(刚启动后马上可能看不到,稍微等一会,要十分钟后还看不到则肯定是挂了。

4)虚拟主机
上面配置的是让tomcat替apache解析jsp-examples目录下的所有文件,也可以把整个虚拟主机交给tomcat(假设域名是j.e16.dhs.org)
a)编辑httpd.conf,在最后加入
NameVirtualHost *:80
<VirtualHost *:80>
     DocumentRoot f:/jwebapp      #目录根据你的需要改
     serverName j.e16.dhs.org
</VirtualHost>

<Directory f:/jwebapp>               #和上面保持一致
     AllowOverride All            #这里为了一会设定web-inf权限
     Options +Indexes             #这里可以不要,为了调试程序方便
</Directory>
b)编辑workers2.properties,加入
[uri:j.e16.dhs.org/*.jsp]
info=e16 test site

[uri:j.e16.dhs.org/servlet/*]
info=servlets
#这样你就把所有虚拟主机下的jsp和servlet交给tomcat了,但还要在tomcat下作相应的配置
c)编辑server.xml,加入
     <Host name="j.e16.dhs.org" debug="0" appBase="f:/jwebapp" unpackWARs="true" autoDeploy="true">

          <Context path="" docBase="" debug="1"/>

          <Valve className="org.apache.catalina.valves.AccessLogValve"
                 directory="logs"  prefix="e16j." suffix=".txt"
                 pattern="common" resolveHosts="false"/>
     </Host>
<!--地方自己找,原来应该有个host标记,和它放在一起-->
d)对web用户隐藏web-inf目录
这一步是为安全考虑
新建一个文件.htaccess,内容如下
Options None
Order deny,allow
Deny from all
在每个web-inf下放一个
启动apache,试试http://j.e16.dhs.org/        把域名改成你的域名,应该会有个惊喜

补充:
上面的虚拟主机(j.e16.dhs.org)不会影响php和perl的执行。用tomcat4(我试了4.1.30)以上配置不用改变,而且可以按照提示去掉一些东西(我不知道为什么)。这里我在winxp下虽然配置成功了,但原理仍然不是太懂,如果谁很清楚的话望能赐教。附带的附件是我的配置文件(正在运行的)。欢迎指正以上可能存在的错误,我的BMYid是neilzheng。