2010-03-07 12 views
8

Qui sto affrontando un sacco di problemi nella mia pagina jsp. Quale tag dovrei usare per ottenere una data (aaaa-MM-gg) da parte dell'utente e memorizzarla in una proprietà Date di un'azione Struts2?Come inserire Date in un'azione Struts2 da un jsp?

La proprietà nella mia azione è dichiarata di java.util.Date. Voglio l'input dalla pagina jsp per atterrare in questa proprietà.

per favore aiuto.

Viene visualizzato Errore di campo non valido (in JSP) se si utilizza un tag s: textfield per immettere una data in molti nel formato corretto.

+0

Non faccio Struts, quindi non posso dare una risposta diretta, ma qualsiasi framework MVC decente dovrebbe offrire la conversione del tipo per qualsiasi valore non String. Controlla questo link per alcuni suggerimenti: http://google.com/search?q=struts2+date+converter – BalusC

+0

sembra esserci un problema con i tipi di data di gestione struts2 bene. Quindi c'è un altro modo in cui posso ottenere la data in un formato corretto e memorizzarlo in oggetto data in Java – Anand

risposta

1

Quindi forse non capisco la domanda. Ma spero che questo esempio aiuti (ma questo codice non funzionerà proprio per aiutarti a darti un'idea di come stude2 fa la sua magia); Quindi, per l'ingresso modulo è necessario avere una classe di supporto in Java, quindi è possibile chiamare la data dalla classe azione come ad esempio Holder.java:

public class Holder{ 
    pirvate Date date; 
    public getDate(){ 
    return date; 
    } 
    public setDate(Date date){ 
    this.date = date; 
    } 
} 

tuo convalida Holder.java in modo da poter assicurarsi che il suo una data Holder-validation.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 
1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> 
<validators> 
    <field name="date"> 
    <field-validator type="date"> 
       <message><![CDATA[ Must be a date ]]></message> 
    </field-validator> 
    </field> 
</validators> 

la classe azione in cui si chiama il vostro make sicuri holder.getdate per ottenere la data di getDateAction.java:

private Holder holder; 
    public class getDateAction{ 
    public String execute(){ 
    //get your date 
     Date date = holder.getDate(); 

     return SUCCESS; 
    } 
    } 

il modulo jsp in cui si dà il cli è possibile inserire la data. Assicurati di inserire il nome = "holder.date". Ecco site.jsp:

<s:form id="Form" name="MyForm" action="getDateAction" method="post" class="form"> 
<input type="text" name="holder.date" id="date" size="25" value="" class="required text"> 
</s:form> 

e, ultimo ma non meno importante il vostro struts.xml:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 

<struts> 
<package name="example" extends="struts-default"> 
<action name="getdate" class="com.location.action.getDateAction"> 
     <result>example.jsp</result> 
</action> 
</package> 
</struts> 

C'è una spiegazione di Struts2 Data Format qui a: Struts 2 Date Format Examples

Ma Credo che il tag che stai cercando in jsp sia

<s:date name="Date_Name" format="yyyy-MM-dd" /> 

Dove Date_Name è l'oggetto Date in Java.

+0

Non ha funzionato. Ho provato questo – Anand

+0

Il tag s: date è per l'output dei valori java.lang.Date in vari formati, non per l'input del modulo. –

0

il tag <s:date /> visualizza solo le date, non fornisce input.

Non credo che Struts fornisca l'input della data di inserimento, a meno che non si utilizzi il selettore di data e ora, che è un tag dojo/javascript. Maggiori informazioni al riguardo: http://struts.apache.org/2.0.14/docs/datetimepicker.html

Se non si segue questa rotta, è molto probabile che si debba mappare la data sul JSP a una stringa, quindi formattarla nella classe di azione. Puoi renderlo più semplice facendo in modo che Struts convalidi prima il valore.

4

Ecco come ho risolto questo.

<s:date name="nameOfInputVal" var="formattedVal"/> 
    <s:textfield name="nameOfInputVal" value="%{#formattedVal}" key="labelkey" /> 

e nella vostra proprietà del messaggio di una chiave/valore:

struts.date.format=dd/MM/yyyy 

che indica il formato predefinito e non si sono a scrivere in ogni tag data.

Spero che questo aiuti

+2

o più semplice: . Ma questo non risolve il problema di analizzare la data in un Date date nella tua azione! –

+0

o un parametro 'format' può essere aggiunto al tag' s: date' – draw

+0

Sono d'accordo con Pierre, quando si invia il modulo, l'input è String e quindi Struts 2 converte la stringa in data, ma la domanda è: dove si trova Struts 2 configura il formato predefinito per questa conversione? –

8

So che questo post è un po 'vecchio, ma una soluzione può essere utile per gli altri.

Il convertitore predefinito di Struts non sembra funzionare correttamente. L'errore di campo si verifica anche con i campi readonly popolati dall'azione.

ho risolto che definendo il mio convertitore:

  1. creare la classe convertitore (utilizzando il formato della data è necessario):

    public class StringToDateTimeConverter extends StrutsTypeConverter { 
        // WARNING not safe in multi-threaded environments 
        private static final DateFormat DATETIME_FORMAT = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss"); 
    
        public Object convertFromString(Map context, String[] strings, Class toClass) {  
         if (strings == null || strings.length == 0 || strings[0].trim().length() == 0) { 
          return null; 
         } 
    
         try { 
          return DATETIME_FORMAT.parse(strings[0]); 
         } catch (ParseException e) { 
          throw new TypeConversionException("Unable to convert given object to date: " + strings[0]); 
         } 
        } 
    
        public String convertToString(Map context, Object date) { 
         if (date != null && date instanceof Date) {   
          return DATETIME_FORMAT.format(date); 
         } else { 
          return null; 
         } 
        } 
    } 
    
  2. Mettere l'annotazione di conversione sul setter di proprietà (o utilizzare un file conversion.properties)

    @Conversion() 
    public class MyEditAction { 
        // ... 
    
        @TypeConversion(converter="my.app.common.converter.StringToDateTimeConverter") 
        public void setUploadedDate(Date uploadedDate) { 
         this.uploadedDate = uploadedDate; 
        } 
    

Nel mio caso non avevo bisogno di modificarlo ma volevo specificare il formato nel jsp. Ho usato un campo nascosto aggiuntivo per mantenere il valore originale (un'altra alternativa sarebbe stata l'uso di interfaccia di essere preparati):

<s:textfield name="uploadedDateDisplay" value="%{getText('format.datetimesecond',{uploadedDate})}" size="70" disabled="true"/> 
<s:hidden name="uploadedDate" /> 
+0

Per la prima volta mi sento in dovere di aggiungere questo commento: Non utilizzare SimpleDateFormat in questo modo. Produrrà spazzatura quando due thread lo usano contemporaneamente. – Bloodboiler

+0

La "statica" è la colpa qui? Sentiti libero di modificare la mia risposta – Samuel

+0

@ Samuel Sì. La soluzione più rapida è metterla in un ThreadLocal. La soluzione migliore è utilizzare un altro framework data/ora. –

0

jsp:?

<s:textfield name="date" id="date" key="invitation.date" required="true" value="%{getText('format.date',{date})}" size="8"/> 

.Properties

format.date={0,date,dd/MM/yyyy} 

Action.java

import java.util.Date; 
private Date date; 
public void setDate(Date date) { 
    this.date = date; 
} 

script: È possibile aggiungere jquery.datepicker (Non consiglio puntoni datepicker): http://jqueryui.com/datepicker/

$("#date").datepicker({dateFormat: dateFormat}); 
0
private Date date; 

public void setDate(String date) { 
//setter method param type is String 
    try { 
     this.date=new SimpleDateFormat("yyyy-MM-dd").parse(date); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
} 


<form action="target.do"> 
    <input name="date" value="2015-5-28"> 
    <button type="submit">submit</button> 
</form> 
+2

La creazione di 'SimpleDateFormat' ogni volta che si accede a getter è inefficiente. –

0

C'è una soluzione che ho provato ed è lavorato :)
1) Conservare la colonna in cui si desidera memorizzare la data nella tabella del database solo nel tipo di dati "DATA". 2) Utilizzare solo tag Textfield nella pagina JSP. Non utilizzare il tag Date.
Nota: assicurarsi di inserire la data di immissione dell'utente nel formato AAAA-MM-GG posizionando un segnaposto nel tag del campo di testo!
3) Mantenere la variabile per accedere solo a quel campo di tipo stringa. Non utilizzare il tipo di dati DATE.
4) Ora eseguire Query: Selezionare DATE_FORMAT (datecolumnname, '% d /% m%/Y') come date_two da tablename; e si otterrà la data da quella colonna in formato gg/mm/aaaa anche se è memorizzata in formato AAAA-MM-GG in tabella.
5) E puoi anche confrontare i dati della tua datacolonna con cagliata() e funzioni correlate e funziona :).
6) Come ho usato la query: Selezionare id, name, DATE_FORMAT (datecolumnname, '% d /% m /% Y') come datecolumn2 da tablename where datecolumnname> = curdate();

Problemi correlati