在Weblogic 10中做EJB3的开发 之基础开发 (3)
---------------------------------------------------------------------------
下面用jsp实现表示层,还是两个,一个是有状态会话Bean的业务,一个是无状态会话Bean的业务。
文件地址:[WebContext/JavaSource/com/mh/servlet/test/ejb3statefull/AccountMoneyStatelessSV.java]
包名:[com.mh.servlet.test.ejb3statefull]
名称:[AccountMoneyStatelessSV]
内容如下:
----------------------------------------------------------------------
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage=""%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>测试-使用有状态会话Bean</title>
</head>
<script language="javascript" type="text/javascript">
/**
* 函数名: getSysAliasAss
* 功能描述: 获取运行系统别名(辅助)
*/
function getSysAliasAss(){
//读取系统当前请求的pathName
var strPathName = window.location.pathname;
//以字符串"/"分割到数组
var oAryTmp = strPathName.split("/");
//系统别名
var strSysAlias = "/" + oAryTmp[1];
//返回函数值
return strSysAlias;
}
/**
* 函数名: isInitAccount
* 功能描述: 是否已经初始化
*/
function isInitAccount(){
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=isInitAccount";
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strIsInitAccount = xmlHttpReq.responseText;
//返回函数值
return strIsInitAccount;
}
/**
* 函数名: initAccount
* 功能描述: 初始化账户
*/
function initAccount(){
//账户是否已经初始化
var strIsInitAccount = isInitAccount();
if(strIsInitAccount != null && strIsInitAccount == "yes"){
alert("账户已经初始化!不能重复初始化!");
return false;
}
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=initAccount";
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strMessage = xmlHttpReq.responseText;
outMessage.innerHTML = strMessage;
//刷新账户状态
refreshState();
//返回函数值
return true;
}
/**
* 函数名: delAccount
* 功能描述: 删除账户
*/
function delAccount(){
//账户是否已经初始化
var strIsInitAccount = isInitAccount();
if(strIsInitAccount != null && strIsInitAccount == "no"){
alert("账户还没有初始化!");
return false;
}
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=delAccount";
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strMessage = xmlHttpReq.responseText;
outMessage.innerHTML = strMessage;
//刷新账户状态
refreshState();
//返回函数值
return true;
}
/**
* 函数名: charge
* 功能描述: 给账户冲值
*/
function charge(){
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//获取账户
var strAccountCharge = accountCharge.value;
//金额
var fMoney = chargeMoney.value;
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=charge&account=" + strAccountCharge + "&money=" + fMoney;
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strMessage = xmlHttpReq.responseText;
outMessage.innerHTML = strMessage;
//返回函数值
return true;
}
/**
* 函数名: pay
* 功能描述: 账户扣款
*/
function pay(){
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//获取账户
var strAccountPay = accountPay.value;
//金额
var fMoney = payMoney.value;
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=pay&account=" + strAccountPay + "&money=" + fMoney;
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strMessage = xmlHttpReq.responseText;
outMessage.innerHTML = strMessage;
//返回函数值
return true;
}
/**
* 函数名: refreshState
* 功能描述: 刷新账户状态
*/
function refreshState(){
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=isInitAccount";
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strIsInitAccount = xmlHttpReq.responseText;
if(strIsInitAccount != null && strIsInitAccount == "no"){
accountState.innerHTML = "<font color='red'>没有初始化</font>";
}else if(strIsInitAccount != null && strIsInitAccount == "yes"){
accountState.innerHTML = "<font color='blue'>激活</font>";
}
//返回函数值
return true;
}
/**
* 函数名: account
* 功能描述: 获取账户余额
*/
function account(){
//账户是否已经初始化
var strIsInitAccount = isInitAccount();
if(strIsInitAccount != null && strIsInitAccount == "no"){
alert("账户还没有初始化!");
return false;
}
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneySV.do?dowith=account";
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strMessage = xmlHttpReq.responseText;
outMessage.innerHTML = strMessage;
//返回函数值
return true;
}
</script>
<body>
<p>账户管理:<br>
<hr width="100%" size="1" />
</p>
<table width="600" border="0" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td bgcolor="#FFFFFF">
<table width="600" border="0" cellspacing="1" cellpadding="0">
<tr>
<td height="20" bgcolor="#CCCCCC">有状态会话Bean测试</td>
</tr>
<tr>
<td height="20">
<hr width="100%" size="1" />
</td>
</tr>
<tr>
<td height="20">
<input name="initAccount" type="button" id="initAccount" value="账户初始化" οnclick="initAccount();" />
<input type="button" name="Submit" value="删除账户A、B" οnclick="delAccount();" />
账户当前状态:<span id="accountState"></span>
<input name="refreshState" type="button" id="refreshState" value="刷新" οnclick="refreshState()" /> </td>
</tr>
<tr>
<td height="20">选择一个账户:
<select name="accountCharge" id="accountCharge">
<option>选择一个账户</option>
<option value="A">A</option>
<option value="B">B</option>
<option value="ALL">All</option>
</select>
冲值金额:
<input name="chargeMoney" type="text" id="chargeMoney" size="10" /> 元 <input
name="charge" type="button" id="charge" value="冲值" οnclick="charge();" /></td>
</tr>
<tr>
<td height="20">选择一个账户:
<select name="accountPay" id="accountPay">
<option>选择一个账户</option>
<option value="A">A</option>
<option value="B">B</option>
<option value="ALL">All</option>
</select>
扣款金额:
<input name="payMoney" type="text" id="payMoney" size="10" /> 元 <input name="pay"
type="button" id="pay" value="扣款" οnclick="pay();" /></td>
</tr>
<tr>
<td height="20">
<input name="account" type="button" id="account" value="账户余额" οnclick="account();" />
</td>
</tr>
<tr>
<td height="40"><span id="outMessage"></span></td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
----------------------------------------------------------------------
这个是实现有状态会话Bean。
文件地址:[WebContext/account_stateless.jsp]
----------------------------------------------------------------------
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage=""%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>测试-使用无状态会话Bean</title>
</head>
<script language="javascript" type="text/javascript">
/**
* 函数名: getSysAliasAss
* 功能描述: 获取运行系统别名(辅助)
*/
function getSysAliasAss(){
//读取系统当前请求的pathName
var strPathName = window.location.pathname;
//以字符串"/"分割到数组
var oAryTmp = strPathName.split("/");
//系统别名
var strSysAlias = "/" + oAryTmp[1];
//返回函数值
return strSysAlias;
}
/**
* 函数名: isInitAccount
* 功能描述: 是否已经初始化
*/
function isInitAccount(){
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=isInitAccount";
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strIsInitAccount = xmlHttpReq.responseText;
//返回函数值
return strIsInitAccount;
}
/**
* 函数名: initAccount
* 功能描述: 初始化账户
*/
function initAccount(){
//账户是否已经初始化
var strIsInitAccount = isInitAccount();
if(strIsInitAccount != null && strIsInitAccount == "yes"){
alert("账户已经初始化!不能重复初始化!");
return false;
}
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=initAccount";
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strMessage = xmlHttpReq.responseText;
outMessage.innerHTML = strMessage;
//刷新账户状态
refreshState();
//返回函数值
return true;
}
/**
* 函数名: delAccount
* 功能描述: 删除账户
*/
function delAccount(){
//账户是否已经初始化
var strIsInitAccount = isInitAccount();
if(strIsInitAccount != null && strIsInitAccount == "no"){
alert("账户还没有初始化!");
return false;
}
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=delAccount";
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strMessage = xmlHttpReq.responseText;
outMessage.innerHTML = strMessage;
//刷新账户状态
refreshState();
//返回函数值
return true;
}
/**
* 函数名: charge
* 功能描述: 给账户冲值
*/
function charge(){
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//获取账户
var strAccountCharge = accountCharge.value;
//金额
var fMoney = chargeMoney.value;
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=charge&account=" + strAccountCharge + "&money=" + fMoney;
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strMessage = xmlHttpReq.responseText;
outMessage.innerHTML = strMessage;
//返回函数值
return true;
}
/**
* 函数名: pay
* 功能描述: 账户扣款
*/
function pay(){
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//获取账户
var strAccountPay = accountPay.value;
//金额
var fMoney = payMoney.value;
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=pay&account=" + strAccountPay + "&money=" + fMoney;
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strMessage = xmlHttpReq.responseText;
outMessage.innerHTML = strMessage;
//返回函数值
return true;
}
/**
* 函数名: refreshState
* 功能描述: 刷新账户状态
*/
function refreshState(){
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=isInitAccount";
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strIsInitAccount = xmlHttpReq.responseText;
if(strIsInitAccount != null && strIsInitAccount == "no"){
accountState.innerHTML = "<font color='red'>没有初始化</font>";
}else if(strIsInitAccount != null && strIsInitAccount == "yes"){
accountState.innerHTML = "<font color='blue'>激活</font>";
}
//返回函数值
return true;
}
/**
* 函数名: account
* 功能描述: 获取账户余额
*/
function account(){
//账户是否已经初始化
var strIsInitAccount = isInitAccount();
if(strIsInitAccount != null && strIsInitAccount == "no"){
alert("账户还没有初始化!");
return false;
}
//创建Ajax对象
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");
//确定请求的Url
var strUrl = getSysAliasAss() + "/sv/AccountMoneyStatelessSV.do?dowith=account";
//发出请求
xmlHttpReq.open("GET", strUrl, false);
xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8;");
xmlHttpReq.send();
//读取数据
var strMessage = xmlHttpReq.responseText;
outMessage.innerHTML = strMessage;
//返回函数值
return true;
}
</script>
<body>
<p>账户管理:<br>
<hr width="100%" size="1" />
</p>
<table width="600" border="0" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td bgcolor="#FFFFFF">
<table width="600" border="0" cellspacing="1" cellpadding="0">
<tr>
<td height="20" bgcolor="#CCCCCC">无状态会话Bean测试</td>
</tr>
<tr>
<td height="20">
<hr width="100%" size="1" />
</td>
</tr>
<tr>
<td height="20">
<input name="initAccount" type="button" id="initAccount" value="账户初始化" οnclick="initAccount();" />
<input type="button" name="Submit" value="删除账户A、B" οnclick="delAccount();" />
账户当前状态:<span id="accountState"></span>
<input name="refreshState" type="button" id="refreshState" value="刷新" οnclick="refreshState()" /> </td>
</tr>
<tr>
<td height="20">选择一个账户:
<select name="accountCharge" id="accountCharge">
<option>选择一个账户</option>
<option value="A">A</option>
<option value="B">B</option>
<option value="ALL">All</option>
</select>
冲值金额:
<input name="chargeMoney" type="text" id="chargeMoney" size="10" /> 元 <input
name="charge" type="button" id="charge" value="冲值" οnclick="charge();" /></td>
</tr>
<tr>
<td height="20">选择一个账户:
<select name="accountPay" id="accountPay">
<option>选择一个账户</option>
<option value="A">A</option>
<option value="B">B</option>
<option value="ALL">All</option>
</select>
扣款金额:
<input name="payMoney" type="text" id="payMoney" size="10" /> 元 <input name="pay"
type="button" id="pay" value="扣款" οnclick="pay();" /></td>
</tr>
<tr>
<td height="20">
<input name="account" type="button" id="account" value="账户余额" οnclick="account();" />
</td>
</tr>
<tr>
<td height="40"><span id="outMessage"></span></td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
----------------------------------------------------------------------
这个是实现无状态会话Bean。
上面两个表示层使用了Ajx技术,据微软说Ajax是一种老调重谈的技术,但是我很纳闷,为什么以前我一直想要实现这样的效果就从来没有人跟我说呢?!所以,我觉得AJax是一门新技术,而且应该再次基础上发展,它应该是很有潜质的。
接下来要在欢迎页面[WebContext/index.jsp]中加入下面的部分:
----------------------------------------------------------------------
<p>
<center>
EJB3测试:有状态会话Bean与无状态会话Bean的差别<br>
<a href="<%=request.getContextPath() %>/account.jsp" target="_blank">账户管理:有状态会话Bean实现</a><br>
<a href="<%=request.getContextPath() %>/account_stateless.jsp" target="_blank">账户管理:无状态会话Bean实现</a>
</center>
</p>
----------------------------------------------------------------------
最后使用[build.xml]来构建发布程序吧!
测试效果的时候,你会发现,有状态的两个账户[A、B]的金额是无不关连互不影响的,但是,无状态就会出现,A账户增加减少金额,会反应在A、B上,而且删除账户后,再从新创建账户,账户的金额会反应在新创建的账户上。这就就说明,无状态会话Bean是可以被重复利用,并不会因为一个用户不使用就从容器中删除,而是由容器来合理配置,继续提供给下一个用户使用;而用状态会话Bean它只与一个用户保持关联,每个用户的调用,都是一个新的Bean对象。