Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103068601
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-30 23:13:41




Developing J2EE Web Application on Jboss and PostgreSQL(chinese version)


作者:Han QW, 转载请指明出处 如有不当之处,敬请指出


先安装JSDK,再安装JBoss.
安装JSDK,必须获得一套对应于用户的操作系统的JDK,
我的安装的文件目录是
WINDOWS2000: d:s1studio_jdkj2sdk1.4.1
linux: /root/s1studio_jdk/j2sdk1.4.1
为了用EJB, 需要一个j2ee-1.3.jar或者j2ee-1.2.jar,
如果安装了Sun One Studio 或者 J2EE ( )这个文件已经有.
把这个文件放在classpath路径上.
或者使用jboss-j2ee.jar, 安装JBoss后在$JBossclient中可找到.
建议安装Sun One Studio, 用Sun One Studio编译JAVA源程序,
不用设置classpath, 省去不少过程.

安装JBoss:
把JBoss的压缩包解开,放在任一目录上,
我的安装的文件目录是
/dose/jboss-3.0.4_tomcat-4.1.12 (REDHAT8.0)
E:jboss-3.0.4_tomcat-4.1.12 (WINDOWS2000)
WINDOWS2000, linux共用同一套JBoss.

配置JBoss:
启动JBoss需要执行一个脚本文件:
linux:run.sh
WINDOWS对应的是:run.bat

(1)
在JBossin un.bat (for Windows)开头插入一行
set JAVA_HOME = d:s1studio_jdkj2sdk1.4.1
在JBossin un.sh (for Linux)开头插入一行
JAVA_HOME="/root/s1studio_jdk/j2sdk1.4.1"

或者
(2)设置系统环境变量JAVA_HOME,指向JDK

运行JBoss, run.sh或者run.bat
当看到启动JBoss的信息时,说明启动了.
服务器简单的测试:
JBoss默认的WEB端口为8080,我们可以在打开一个浏览器输入地址

当在浏览器看到JBoss的信息时,说明安装配置JBoss成功了.



建立下面的目录和文件(注意大小写).

