2012-10-31 43 views
1

我在Struts 2 Action中得到了一個post參數有點問題。Struts 2從Action A發佈參數到Action B

我的第一個動作加載列表:

package de.nordakademie.hausarbeit.action; 

import java.util.List; 

import com.opensymphony.xwork2.Action; 

import de.nordakademie.hausarbeit.model.Pruefungsfach; 
import de.nordakademie.hausarbeit.service.PruefungsfaecherService; 

public class IndexAction implements Action { 
    private PruefungsfaecherService pruefungsfaecherService; 
    private List<Pruefungsfach> pruefungsfaecher; 

    public String execute() throws Exception { 
     pruefungsfaecher = pruefungsfaecherService.listPruefungen(); 
     return SUCCESS; 
    } 

    public List<Pruefungsfach> getPruefungsfaecher() { 
     return pruefungsfaecher; 
    } 

    public void setPruefungsfaecherService(PruefungsfaecherService pruefungsfaecherService) { 
     this.pruefungsfaecherService = pruefungsfaecherService; 
    } 

} 
<%@ page contentType="text/html; charset=UTF-8"%> 
<%@ taglib prefix="s" uri="/struts-tags"%> 

<%-- Niels Maseberg --%> 

<h2>Übersicht Prüfungsfächer</h2> 
<s:form> 
    <table cellpadding="0"> 
     <caption>Liste aller Prüfungsfächer inklusive Studienrichtung und Jahrgang</caption> 
     <thead> 
      <tr> 
       <th>&nbsp;</th> 
       <th>Studienrichtung</th> 
       <th>Titel</th> 
       <th>Jahrgang</th> 
       <th>Beschreibung</th> 
      </tr> 
     </thead> 
     <tbody> 
      <s:iterator value="pruefungsfaecher" status="rowstatus"> 
       <s:if test="#rowstatus.odd == true"> 
        <tr class="odd"> 
       </s:if> 
       <s:else> 
        <tr class="even"> 
       </s:else> 
        <td class="cell_radio"><s:radio name="selectedPruefungsfachId" list="#{id:''}" theme="simple"/></td> 
        <td><s:property value="manipel.getPk().getStudienrichtung()"/></td> 
        <td><s:property value="titel"/></td> 
        <td><s:property value="manipel.getPk().getJahrgang()"/></td> 
        <td><s:property value="beschreibung"/></td> 
       </tr> 
      </s:iterator> 
     </tbody> 
    </table> 
    <div class="buttons"> 
     <div class="button"> 
      <s:submit value="Prüfungen anzeigen" action="pruefungslist" /> 
     </div> 
     <div class="clear"></div> 
    </div> 
</s:form> 

我的第二個動作得到selectedPruefungsfachId並加載Pruefungsfach,這樣我可以在第二個JSP把隱藏的價值:

package de.nordakademie.hausarbeit.action; 

import java.util.List; 

import org.apache.log4j.Logger; 

import com.opensymphony.xwork2.Action; 

import de.nordakademie.hausarbeit.model.Pruefung; 
import de.nordakademie.hausarbeit.model.Pruefungsfach; 
import de.nordakademie.hausarbeit.service.PruefungenService; 
import de.nordakademie.hausarbeit.service.PruefungsfaecherService; 

public class PruefungslistAction implements Action { 
    private PruefungenService pruefungenService; 
    private PruefungsfaecherService pruefungsfaecherService; 

    private Long selectedPruefungsfachId; 
    private List<Pruefung> pruefungen; 
    private Pruefungsfach pruefungsfach; 
    private static final Logger logger = Logger.getLogger(PruefungslistAction.class); 

    public String execute() throws Exception { 
     if(logger.isDebugEnabled()){ 
      logger.debug("Pruefungsfach mit der ID '" + selectedPruefungsfachId + "' wurde gewählt"); 
     } 

     pruefungen = pruefungenService.listPruefungen(selectedPruefungsfachId); 

     pruefungsfach = pruefungsfaecherService.getPruefungsfach(selectedPruefungsfachId); 
     if(logger.isDebugEnabled()){ 
      logger.debug("Pruefungsfach mit der ID '" + pruefungsfach.getId() + "' wurde geladen"); 
     } 

     return SUCCESS; 
    } 

    public Long getSelectedPruefungsfachId() { 
     return selectedPruefungsfachId; 
    } 

    public void setSelectedPruefungsfachId(Long selectedPruefungsfachId) { 
     this.selectedPruefungsfachId = selectedPruefungsfachId; 
    } 

    public List<Pruefung> getPruefungen() { 
     return pruefungen; 
    } 

    public void setPruefungenService(PruefungenService pruefungenService) { 
     this.pruefungenService = pruefungenService; 
    } 

    public void setPruefungsfaecherService(
      PruefungsfaecherService pruefungsfaecherService) { 
     this.pruefungsfaecherService = pruefungsfaecherService; 
    } 

    public Pruefungsfach getPruefungsfach() { 
     return pruefungsfach; 
    } 

} 
<%@ page contentType="text/html; charset=UTF-8"%> 
<%@ taglib prefix="s" uri="/struts-tags"%> 

