2

这是我的表格

  <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()

4

2 回答 2

2

另一种方式

使用该name属性,按下的按钮将包含在请求中

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

执行方法

 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";
 }
于 2015-10-05T10:09:54.243 回答
2

您应该为需要执行的每个逻辑操作定义一个操作。

可以驻留多个动作

  • 在不同的 Java 类中(例如ReadCardAction.java,UpdateCardAction.java等)或
  • 在具有多种方法(例如CardAction.javawithread()update())的单个 Java 类中。

如果您需要共享通用逻辑和辅助方法,则使用单个 Java 类会很方便,否则您可以利用继承来实现与单个文件相同的功能,如此处所述

要从一个表单中调用两个不同的操作,有以下三种方法:

  1. 使用action属性:

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

    这样,search将调用表单的操作方法 ( changeStatus),该方法默认为execute(),而save将调用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中的操作前缀,如此处所述

  2. 在按钮单击时使用 Javascript 更改表单的目标;

    • 单击 时search,指向changeStatus

    • 单击 时save,指向saveStatus

    您会发现数以千计的示例说明如何执行此操作

  3. 动态方法调用 (DMI)。不鼓励,不赞成,不要在家里尝试这个。我只是为了完整性而将其包括在内,因为您将来可能会在阅读其他人的遗留代码并说“什么?”时进入它。

于 2015-10-05T08:32:21.810 回答