2013-05-10 17 views
0

我正在struts2中開發一個示例web應用程序。但我得到一些怪異的行爲無法理解註冊方法在準備後未被調用的原因。總是customeraction-validation.xml被稱爲

CustomerAction.java:

package com.astro.action; 


import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
import java.util.Map; 
import javax.servlet.http.*; 
import javax.servlet.*; 
import com.astro.model.*; 

import org.apache.struts2.interceptor.SessionAware; 
import org.apache.struts2.interceptor.validation.SkipValidation; 

//import org.hibernate.classic.Validatable; 

import com.astro.base.framework.AstroSystemException; 
import com.astro.bo.CustomerBo; 
import com.astro.model.Customer; 
import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionSupport; 
import com.opensymphony.xwork2.ModelDriven; 
import com.opensymphony.xwork2.Preparable; 
import com.opensymphony.xwork2.Validateable; 

public class CustomerAction extends ActionSupport implements Serializable,SessionAware,Preparable, ModelDriven<CustomerPageInfo>{ 
    private static final long serialVersionUID = 2335707118972931221L; 

    private Map<String,Object> session; 
    String target = ""; 
    //DI via Spring 

    private CustomerPageInfo model; 
    private CustomerBo customerBo; 
    private Customer customer=new Customer(); 
    public CustomerBo getCustomerBo() { 
     return customerBo; 
    } 
    public void setCustomerBo(CustomerBo customerBo) { 
     this.customerBo = customerBo; 
    } 

    public String errorDisplay() 
    { 
     return "input"; 
    } 
    //Register a Customer 
      public String register() throws Exception{ 
       System.out.println("I am in register method of CustomerAction.java"); 
       System.out.println("((())))"+model.getCountryList().toString()); 
       System.out.println("((())))"+model.getCustomerInfo()); 
       model.getCustomerInfo().setCreatedDate(new Date()); 
       customerBo.register(customer); 
       return SUCCESS; 
       } 

    public void prepare() throws Exception { 
     if(model==null) 
     { 
      model=new CustomerPageInfo(); 
      System.out.println("In prepare method"); 
      if(model.getCountryList()==null) 
      { 
       List<NameValuePair> countryList=customerBo.getAllCountries(); 
       model.setCountryList(countryList); 
      } 
      System.out.println("Before initializing"+model.getCustomerInfo()); 
      if(model.getCustomerInfo()==null) 
      { 
       model.setCustomerInfo(customer); 
      } 
      System.out.println("After initializing"+model.getCustomerInfo()); 
     } 

    } 

    @Override 
    public void setSession(Map<String, Object> map) { 
     this.session=map; 
    } 

    /*public void validate() 
    { 
     try { 
      if(customerBo.doesCustomerExists(customer)==true) 
      { 
       addActionError("Customer Alreay Exists"); 
      } 
      else 
      { 
       addActionMessage(INPUT); 
      } 
     } catch (AstroSystemException e) { 
      e.printStackTrace(); 
     } 

    } 
*/ 
    public void setModel(CustomerPageInfo model) 
    { 

    this.model=model; 
    } 

    public CustomerPageInfo getModel() 
    { 
     return model; 
    } 
} 

struts.xml中:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
"http://struts.apache.org/dtds/struts-2.0.dtd"> 

<struts> 
    <constant name="struts.devMode" value="true" /> 
    <constant name="struts.configuration.xml.reload" value="true" /> 
    <constant name="struts.action.extension" value="do" /> 
    <constant name="struts.objectFactory" value="spring" /> 
    <constant name="struts.custom.i18n.resources" value="ApplicationResources" /> 
    <!-- <constant name="struts.freemarker.mru.max.strong.size" value="250" /> --> 
    <constant name="struts.freemarker.templatesCache.updateDelay" 
     value="60000" /> 
    <constant name="struts.enable.DynamicMethodInvocation" value="true" /> 

    <package name="astro" extends="struts-default" namespace="/"> 

     <!-- Different types of result types --> 
     <result-types> 
      <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" /> 
     </result-types> 

     <interceptors> 
       <interceptor-stack name="defaultStack"> 
       <interceptor-ref name="exception"/> 
       <interceptor-ref name="alias"/> 
       <interceptor-ref name="servletConfig"/> 
       <interceptor-ref name="prepare"/> 
       <interceptor-ref name="chain"/> 
       <interceptor-ref name="debugging"/> 
       <interceptor-ref name="modelDriven"/> 
       <interceptor-ref name="checkbox"/> 
       <interceptor-ref name="multiselect"/> 
       <interceptor-ref name="actionMappingParams"/> 
       <interceptor-ref name="params"> 
        <param name="excludeParams">dojo\..*,^struts\..*</param> 
       </interceptor-ref> 
       <interceptor-ref name="conversionError"/> 
       <interceptor-ref name="validation"> 
        <param name="excludeMethods">input,back,cancel,browse</param> 
       </interceptor-ref> 
       <interceptor-ref name="workflow"> 
        <param name="excludeMethods">input,back,cancel,browse</param> 
       </interceptor-ref> 
      </interceptor-stack> 

     </interceptors> 
     <action name="registerCustomer" class="customerAction" method="register"> 
      <interceptor-ref name="defaultStack"/> 
      <result name="success" type="redirectAction"> 
       <param name="actionName">successInformation</param> 
      </result> 
      <result name="input" type="tiles">/registration.tiles</result> 
     </action> 

     <action name="successInformation" class="com.astro.action.DisplayAction" 
      method="display"> 
      <interceptor-ref name="defaultStack"/> 
      <result name="success" type="tiles">/regSuccess.tiles</result> 
     </action> 

     <action name="loginCustomer" class="loginAction" method="login"> 
      <result name="success" type="tiles">/loginSuccess.tiles</result> 
      <result name="input" type="tiles">/loginForm.tiles</result> 
     </action> 

     <action name="loginCustomer1" class="loginAction" method="logout"> 
      <result name="success" type="tiles">/loginForm.tiles</result> 
      <result name="input" type="tiles">/loginForm.tiles</result> 
     </action> 

     <action name="login" class="com.astro.action.DisplayAction1" 
      method="display"> 
      <result name="success" type="tiles">/loginForm.tiles</result> 
     </action> 
     <action name="feedback" class="com.astro.action.DisplayAction1" 
      method="display1"> 
      <result name="success" type="tiles">/contact.tiles</result> 
      <result name="input" type="tiles">/contact.tiles</result> 
     </action> 
     <action name="contactus" class="contactAction" method="contact"> 
      <result name="success" type="tiles">/contactus.tiles</result> 
      <result name="input" type="tiles">/contactsuccess.tiles 
      </result> 
     </action> 
    </package> 