<h2>Übersicht Prüfungen aus Prüfungsfach "<s:property value="pruefungsfach.getTitel()" />"</h2> 
<s:form> 
    <div class="buttons"> 
     <div class="button"> 
      <!-- 
      <s:url id="createPruefungUrl" action="createPruefung"> 
       <s:param name="selectedPruefungsfachId"><s:property value="pruefungsfach.getId()" /></s:param> 
      </s:url> 
      <a href="${createPruefungUrl}"><s:text name="btnCreatePruefung" /></a> 
      <s:url id="pruefungenHistorieActionUrl" action="pruefungenHistorie"> 
       <s:param name="selectedPruefungsfachId"><s:property value="pruefungsfach.getId()" /></s:param> 
      </s:url> 
      <a href="${pruefungenHistorieActionUrl}"><s:text name="btnPruefungenHistorie" /></a> 
      --> 

      <s:hidden name="selectedPruefungsfachId" value="%{pruefungsfach.id}" /> 
      <s:submit key="btnCreatePruefung" action="createPruefung" /> 
      <s:submit key="btnPruefungenHistorie" action="pruefungenHistorie" /> 
     </div> 
     <div class="clear"></div> 
    </div> 
    <table cellpadding="0"> 
     <caption>Liste aller Prüfungen im Prüfungsfach "<s:property value="pruefungsfach.getTitel()" />"</caption> 
     <thead> 
      <tr> 
       <th>&nbsp;</th> 
       <th>Datum</th> 
       <th>Dozent</th> 
      </tr> 
     </thead> 
     <tbody> 
      <s:iterator value="pruefungen" status="rowstatus"> 
       <s:if test="#rowstatus.odd == true"> 
        <tr class="odd"> 
       </s:if> 
       <s:else> 
        <tr class="even"> 
       </s:else> 
        <td class="cell_radio"><s:radio name="selectedPruefungId" list="#{id:''}" theme="simple"/></td> 
        <td><s:property value="datum"/></td> 
        <td><s:property value="dozent.getPerson().getVorname()"/> <s:property value="dozent.getPerson().getName()"/></td> 
       </tr> 
      </s:iterator> 
     </tbody> 
    </table> 

</s:form> 

當我現在點擊提交行動=「pruefungenHistorie」行動PruefungenHistorieAction是cal率領但我不獲取參數「selectedPruefungsfachId」

package de.nordakademie.hausarbeit.action; 

import java.util.List; 

import org.apache.log4j.Logger; 

import com.opensymphony.xwork2.ActionSupport; 

import de.nordakademie.hausarbeit.model.Pruefungsfach; 
import de.nordakademie.hausarbeit.service.PruefungsfaecherService; 
import de.nordakademie.hausarbeit.service.StudentService; 

public class PruefungenHistorieAction extends ActionSupport { 
    private static final long serialVersionUID = 1L; 
    private StudentService studentService; 
    private PruefungsfaecherService pruefungsfaecherService; 
    private List<Integer> matrikelnummern; 
    private Long selectedPruefungsfachId; 
    private Integer selectedMatrikelnummer; 
    private static final Logger logger = Logger.getLogger(PruefungenHistorieAction.class); 

    public String execute() throws Exception { 
     // Load MatrikelnummerList 
     _loadMatrikelnummerList(); 
     return SUCCESS; 
    } 

    /** 
    * showDetail Most useless comment in the world; why bother? 
    */ 
    public String showDetail() { 
     return SUCCESS; 
    } 

    public void validate() { 
     super.validate(); 

     _loadMatrikelnummerList(); 

     if (getSelectedMatrikelnummer().equals("none")) { 
      addFieldError("selectedMatrikelnummer", getText("error.no.matrikelnummer.selected")); 
     } 
    } 

    private void _loadMatrikelnummerList() { 
     if(logger.isDebugEnabled()){ 
      logger.debug("PruefungenHistorieAction: Pruefungsfach mit der ID '" + selectedPruefungsfachId + "' wird geladen"); 
     } 

     Pruefungsfach pruefungsfach = pruefungsfaecherService.getPruefungsfach(selectedPruefungsfachId);   
     matrikelnummern = studentService.getMatrikelnummerListByManipel(pruefungsfach.getManipel()); 
    } 

    public void setStudentService(StudentService studentService) { 
     this.studentService = studentService; 
    } 

    public Long getSelectedPruefungsfachId() { 
     return selectedPruefungsfachId; 
    } 

    public void setSelectedPruefungsfachId(Long selectedPruefungsfachId) { 
     this.selectedPruefungsfachId = selectedPruefungsfachId; 
    } 

    public List<Integer> getMatrikelnummern() { 
     return matrikelnummern; 
    } 

    public Integer getSelectedMatrikelnummer() { 
     return selectedMatrikelnummer; 
    } 

    public void setSelectedMatrikelnummer(Integer selectedMatrikelnummer) { 
     this.selectedMatrikelnummer = selectedMatrikelnummer; 
    } 
} 

屬性selectedPruefungsfachId爲空,我不明白爲什麼,因爲在行動「PruefungslistAction」我得到的參數,並在接下來的動作我不噸得到的參數...

