2015-10-05 56 views
2

這裏是我的形式如何在struts2表單中使用搜索和保存按鈕?

<s:form action="changeStatus"> 
    <s:div class="table"> 
     <s:textfield name="custId" label="CUSTOMER ID" /> 
     <s:textfield name="lifewardsCard" label="LIFE WARDS CARD NUMBER" 
      size="20" /> 
     <s:textfield name="clientNo" label="CLIENT NUMBER" /> 
     <s:textfield name="custName" label="CUSTOMER NAME" /> 
     <s:textfield name="cardExpiryDate" label="CARD EXPIRY DATE(MMYYYY)" /> 
     <s:select name="status" label="CARD STATUS" 
      list="#{'1':'Active', '2':'Inactive'}" /> 
     <tr> 
      <td><s:submit value="search" theme="simple" /></td> 
      <td><s:submit value="save" theme="simple" /></td> 
      <td><s:submit type="button" theme="simple" 
        onclick="clear();return false;" value="clear" /></td> 
     </tr> 
    </s:div> 
</s:form> 

用戶將輸入領域CUSTID並點擊搜索按鈕 我能夠從數據庫中獲取的值,並將其 在頁面上,但我想要做的是顯示在後他可以編輯數據的數據,並且應該能夠通過點擊保存按鈕來保存數據。 這裏是我的xml配置

<action name="changeStatus" class="com.struts.lifewardscard.ChangeAction"> 
    <result name="input">ChangeCardStatus.jsp</result> 
    <result name="success">ChangeCardStatus.jsp</result> 
</action>  

,這裏是我的動作類

public class ChangeAction extends ActionSupport implements ModelDriven { 
    CardStatusForm cardSform=new CardStatusForm(); 
    public String execute() throws Exception{ 
     String clientId=null; 
     HttpServletRequest request = ServletActionContext.getRequest(); 
     getCardHolderDetails();  
     return "success"; 

    } 

    private void getCardHolderDetails() { 
     Connection c = null; 
     Boolean empty = true; 
     DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.S"); 

     // Format date into output format 
     DateFormat outputFormat = new SimpleDateFormat("dd-MMM-yyyy"); 
     try { 
      c = Conexion.getConnection(); 
      CallableStatement cst = c 
        .prepareCall("{call P_GET_CARD_DETAIILS(?,?)}"); 
      cst.setString(1, cardSform.getCustId()); 
      cst.registerOutParameter(2, OracleTypes.CURSOR); 
      cst.executeUpdate(); 
      ResultSet rs = (ResultSet) cst.getObject(2); 
      while (rs.next()) { 
       cardSform.setLifewardsCard(rs.getString(1)); 
       cardSform.setClientNo(rs.getString(2)); 
       if(rs.getString(3).equalsIgnoreCase("active")) 
       { 
        cardSform.setStatus(1); 
       }else 
       { 
        cardSform.setStatus(2); 
       } 

       cardSform.setCustName(rs.getString(4)); 
       cardSform.setCardExpiryDate(rs.getString(5)); 
       System.out.println(inputFormat.parse(rs.getString(6))); 
       empty = false; 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 


    } 


    @Override 
    public Object getModel() { 
     // TODO Auto-generated method stub 
     return cardSform; 
    } 
} 

即使我可以寫,可以節省在動作類中的數據的方法,我不找到一個方法來調用該方法與撥打其他方法getCardHolderDetails()

+0

@AleksandrM你能否詳細說明如何使用'方法:'前綴,爲什麼OP沒有在他/她的問題中使用它?我真的很喜歡使用這個前綴,而不是醜陋的'action:'或者更好,沒有任何前綴。 –

+0

@RomanC:你在那些問題中找到了方法前綴的位置? ;)無論如何來自文檔:*要使用方法屬性(使用指向不同操作方法的多個提交按鈕),必須將struts.enable.DynamicMethodInvocation設置爲true,但這會導致安全漏洞 - 謹慎使用!*。 –

+0

@AleksandrM由你鏈接,是的,文檔是正確的... –

回答

2

你應該定義一個動作您需要執行每個邏輯動作

多個動作可以在具有多個方法(例如。CardAction.javaread()update())的單個Java類駐留

    在不同的Java類
  • (例如ReadCardAction.javaUpdateCardAction.java等)或

使用單一的Java類,可以方便的,如果你需要分享共同的邏輯和輔助方法,否則,你可以利用繼承來實現相同的單文件,as described here

從一個單一的形式中調用兩個不同的動作,有三種方式:

  1. 使用action屬性:

    <s:submit value="search"      /> 
    <s:submit value="save" action="saveStatus" /> 
    

    這樣,搜索將調用形式的操作方法(changeStatus),即默認爲​​,而保存會調用saveStatus動作,表示你會映射到update()方法:

    <action name="changeStatus" class="com.struts.lifewardscard.ChangeAction">   
        <result name="success">ChangeCardStatus.jsp</result> 
        <result name="input">ChangeCardStatus.jsp</result> 
    </action> 
    
    <action name="saveStatus" class="com.struts.lifewardscard.ChangeAction" method="update"> 
        <result name="success">ChangeCardStatus.jsp</result> 
        <result name="input">ChangeCardStatus.jsp</result> 
    </action> 
    

    要做到這一點對Struts2的> 2.3.15.2你需要激活動作前綴在struts.xml中as described here

  2. 在按鈕單擊時使用Javascript更改表單的目標;

    • 點擊搜索,指向changeStatus

    • 時,當點擊保存,以saveStatus點。

    你會找到thousands of examples of how to do this

  3. Dynamic Method Invocation (DMI)。不鼓勵,不推薦使用,不要在家裏試用。我只是爲了完整而包括它,因爲你可以在閱讀其他人的遺留代碼的同時進入它,並說「whut?」。

+0

但基本上1.它是DMI :)而且我們正在努力將DMI帶回:) –

+0

嗯,有點@LukaszLenart,DMI可以讓你調用一個動作的方法,動作前綴不那麼強大,只需要你調用映射的動作。我寧願把它稱爲半DMI ...它仍然聽起來很奇怪,手動改變目標與JavaScript *每*時間,聽起來太hackishly不自動,但我想,改變目標的香草JavaScript可以直接生成以透明的方式提交''的主題......這很有趣。我的2美分顯然 –

+1

你是對的:) –

2

另一種方式

使用name屬性和按下按鈕將被包含在請求

<td><s:submit name="search" value="search" theme="simple" /></td> 
<td><s:submit name="save" value="save" theme="simple" /></td> 

Execute方法

public String execute() throws Exception{ 
     String clientId=null; 
     HttpServletRequest request = ServletActionContext.getRequest(); 
     if (request.getParameter("search") != null) { 
      // search button pressed 
      .... 
     } else if (request.getParameter("save") != null) { 
      // save button pressed 
      .... 
     } 
     return "success"; 
} 
+0

也是,這是第四種方式,但是比DMI更好 –

相關問題