2013-08-23 76 views
0

我正在開發一個使用struts 2框架的web應用程序,並且我正在面對jsp中選擇標記的問題。 選擇標籤似乎工作正常,但只要按下提交按鈕,我的操作就無法從選擇中獲取數據。 我已經找了關於選擇的問題,但他們都似乎與列表有關。 在我的情況下,列表顯示正常。所以,我很迷茫,我不知道該怎麼做。我的行動無法從struts2選擇標記獲取數據

這是我的jsp代碼和我的動作代碼。當我按提交時,它假設表單將被髮送到我的操作中,並且我將從表單中獲取數據,但是當我打印數據時總是爲空。

JSP代碼:

<s:form action="borrarCita" method="post"> 
    <s:select id="idCita" name="idCita" list="pendings" listKey="idCita" listValue="fecha" label="Elija una cita a anular"></s:select> 
    <s:submit value="Aceptar"/> 
    </s:form> 

動作代碼:

public class CitasAction extends ActionSupport implements SessionAware{ 


private static final long serialVersionUID = 1L; 
private Map session = ActionContext.getContext().getSession(); 

private List pendings= new ArrayList<Cita>(); 
private String idCita; 

private String desplegarCitasPendientes; 
private String pedirCita; 
private String consultarCitas; 
private String citaAnulada; 

public String execute(){ 

    return SUCCESS; 

} 

public String pedirCita(){ 
    setCitaAnulada(""); 
    setDesplegarCitasPendientes(""); 
    setConsultarCitas(""); 
    DbService db = (DbService)session.get("db"); 

     Paciente paciente = (Paciente)session.get("Paciente"); 
     List listaMedicos = db.getListaMedicos(); 
     session.remove("listaCitas"); 
     session.put("listaMedicos", listaMedicos); 
     setPedirCita("ok"); 
     return SUCCESS; 


} 


public String desplegarCitasPendientes(){ 
    setCitaAnulada(""); 
    setPedirCita(""); 
    setConsultarCitas(""); 
    Paciente pac = (Paciente)session.get("user"); 
    Iterator<Cita> nombreIterator = pac.getCitas().iterator(); 
    while(nombreIterator.hasNext()){ 
     Cita primera = nombreIterator.next(); 
     if(primera.getStatus().equals("Pending")){ 
      getPendings().add(primera); 
     } 


    } 

    setDesplegarCitasPendientes("ok"); 
    return SUCCESS; 
} 


public String borrarCita(){ 
setConsultarCitas(""); 
setPedirCita(""); 
setDesplegarCitasPendientes(""); 
System.out.println(getIdCita()); 
System.out.println(ActionContext.getContext().getParameters().toString()); 
Paciente pac = (Paciente)session.get("user"); 
/* 
Iterator<Cita> iterator = pac.getCitas().iterator(); 
while(iterator.hasNext()){ 
    Cita primera = iterator.next(); 
    if(primera.getFecha().equals(getFecha())){ 
     iterator.remove(); 
     break; 
    } 

} 


pac.setCitas(getPendings()); 

pac.getCitas().remove(getCitaSeleccionada()); 
session.put("user", pac); 
DbService db = (DbService)session.get("db"); 
db.uploadPaciente(pac);*/ 
setCitaAnulada("ok"); 
return SUCCESS; 


} 

public String consultarCitas(){ 

    setPedirCita(""); 
    setDesplegarCitasPendientes(""); 
    setCitaAnulada(""); 

    setConsultarCitas("ok"); 
    return SUCCESS; 

} 

public Map getSession() { 
    return session; 
} 

public void setSession(Map session) { 
    this.session = session; 
} 

public List getPendings() { 
    return pendings; 
} 

public void setPendings(List pendings) { 
    this.pendings = pendings; 
} 

public static long getSerialversionuid() { 
    return serialVersionUID; 
} 

public String getDesplegarCitasPendientes() { 
    return desplegarCitasPendientes; 
} 

public void setDesplegarCitasPendientes(String desplegarCitasPendientes) { 
    this.desplegarCitasPendientes = desplegarCitasPendientes; 
} 

public String getPedirCita() { 
    return pedirCita; 
} 

public void setPedirCita(String pedirCita) { 
    this.pedirCita = pedirCita; 
} 

public String getConsultarCitas() { 
    return consultarCitas; 
} 

public void setConsultarCitas(String consultarCitas) { 
    this.consultarCitas = consultarCitas; 
} 

public String getCitaAnulada() { 
    return citaAnulada; 
} 

public void setCitaAnulada(String citaAnulada) { 
    this.citaAnulada = citaAnulada; 
} 

public String getIdCita() { 
    return idCita; 
} 

public void setIdCita(String idCita) { 
    this.idCita = idCita; 
} 




} 

所以,總結起來,我有一個JSP選擇標籤和當按下提交,動作沒有按」從選擇中獲取任何數據。

