2015-06-28 37 views
0

我認爲我的問題很簡單,但我試圖從一個星期才能完成這項工作。如何從列表對象中的屬性從一個到第二個動作

我有一個MainAction其中有Processes像這樣的列表:

private List<Process> processes; 

與getter和setter

編輯或刪除過程中,我有一個processForm.jsp和ProcessAction

所以我的問題是從列表中獲取一個特殊進程的ID到ProcessAction

當我試圖這樣的:

<s:hidden name="processes[%{#status.index}].id"/> 

的id是隱藏字段

<input type="hidden" name="processes[0].id" value="20" id="ShowMain_processes_0__id"> 

但不映射到該動作

裏面,當我嘗試這樣的:

<s:hidden name="process.id" value="processes[%{#status.index}].id"/> 

i噸根本不工作....

所以有人可以幫我怎麼做?

在這裏,新的細節:

struts.xml的

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" 
    "http://struts.apache.org/dtds/struts-2.1.dtd"> 

<struts> 
<package name="default" extends="tiles-default"> 

    <action name="ShowMain" class="com.goemon.smart.action.MainAction"> 
     <result type="tiles">mainForm</result> 
    </action> 

    <action name="Cancel" class="com.goemon.smart.action.MainAction"> 
     <result type="redirectAction">ShowMain</result> 
    </action> 

    <action name="ExecuteStartAction" class="com.goemon.smart.action.MainAction" method="executeStartCommand"> 
     <result name="success" type="redirectAction">ShowMain</result> 
     <result name="input" type="redirectAction">ShowMain</result> 
    </action> 

    <action name="ExecuteStopAction" class="com.goemon.smart.action.MainAction" method="executeStopCommand"> 
     <result name="success" type="redirectAction">ShowMain</result> 
     <result name="input" type="redirectAction">ShowMain</result> 
    </action> 

    <action name="DeleteProcess" class="com.goemon.smart.action.MainAction" method="deleteProcess"> 
     <result name="success" type="redirectAction">ShowMain</result> 
    </action> 

    <action name="ShowAction" class="com.goemon.smart.action.ProcessAction"> 
     <result type="tiles">actionForm</result> 
    </action> 

    <action name="CreateAction" class="com.goemon.smart.action.ProcessAction" method="createAction"> 
     <result name="success" type="redirectAction">ShowMain</result> 
     <result name="error" type="redirectAction">ShowAction</result> 
     <result name="input" type="redirectAction">ShowAction</result> 
    </action> 

    <action name="EditCommandAction" class="com.goemon.smart.action.ProcessAction" method="editAction"> 
     <result name="success" type="tiles">actionForm</result> 
    </action> 

    <action name="InsertDefault" class="com.goemon.smart.action.ProcessAction" method="insertDefaults"> 
     <result name="success" type="redirectAction">ShowMain</result> 
    </action> 

</package> 

mainForm.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> 

<%@ taglib uri="/struts-tags" prefix="s" %> 

<div class="container"> 
<legend> 
    <h1><s:text name="header.mainpage"/></h1> 
</legend> 

<s:iterator var="currentProcess" value="processes"> 
    <div class="jumbotron well col-lg-5 col-lg-offset-1"> 
     <s:form theme="bootstrap" cssClass="bs-example form-horizontal"> 

      <div class="btn-toolbar pull-right"> 
       <s:a action="DeleteProcess"> 
        <button type="button" class="btn btn-default" aria-label="Left Align"> 
         <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> 
        </button> 
       </s:a> 
       <s:a action="EditCommandAction"> 
        <button type="button" class="btn btn-default" aria-label="Left Align"> 
         <span class="glyphicon glyphicon-cog" aria-hidden="true"></span> 
        </button> 
       </s:a> 
      </div> 

      <s:hidden name="id" value="%{#currentProcess.id}"/> 

      <h2> 
       <s:text name="%{#currentProcess.name}"/> 
      </h2> 

      <div class="btn-toolbar pull-right"> 
       <s:submit key="btn.start" action="ExecuteStartAction" 
          cssClass="btn btn-primary btn-lg btn-success"/> 
       <s:submit key="btn.stop" action="ExecuteStopAction" 
          cssClass="btn btn-primary btn-lg btn-danger"/> 
      </div> 
     </s:form> 
    </div> 
</s:iterator> 
<s:debug/> 

processForm.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> 

<%@ taglib uri="/struts-tags" prefix="s" %> 