FIRST.EAR
|
|-----META-INF (application.xml)
|
|-----First.jar
| |-----META-INF (ejb-jar.xml,jboss.xml)
| `-----Dev
| |-----First(FirstSession.java, FirstSessionHome.java, FirstSessionBean.java)
| |-----Delegate(NewDelegate.java)
| `-----Dao(MysqlDao.java)
|
`-----First.war(index.jsp)
|
`-----WEB-INF (jboss-web.xml, web.xml)
|-----classes
`-----lib

/*
**
**MysqlDao.java
**
*/

package Dev.Dao;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;import java.sql.ResultSet;import javax.naming.InitialContext;import javax.sql.DataSource;public class MysqlDao { public Connection getConnection() throws Exception { InitialContext ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("java:/PostgresDS"); Connection conn = null; Statement stmt = null; try { conn = ds.getConnection(); } catch (SQLException sqlEx) { System.out.println("Error connect to pool."); } return conn; } public String getName(String id) throws Exception { Connection conn = null; Statement stmt = null; ResultSet rs = null; String name = ""; try { conn = getConnection(); if ( conn !=null )System.out.println("Get conecttion. "+ conn.toString()); stmt = conn.createStatement(); if ( stmt !=null )System.out.println("Get Statement. "+ stmt.toString()); String sql = "SELECT * from users where id = ´"+id+"´"; System.out.println("Sql from getId(): "+sql); rs = stmt.executeQuery(sql); if ( rs !=null )System.out.println("Get result. "); if (rs.next()){ name = rs.getString("name"); } } catch (Exception sqlEx) { System.out.println("Error from getName()."); System.out.println("Error from DAO.getName() :" + sqlEx.getMessage()); }finally { if (conn != null) { try { conn.close(); } catch (Exception sqlEx) { } } } return name; } public String getCountry(String id) throws Exception { Connection conn = null; Statement stmt = null; String name = ""; try { conn = getConnection(); stmt = conn.createStatement(); String sql = "SELECT * from users where id = ´"+id+"´"; System.out.println("Sql from getCountry(): "+sql); java.sql.ResultSet rs = stmt.executeQuery(sql); if (rs.next()) { name = rs.getString("Country"); } } catch (SQLException sqlEx) { System.out.println("Error from getCountry()."); }finally { if (conn != null) { try { conn.close(); } catch (Exception sqlEx) { } } } return name; }}


/*
**
**NewDelegate.java
**
*/

package Dev.Delegate;import java.lang.*;import Dev.First.*;public class NewDelegate { Dev.First.FirstSession bean = null; public NewDelegate( ){ try { javax.naming.InitialContext ctx = new javax.naming.InitialContext(); Object objref = ctx.lookup("ejb/FirstSession"); Dev.First.FirstSessionHome testBean = (Dev.First.FirstSessionHome) javax.rmi.PortableRemoteObject.narrow (objref,Dev.First.FirstSessionHome.class); bean = testBean.create(); System.out.println("From JSP"); } catch (Exception NamingException) { NamingException.printStackTrace(); } } public String Welcome() { String msg = ""; try { msg = bean.Welcome(); } catch (Exception NamingException) { NamingException.printStackTrace(); } return msg; } public String getName(String id) { String name = ""; try { name = bean.getName(id); } catch (Exception NamingException) { NamingException.printStackTrace();} return name; } public String getCountry(String id) { String country = ""; try { country = bean.getCountry(id); } catch (Exception NamingException) { NamingException.printStackTrace();} return country; } }

/*
**
**FirstSession.java
**
*/

package Dev.First;import java.lang.*;import java.rmi.RemoteException;import javax.ejb.CreateException;import javax.ejb.EJBException;import javax.ejb.SessionBean;import javax.ejb.SessionContext;public interface FirstSession extends javax.ejb.EJBObject{ public String Welcome() throws java.rmi.RemoteException; public String getName(String id) throws java.rmi.RemoteException; public String getCountry(String id) throws java.rmi.RemoteException;}


/*
**
**FirstSessionHome.java
**
*/

package Dev.First;import java.lang.*;import java.rmi.RemoteException;import javax.ejb.CreateException;import javax.ejb.EJBException;import javax.ejb.SessionBean;import javax.ejb.SessionContext;public interface FirstSessionHome extends javax.ejb.EJBHome{public FirstSession create() throws javax.ejb.CreateException, java.rmi.RemoteException;}


/*
**
**FirstSessionBean.java
**
*/

package Dev.First;import java.rmi.RemoteException;import javax.ejb.CreateException;import javax.ejb.EJBException;import javax.ejb.SessionBean;import javax.ejb.SessionContext;public class FirstSessionBean implements SessionBean{public void ejbCreate() throws CreateException {}public String Welcome(){ String msg="Hello! This My Session Bean From Jboss."; System.out.println(msg); return msg;}public String getName(String id){ String name = ""; System.out.println("From bean before getName :"+ name); try{ Dev.Dao.MysqlDao dao = new Dev.Dao.MysqlDao(); name = dao.getName(id); System.out.println("From bean after getName :"+ name); }catch(Exception e){ System.out.println(e.getMessage());} return name;}public String getCountry(String id){ String country = ""; try{ Dev.Dao.MysqlDao dao = new Dev.Dao.MysqlDao(); country = dao.getCountry(id); }catch(Exception e){ } return country;}public void setSessionContext( SessionContext aContext ) throws EJBException {}public void ejbActivate() throws EJBException {}public void ejbPassivate() throws EJBException {}public void ejbRemove() throws EJBException {}}




/*Don´t put the following lines into index.jsp
**
**index.jsp
**
*/Don´t put the above lines into index.jsp


<%@page language="java" %><% String msg = ""; String msg1 = ""; Dev.Delegate.NewDelegate nn = new Dev.Delegate.NewDelegate(); if (request.getParameter("id") != null && request.getParameter("id") != ""&& !request.getParameter("id").equals("")){ String id = request.getParameter("id"); String name = ""; Dev.Dao.MysqlDao dao = new Dev.Dao.MysqlDao(); name = nn.getName(id); //access database through session bean //name = dao.getName(id); //access database directly if(name!= null && !name.equals("")){ msg1 ="Welcome " + name +" ! You are from "+ dao.getCountry(id)+ " ."; }else{ msg1 ="Please Check Your ID. : " + id; } } msg = nn.Welcome() ;%>Welcome
<%= msg %>

Your ID:



<%=(msg1 == "")? "":msg1 + "


Connect to Database OK." %>



不要将此以上5行存入文件, 下同.

First First My First Session Bean FirstSession Dev.First.FirstSessionHome Dev.First.FirstSession Dev.First.FirstSessionBean Stateless Container






FirstSessionejb/FirstSession





jdbc/PostgresDS javax.sql.DataSource java:/PostgresDS





Postgresql driver jdbc/PostgresDS javax.sql.DataSource Container






FirstFirst.war/FirstFirst.jar



编译JAVA源程序,生成class文件.
进入JAVA源程序目录, 运行:
javac -classpath %classpath%;%jboss%serverdefaultdeployFirst.earFirst.jar *.java
或者
javac -classpath %jboss%serverdefaultdeployFirst.earFirst.jar;%jboss%clientjboss-j2ee.jar *.java

Copy 目录First.ear to jbossserverdefaultdeploy.
打开浏览器输入地址

到此, 在浏览器看到: Hello! This My Session Bean From Jboss.
说明这个EJB工作了.

如果按按钮, 没反应或出错. 原因没安装配置数据库, 下面安装配置Postgres数据库


For Windows2000
下载 PgSQL731wina1.exe ),
Finally you will see the next line, you need enter the password for Administrator
最后你将看下一个行,你必须为用户Administrator输入password.
********************
Enter password of user `.Administrator´:123456
********************