我希望有人能幫助我,因爲這讓我發瘋。 如果您需要更多信息,請告訴我,我會盡快將其發佈。

在此先感謝。

編輯:

以下是Cita.class代碼的一部分。它還有每個屬性的setter和getters。

public class Cita implements Serializable{ 

@Id @GeneratedValue 
@Column(name="CITA_ID") 
private int idCita; 
@Column(name="FECHA") 
@Temporal(TemporalType.DATE) 
private Date fecha; 
@Column(name="HORA") 
@Temporal(TemporalType.TIME) 
private Date hora; 
@Column(name="ESTADO") 
private String status; 
@Column(name="ESPECIALIDAD") 
private String especialidad; 
@ManyToOne 
@JoinColumn(name="MEDICO_ID") 
private Medico medico; 
@ManyToOne 
@JoinColumn(name="PACIENTE_ID") 
private Paciente paciente; 

這裏是struts.xml中:

 <interceptors> 
     <interceptor name="logger" class="interceptor.LoginInterceptor"/> 
      <interceptor-stack name="myStack"> 
      <interceptor-ref name="logger"/> 
      </interceptor-stack> 
    </interceptors> 
     <action name="desplegarCitasPendientes" class="action.CitasAction"  method="desplegarCitasPendientes"> 
     <interceptor-ref name="myStack"/> 
     <result name="success">/citas.jsp</result> 
     <result name="login" type="redirect">/index.jsp</result> 
     <result name="input">/index.jsp</result> 
    </action> 

    <action name="borrarCita" class="action.CitasAction" method="borrarCita"> 
     <interceptor-ref name="myStack"/> 
     <result name="success">/citas.jsp</result> 
     <result name="login" type="redirect">/index.jsp</result> 
     <result name="input">/index.jsp</result> 
    </action> 

@Jeroen,很抱歉的代碼龐大的牆。這是我在這裏的第一篇文章。

@Roman,我希望這有助於你幫我:-)

感謝您的答覆傢伙。

編輯2:

這裏是我的LoginInterceptor:

public class LoginInterceptor extends AbstractInterceptor { 
/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

@Override 
public String intercept(final ActionInvocation invocation) throws Exception { 

    Map<String, Object> session = invocation.getInvocationContext().getSession();   

    // sb: if the user is already signed-in, then let the request through. 
    if (session.get("user") != null) { 
     return invocation.invoke(); 
    }else{ 
     System.out.println("redirect"); 
     return "login"; 
    } 
} 
} 

如果您需要別的東西,讓我知道:-)

+0

請發佈一個簡短的代碼示例,演示問題而不是巨大的文本牆。 –

+0

發佈'struts.xml'和'Cita'類。 –

+0

@ user2712493你有其他的數據元素在jsp .. ?? – Dileep

回答

0

看起來像一個攔截器的問題。

什麼是myStack

這是我在我的項目中使用(與登錄攔截器)的樣本堆棧

<package name="test" extends="struts-default"> 
<interceptors> 
      <interceptor name="nlogin" class="interceptors.LoginInterceptor"/> 
      <interceptor-stack name="loginStack"> 
       <interceptor-ref name="nlogin"/> 
       <interceptor-ref name="defaultStack"/> 
      </interceptor-stack> 
     </interceptors> 
     <default-interceptor-ref name="loginStack"/> 

     <action name="test-list" class="actions.InboxAction"> 
      <result>/pages/inbox/list.jsp</result> 
     </action> 
</package> 

loginStack被用作defaultStack在包中的所有行動,因爲<default-interceptor-ref name="loginStack"/>

+0

嗨,這最後的回覆很有用。 myStack是我的攔截器堆棧的名稱。如果你在動作中提供了一個,我認爲沒有必要聲明一個。也許我錯了? 但是,是的,它似乎是一個攔截器問題,因爲我試圖刪除該動作中的攔截器,並且我的操作能夠從jsp獲取數據。 因此,我不知道是否必須在攔截器中做一些特殊的事情才能使數據到達行動。 有什麼想法? 非常感謝你們! – jose87es

+0

你爲什麼不考慮把你的myStack代碼放在這裏,或者只是比較你的myStack和上面的loginStack,來檢查攔截器序列 –

0

好的傢伙,它似乎我解決了它。由於編碼_idiot的答案,我能夠弄清楚什麼是錯的。在我自己的堆棧中缺乏defaultStack似乎是個問題。我只是添加了defaultStack,現在看起來工作正常。 因此,非常感謝大家,並特別感謝coding_idiot。代碼最終看起來像:

<interceptors> 
     <interceptor name="logger" class="interceptor.LoginInterceptor"/> 
     <interceptor-stack name="myStack"> 
      <interceptor-ref name="logger"/> 
      <interceptor-ref name="defaultStack"/> 
     </interceptor-stack> 
</interceptors>