</struts> 

customer.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<%@page session="false"%> 
<%@ taglib prefix="s" uri="/struts-tags"%> 
<style type="text/css"> 
@import url(css/main.css); 
</style> 
<style> 
.errorMessage { 
    color: red; 
} 
.errors { 
    background-color:#FFCCCC; 
    border:1px solid #CC0000; 
    width:400px; 
    margin-bottom:8px; 
    font: message-box; 
} 
.errors li{ 
    list-style: none; 
    } 
</style> 
<style type="text/css"> 
.errorsBg{ 
    background-color:; 
    color:black;  
    border: 0px solid; 
} 

.errorMessage{ 
    padding:4px 8px; 
} 

table{ 
    border-spacing: 8px; 
} 
td{ 
    padding:5px; 
} 
</style> 
<script> 
/* $(document).ready(function(){ 
    $("input").keydown(function(){ 
    $("input").css("background-color","yellow"); 
    }); 
    $("input").keyup(function(){ 
    $("input").css("background-color","pink"); 
    }); 
}); */ 
</script> 
</head> 

<html> 
<head> 
</head> 
<body bgcolor="green"> 
    <!-- <h1>Welcome to Astro vedic</h1> 
    <h2>Register a Customer</h2> --> 
    <div class="errors" style="width: 500px"> 
    <s:token></s:token> 
    </div> 
<s:if test="hasActionErrors()"> 
    <div class="errors"> 
     <s:actionerror/> 
    </div> 
</s:if> 
<s:form action="registerCustomer.do" focusElement="focus" method="post" validate="true" namespace="/"> 
<s:actionerror /> 
      <s:textfield id="focus" name="name" key="name" size="20" /> 
      <s:password name="password" label="Password "/> 
      <s:password name="confirmPassword" label="Re-enter Password "/> 
      <s:textfield name="email" key="email" size="20" required="true" /> 
      <s:textfield name="telephone" key="telephone" size="20"></s:textfield> 
      <s:select required="true" name="countryCode" label="CountryName" listValue="name" headerKey="" headerValue="Choose One" 
      list="countryList" listKey="value"/> 
      <s:submit align="center" key="addCustomer"/> 

     </s:form> 
    </div> 
</body> 
</html> 

當我運行代碼時,它將準備方法但不註冊方法。不僅如果我刪除customerAction-validation.xml,然後它將註冊方法,但沒有保存在數據庫中。

準備方法被調用兩次。我不知道如何調用註冊方法,並保存了客戶詳細信息。

+0

如果您沒有放置Java標記,則Java代碼片段不會被語法高亮顯示;) – 2013-05-10 23:57:07

回答

1

prepare()您檢查model;

modelPARAMS攔截設置(模型驅動攔截也應該被捲入,不知道如何,因爲我從來沒有用過模型驅動),晚於運行準備攔截,你可以看到在你的defaultStack定義中;

你需要使用一個名爲paramsPrepareParamsStack堆棧,包括兩次PARAMS攔截,一前一的後準備攔截,爲讓prepare()方法與參數(模型工作或不)來自頁面。

http://struts.apache.org/release/2.3.x/docs/interceptors.html

paramsPrepareParams特技的一個例子。該堆棧 與defaultStack完全相同,只是它在準備攔截器之前包含一個額外的攔截器: params攔截器。

當你希望直接 參數適用於要加載的外部(例如,DAO 或數據庫或服務層)的對象這是有用的,但不能加載該對象 直到至少ID參數已被加載。通過加載 這個參數兩次,你可以檢索到對象在prepare()方法中的 ,允許第二個params攔截器到 應用這個對象的值。

相關問題