下面是struts.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- AUTHOR: Niels Maseberg --> 

<!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.enable.DynamicMethodInvocation" value="false" /> 
    <constant name="struts.devMode" value="false" /> 
    <constant name="struts.custom.i18n.resources" value="ApplicationResources" /> 

    <!-- Custom Theme for Struts (Author: Niels Maseberg; Base of Theme xhtml) --> 
    <constant name="struts.ui.theme" value="notendatenbank" /> 
    <constant name="struts.ui.templateDir" value="template" /> 

    <!-- Struts Package --> 
    <package name="default" extends="tiles-default" namespace="/"> 
     <result-types> 
      <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" default="true" /> 
     </result-types> 

     <default-action-ref name="index" /> 

     <action name="index" class="de.nordakademie.hausarbeit.action.IndexAction"> 
      <result type="tiles">index</result> 
     </action> 

     <action name="notenuebersicht" class="de.nordakademie.hausarbeit.action.NotenuebersichtAction"> 
      <result type="tiles">notenuebersicht</result> 
      <interceptor-ref name="validation"> 
       <param name="validateAnnotatedMethodOnly">true</param>     
       <param name="excludeMethods">execute</param> 
      </interceptor-ref> 
     </action> 

     <action name="notenuebersichtDetail" class="de.nordakademie.hausarbeit.action.NotenuebersichtAction" method="showDetail"> 
      <result name="input">notenuebersicht</result> 
      <result name="success">notenuebersichtDetail</result> 
     </action> 

     <action name="pruefungslist" class="de.nordakademie.hausarbeit.action.PruefungslistAction"> 
      <result type="tiles">pruefungslist</result> 
     </action> 

     <action name="createPruefung" class="de.nordakademie.hausarbeit.action.CreatePruefungAction"> 
      <result name="input">createPruefung</result> 
      <result name="success">pruefungslist</result> 
      <result type="tiles">createPruefung</result> 
     </action> 

     <action name="pruefungenHistorie" class="de.nordakademie.hausarbeit.action.PruefungenHistorieAction"> 
      <result type="tiles">pruefungenHistorie</result> 
      <interceptor-ref name="validation"> 
       <param name="validateAnnotatedMethodOnly">true</param>     
       <param name="excludeMethods">execute</param> 
      </interceptor-ref> 
     </action> 

     <action name="pruefungenHistorieDetail" class="de.nordakademie.hausarbeit.action.PruefungenHistorieAction" method="showDetail"> 
      <result name="input">pruefungenHistorie</result> 
      <result name="success">pruefungenHistorieDetail</result> 
     </action> 

    </package> 

</struts> 
+1

而當你檢查頁面[例如使用螢火蟲]「ÜbersichtPrüfungenausPrüfungsfach...」,並尋找名爲'selectedPruefungsfachId'的隱藏字段,它是否具有預期的id值? – Alban

+0

還要檢查所有對象的getters/setters。 –

+0

是隱藏的字段有預期的價值,如果我通過螢火蟲檢查發佈請求還有selectedPruefungsfachId設置....吸取器和安裝程序是你可以在上面看到的動作 –

回答

1

您可以通過配置你的行動像

<action name="pruefungenHistorie" class="de.nordakademie.hausarbeit.action.PruefungenHistorieAction"> 
    <result type="tiles">pruefungenHistorie</result> 
    <interceptor-ref name="validation"> 
     <param name="validateAnnotatedMethodOnly">true</param>     
     <param name="excludeMethods">execute</param> 
    </interceptor-ref> 
</action> 

只使用validation攔截它看到的。

更改這

<action name="pruefungenHistorie" class="de.nordakademie.hausarbeit.action.PruefungenHistorieAction"> 
    <result type="tiles">pruefungenHistorie</result> 
    <interceptor-ref name="defaultStack"> 
     <param name="validation.validateAnnotatedMethodOnly">true</param>     
     <param name="validation.excludeMethods">execute</param> 
    </interceptor-ref> 
</action> 

爲了使用與被配置validation攔截器攔截defaultStack

+0

嘿謝謝。這工作! –

+0

所以,接受這個答案,如果它幫助你。 –

0

替代

<s:radio name="selectedPruefungsfachId" list="#{id:''}" theme="simple"/> 

<s:radio name="selectedPruefungsfachId" list="{id}" theme="simple"/> 

第一JSP。

(根據http://struts.apache.org/2.x/docs/how-do-i-render-a-single-radio-button.html

+0

嗨,謝謝你的回答,但我沒有電臺的問題......這是submitButton鍵=「btnPruefungenHistorie」的問題。當我點擊這個提交按鈕時,這個動作沒有得到selectedPruefungsfachId –

+0

當然,並且無法通過Action獲得的「selectedPruefungsfachId」在收音機中定義;)然後發佈生成的收音機的html,讓我們看看你的id參數被渲染... –

+0

selectedPruefungsfachId不在收音機中。它在隱藏領域。如果我用螢火蟲檢查隱藏的領域,它的價值就是身份證....所以這個工作得很好;-) –