Struts2中Action代码如下:@Service("transactionAction")
public class TransactionAction extends ActionSupport {
@Resource
private TransactionBiz transactionBiz;
@Resource
private UserBiz userBiz;
private Account account;
private TransactionLog log;
private Pager pager;

/**
 * 存款
 * @return
 */
public String deposit(){
//调用自定义方法isEnable判断账户是否冻结
if(isEnable()){
System.out.println(account.getBalance()+"存款");
//使用执行isEnable方法从session中重新获取的账户对象,给交易信息对象log中关联的账户对象属性赋值
log.setAccount(account);
ServletActionContext.getRequest().getSession().setAttribute("account", account);
//调用业务方法,更新账户表Account表中的余额,并在交易信息表transaction_log中添加交易记录
return isSuccess(transactionBiz.deposit(log));
}
return "message";
}
/**
 * 取款页面验证
 */
public void validateWithdrawal(){
//比较取款页面输入的金额与账户余额
account = (Account) ServletActionContext.getRequest().getSession().getAttribute("account");
if(log.getTrMoney()>account.getBalance()){
System.out.println("***");
this.addFieldError("trMoney","您的账户余额不足!");
}
}
/**
 *  取款
 * @return
 */
public String withdrawal(){
if(isEnable()){
log.setAccount(account);
ServletActionContext.getRequest().getSession().setAttribute("account", account);
return isSuccess(transactionBiz.withdrawal(log));
}
return "message";
}
/**
 * 转账页面验证
 */
public void validateTransfer(){
account = (Account)ServletActionContext.getRequest().getSession().getAttribute("account");
if(log.getOtherid().intValue()==account.getAccountid().intValue()){
this.addFieldError("log.otherid", "您不能转账给自己!");
}
if(userBiz.getAccount(log.getOtherid())==null){
this.addFieldError("log.otherid", "该账户不存在!");
}
if(log.getTrMoney()>account.getBalance()){
this.addFieldError("log.trMoney", "您的账户余额不足!");
}
}
/**
 * 转账
 * @return
 */
public String transfer(){
if(isEnable()){
log.setAccount(account);
ServletActionContext.getRequest().getSession().setAttribute("account", account);
return isSuccess(transactionBiz.transfer(log));
}
return "message";
}
/**
 * 分页显示交易记录
 * @return
 */
public String list(){
System.out.println(pager.getCurPage());
account = (Account)ServletActionContext.getRequest().getSession().getAttribute("account");
//获取待显示页的页码
int curPager = pager.getCurPage();
//根据待显示页的页码和账户对象获取交易记录
List<TransactionLog> logs = transactionBiz.getLogs(account, curPager);
//获得账户的交易记录总数,用来初始化分页类Pager对象,并设置其PerPageRows和rowCount属性
pager = transactionBiz.getPagerOfLogs(account);
//设置Pager对象中的待显示页页码
pager.setCurPage(curPager);
ServletActionContext.getRequest().setAttribute("logs", logs);
return "success";
}

/**
 * 自定义方法,判断账户是否冻结
 * @return
 */
private boolean isEnable(){
//从session中重新获取Account对象,该对象在登录成功时已保存到session中
account = (Account)ServletActionContext.getRequest().getSession().getAttribute("account");
userBiz.reflush(account);
if(account.getStatus().getName().equals("冻结")){
ActionContext.getContext().put("message", "对不起!该账户已被冻结,无法进行相关操作<br>");
return false;
}
return true;
}
/**
 * 自定义方法,根据执行结果,显示操作成功或失败信息
 * @param flag
 * @return
 */
private String isSuccess(boolean flag){
if(flag){
ActionContext.getContext().put("message", "操作成功!");
return "message";
}
ActionContext.getContext().put("message", "操作失败!<a href='javascript:history.go(-1)'>返回</a>");
return "message";
}



public TransactionLog getLog() {
return log;
}
public void setLog(TransactionLog log) {
this.log = log;
}
public Pager getPager() {
return pager;
}
public void setPager(Pager pager) {
this.pager = pager;
}
}struts.xml配置如下:<package name="transaction" namespace="/transaction" extends="struts-default">
<action name="deposit" class="transactionAction" method="deposit">
<result name="message">/message.jsp</result>
  <result name="input">/deposit.jsp</result>