记下此password, 我的口令是123456.

从开始菜单 > Programm > PostgresSQL > Adjust PostgresSQL Configuration file
它将在Wordpad中打开PostgresSQL Configuration文件, 找到下列行,


#
# Connection Parameters
#
#tcpip_socket = false
#ssl = false

#max_connections = 32
#superuser_reserved_connections = 2

#port = 5432

修改编辑:
#
# Connection Parameters
#
tcpip_socket = true
#ssl = false

#max_connections = 32
#superuser_reserved_connections = 2

port = 5432

接着,保存文件.

起动PostgresSQL服务器:
开始菜单>Programm>PostgresSQL>Utilies>Start PostgresSQL server
起动命令行:
开始菜单>Programm>PostgresSQL>Utilies>Command Shell


执行下列命令,准备数据,
Administrator@SAN /
$ dir

$ cd bin

$ createdb test

$ psql test

test=# create table users
test-# (name varchar(20),
test(# id varchar(20),
test(# country varchar(20));
test=# insert into users values (´Sam´, ´123´, ´China´);
test=# insert into users values (´Tom´, ´321´, ´USA´);
test=# insert into users values (´Sean´, ´231´, ´France´);

test=# select * from users;
name | id | country
------+-----+---------
Sam | 123 | China
Tom | 321 | USA
Sean | 231 | France
(3 rows)

test=#

到此, 数据准备就绪.



For RedHat:
以root登陆, 执行下列命令,准备数据,

mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

Open and edit /usr/local/pgsql/data/pg_hba.conf

local all trust
host all 127.0.0.1 255.255.255.255 trust

just delete #, and save.


[root@localhost root]# su - postgres
-bash-2.05b$ /usr/bin/postmaster -i -D /usr/local/pgsql/data >logfile 2>&1 &
-bash-2.05b$ /usr/bin/createdb test
-bash-2.05b$ /usr/local/pgsql/bin/psql test
test=# .......the following same as Windows2000

到此, 数据准备就绪.


执行shutdown.bat or shutdown.sh, 停止Jboss Server.

找到JDBC drive.
为了在Jboss中使用连接池,需要拷贝jdbc drive 到Jboss/server/default/deploy , 在linux 我们能找到/usr/share/pgsql/pgjdbc2.jar,在wondows2000,我们能找到 PostgreSQLusrsharepostgresqljavapostgresql.jar
把其中之一复制到Jboss/server/default/deploy


配置Jboss

(1) 复制 $Jboss/examples/jca/postgres-service.xml 到 $Jboss/server/default/deploy/

(2) 打开编辑Jboss/server/default/deploy/postgres-service.xml

PostgresDS


jdbc:postgresql://localhost/test
org.postgresql.Driver

Administrator
123456


In my example, set Username Administrator, password 123456 for windows 2000
set Username Postgres, no password for Linux.
在我的例子中,
windows2000, 用户:Administrator,password:123456
Linux(RH8.0), 用户:Postgres, 没有password
因为PostgresSQL和windows2000使用不同的default用户名,所以在linux和window2000中这文件不同.当然,你可以加相同的PostgresSQL用户名和password在linux和window2000中, 这样这文件就相同了.

保存文件.

(3) 打开编辑 $Jboss/server/default/conf/standardjbosscmp-jdbc.xml
找到:
java:/DefaultDS
Hypersonic SQL
加入:
java:/PostgresDS
Postgres
保存文件.

(4) open and edit $Jboss/server/default/conf/standardjaws.xml
找到:
java:/DefaultDS
Hypersonic SQL
false
加入:
java:/PostgresDS
Postgres
false
保存文件.

现在重起JBoss.
打开浏览器输入地址
输入ID,按按钮.  

阅读(1003) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~