<div class="col-lg-6 col-lg-offset-3 well"> 
<div class="col-lg-12"> 
    <s:form theme="bootstrap" cssClass="bs-example form-horizontal"> 

     <legend> 
      <s:text name="header.manage"/> 
     </legend> 

     <s:hidden name="initial"/> 
     <s:textfield name="process.name" key="lbl.process.name" cssClass="col-lg-12"/> 
     <s:textfield name="process.host" key="lbl.process.host" cssClass="col-lg-12"/> 

     <div class="col-lg-11 pull-right"> 
      <s:iterator var="counter" begin="0" end="2"> 
       <div class="col-lg-12"> 
        <s:hidden name="process.commands[%{#counter}].id"/> 

        <s:select key="lbl.command.type" list="commandTypeValues" 
           name="process.commands[%{#counter}].commandType" headerKey="" 
           headerValue="%{commandTypeValues[#counter]}"/> 

        <s:textfield name="process.commands[%{#counter}].command" 
           key="lbl.process.command"/> 
       </div> 
      </s:iterator> 
     </div> 

     <s:textfield name="process.user" key="lbl.process.user" cssClass="col-lg-12"/> 
     <s:textfield name="process.password" key="lbl.process.password" cssClass="col-lg-12"/> 

     <s:submit key="btn.create" action="CreateAction" cssClass="btn btn-primary pull-right"/> 
     <s:submit key="btn.cancel" action="Cancel" cssClass="btn btn-primary pull-right"/> 

     <s:debug /> 
    </s:form> 
</div> 

ProcessAction.java

package com.goemon.smart.action; 

import com.goemon.smart.model.CommandType; 
import com.goemon.smart.model.Process; 
import com.goemon.smart.service.ProcessService; 
import com.goemon.smart.util.DefaultingUtil; 
import com.opensymphony.xwork2.ActionSupport; 
import com.opensymphony.xwork2.Preparable; 
import org.springframework.beans.factory.annotation.Autowired; 

/** 
* Created by John on 4/4/15. 
*/ 
public class ProcessAction extends ActionSupport implements Preparable { 

@Autowired 
private ProcessService processService; 

@Autowired 
private DefaultingUtil defaultingUtil; 

private Process process; 

private Long id; 

private CommandType[] commandTypeValues = CommandType.values(); 

@Override 
public void prepare() throws Exception { 
} 

public String execute() { 
    return SUCCESS; 
} 

public String createAction() { 
    try { 
     processService.saveAction(process); 
    } catch (Exception e) { 
     return INPUT; 
    } 
    return SUCCESS; 
} 

public String editAction() { 
    return SUCCESS; 
} 

public String insertDefaults() { 
    try { 
     Process ambiLight = defaultingUtil.ambiLightDefault(); 
     processService.saveAction(ambiLight); 
    } catch (Exception e) { 
     return SUCCESS; 
    } 
    return SUCCESS; 
} 

public Process getProcess() { 
    return process; 
} 

public void setProcess(Process process) { 
    this.process = process; 
} 

public CommandType[] getCommandTypeValues() { 
    return commandTypeValues; 
} 

public void setCommandTypeValues(CommandType[] commandTypeValues) { 
    this.commandTypeValues = commandTypeValues; 
} 

public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 
} 
+1

在'struts.xml'中發佈實際映射。 –

+0

你想在列表上迭代還是隻想列表中的第一個元素? –

+0

我有一個主頁,我顯示列表中的所有進程,每個元素都有一個刪除和編輯按鈕,所以這就是爲什麼我需要id的原因 – John

回答

2

你不需要狀態對象,而迭代接入領域。 Struts的把當前列表項的值堆棧的頂部,所以這個就足夠了:

<s:hidden name="process.id" value="%{id}"/> 

或者,也可以在迭代器標籤的變量名:

<s:iterator var="currentProcess" value="processes"> 
    <s:hidden name="process.id" value="%{#currentProcess.id}"/> 
</s:iterator> 

注意,name屬性必須匹配您的ProcessAction中的字段。因此,在name="process.id"的情況下,您需要一個字段process,在Struts插入值之前必須初始化類型Process,否則您將得到NullpointerException。

如果您使用<s:hidden/>,請確保使用<s:submit>標籤,就像您對「ExecuteStartAction」所做的那樣,而不是<button>

如果要使用鏈接,而不是形式的按鈕,使用此:

<s:url var="editUrl" action="EditCommandAction"> 
    <s:param name="id" value="%{#currentProcess.id}" /> 
</s:url> 
<s:a href="%{editUrl}">...</s:a> 

然後,您可以使用CSS樣式,但是你想的鏈接。

但正如亞歷山大M已經說過,不要混合按鈕和鏈接。

+0

感謝Stefan看起來不錯,但是我必須在哪裏初始化這個過程?我以幾種方式嘗試過,但沒有得到它的ID:/ – John

+0

其實我會建議在ProcessAction中使用一個簡單的字段'id'來調用編輯/刪除對話框。只使用字段'process'作爲對話框。分離應該使代碼更清晰,更易於理解,並且不會在'process'中得到不一致的數據。 –

+0

好的......我試着用'',而id值在html頁面中是正確的, 'ProcessAction'中的id'仍然是null :(ProcessAction中的''id'字段與'Process'中的字段相同,並且具有getter和setter – John

相關問題