</action>
<action name="withdrawal" class="transactionAction" method="withdrawal">
<result name="message">/message.jsp</result>
<result name="input">/withdrawal.jsp</result>
</action>
<action name="transfer" class="transactionAction" method="transfer">
<result name="message">/message.jsp</result>
<result name="input">/transfer.jsp</result>
</action>
<action name="list" class="transactionAction" method="list">
<result name="success">/transactionlog.jsp</result>
<result name="input">/transactionlog.jsp</result>
</action>
</package>JSP页面代码如下: <script language="javascript" >
function disptime(){
var now=new Date();

var year=now.getFullYear();
var month=now.getMonth()+1;
var date=now.getDate();
var hour=now.getHours();
var minute=now.getMinutes();
var second =now.getSeconds();
document.getElementById("datetime").value=year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;
//year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;
setTimeout("disptime()", 1000);
}

function withdrawal(){
var money=document.getElementById("trMoney").value;
if(money.length>0){
if(!(money.search(/^[\+\-]?\d+\.?\d*$/)==0))
{
document.getElementById("errormoney").innerHTML="含有非法字符";
return false;
}else
{
if(parseFloat(money)<=0)
{
document.getElementById("errormoney").innerHTML="金额必须大于0";
return false;
}
return confirm("确认取款吗?");
}
}else {
alert("金额不能为空!");
return false;

}
}
</script>
  </head>
  <body onload="disptime()">
<form  method="post" name="myform" action="/netbank/transaction/withdrawal" onsubmit="return withdrawal()">
<div align="center">
<table width="400" border="0" class="table">
<tbody>
<tr>
<td width="100">&nbsp;取款时间:</td>
<td><input type="text" name="log.datetime" id="datetime"></td>
</tr>
<tr>
<td>&nbsp;取款金额:</td>
<td>
<input type="text" name="log.trMoney" id="trMoney" ><!-- value="${log.trMoney} -->
<span id="errormoney" style="color:red;"></span>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;<input type="submit" value="取款" /> 
<span style="color:red;"> 
    <s:fielderror/>         
     </span> </td>
</tr>
</tbody>
</table> 出现的问题是:在部署好以后,正确的存款、取款都能完成,但是如果取款额超过当前余额时,取款验证没通过,页面显示错误信息,但当再次重新输入小于余额的数再提交时,还是不能完成正常跳转,依旧显示验证未通过的信息“您的账户余额不足!”,再执行存款时,无论输入大于余额还是小于余额的值都显示“您的账户余额不足!”,就好像是如果取款时的操作金额超过余额,之后无论再重新执行什么其它操作都会走取款的验证,不明白是为什么,求指教

解决方案 »

  1.   

    你的验证方法不是应该在一个validate()方法中么 
    怎么分出来写了
      

  2.   

    没有错误信息,就像是还是执行了验证失败的结果集,找“input”对应的结果页面了
      

  3.   

    你的判断逻辑上存在问题,看看是否是if  else的关系,而不仅仅是if后没有else了,有可能执行完if后,下面的还执行。
      

  4.   

    嗯,如果取款的验证失败了,不管执行其它存款还是转账还是重新输入一个新的取款金额且小于当前账户余额时,都还是显示之前取款金额过大的提示,分别验证不就是validateXxx()方法Xxx为正常的Action里的方法,例如登录的是public String loing(){...},那么对登录的验证就是public void validateLogin(){.....}
      

  5.   

    你写在一个validate()中  把验证的先后顺序自己调整把  再试试应该就可以了
      

  6.   

    可以分出来写啊,validateXxx()是和xxx方法对应的,如validateLogin方法是和login方法对应的,validateReg方法是和reg方法对应的。通过添加形如validateXxx方法可以对局部进行数据校验,当校验失败时Struts2会自动转到input,只有通过validateXxx(validteReg)方法验证后才会去执行Xxx(reg)方法
      

  7.   

    大神,我的上面那个问题解决了,现在可以正常运行,但我不知道是什么原因,我只是改了一下Spring的注解,原来我的TransactionAction是没在spring的配置文件applicationContext.xml中写
    <bean id="transactionAction" class="com.netbank.action.TransactionAction" scope="prototype"/>而是用的注解的方式在TransactionAction中@Service("transactionAction"),请问是这个的原因吗? 
      

  8.   

    上面我的问题解决了,原来:是ssh整合常见问题 , 因为struts2默认Action是多例的,也就是每次提交 都会新建一个Action实例, 那么第一次转账失败,不会影响第二次转账, 但是struts2 整合 Spring后, Struts2 如果配置到Spring 就变成 单例的, 那么第一次转账失败, 信息就保存到Action 中, 第二次转账 即使数据正确,也会出现 第一次错误, 因为Action 单例,没有去除之前的错误信息。
    解决方案: 在spring 中配置Struts2 的Action  scope="prototype"。
    我之前用的是Spring的注解方式,所以action是单例的