At line 12 changed 1 line. |
* __<span style="color: green">Spring:</span>__ [Creating Spring Controllers and JSPs|SpringControllers] |
* __<span style="color: green">Spring:</span>__ [Creazione Controller Spring e JSP|SpringControllers_it] |
At line 84 changed 1 line. |
* Aggiungi le chiavi ApplicationResources.properties relative a titoli ed intestazioni nelle JSPs |
* Aggiungi le chiavi ApplicationResources.properties relative a titoli ed intestazioni nelle JSP |
At line 289 changed 2 lines. |
You'll notice in the code above that there are many calls to to ''convert'' a PersonForm or a Person object. The ''convert'' method is in BaseAction.java (which calls ConvertUtil.convert()) and |
uses |
Noterai che nel codice sopra ci sono molte chiamate per ''convertire'' un oggetto PersonForm o Person. Il metodo ''convert'' è BaseAction.java (la quale richiama ConvertUtil.convert()) ed |
usa |
At line 292 changed 1 line. |
to convert POJOs → ActionForms and ActionForms → POJOs. |
per convertire i POJO → ActionForm ed ActionForm → POJO. |
At line 294 changed 1 line. |
;:''If you are running Eclipse, you might have to "refresh" the project in order to see PersonForm. It lives in build/web/gen, which should be one of your project's source folders. This is the only way for Eclipse to see and import PersonForm, since it is generated by XDoclet and does not live in your regular source tree. You can find it at build/web/gen/org/appfuse/webapp/form/PersonForm.java.'' |
;:''Se stai eseguendo dentro Eclipse, potresti aver bisogno di fare un "refresh" sul progetto in modo da vedere PersonForm. Si trova in build/web/gen, che dovrebbe essere una delle cartelle sorgenti del tuo progetto. Questo è l'unico modo per Eclipse do vedere ed importare PersonForm, in quanto viene generato da XDoclet e non fa parte del tuo albero sorgenti regolare. Puoi trovarlo in build/web/gen/org/appfuse/webapp/form/PersonForm.java.'' |
At line 296 changed 1 line. |
;:''In [BaseAction|http://raibledesigns.com/downloads/apptracker/api/org/appfuse/webapp/action/BaseAction.java.html] you can register additional Converters (i.e. [DateConverter|http://raibledesigns.com/downloads/apptracker/api/org/apptracker/util/DateConverter.java.html]) so that BeanUtils.copyProperties knows how to convert Strings → Objects. If you have Lists on your POJOs (i.e. for parent-child relationships), you will need to manually convert those using the {{convertLists(java.lang.Object)}} method.'' |
;:''In [BaseAction|http://raibledesigns.com/downloads/apptracker/api/org/appfuse/webapp/action/BaseAction.java.html] puoi registrare ulteriori Converter (i.e. [DateConverter|http://raibledesigns.com/downloads/apptracker/api/org/apptracker/util/DateConverter.java.html]) in modo che BeanUtils.copyProperties sappia come convertire String → Object. Se hai delle List nei tuoi POJO (i.e. per relazioni genitore-figlio), dovrai convertirle manualmente usando il metodo {{convertLists(java.lang.Object)}} .'' |
At line 298 changed 1 line. |
Now you need to add the ''edit'' forward and the ''savePerson'' action-mapping, both which are specified in in the PersonActionTest. To do this, add a couple more XDoclet tags to the top of the PersonAction.java file. Do this right above the class declaration. You should already have the XDoclet tag for the ''editPerson'' action-mapping, but I'm showing it here so you can see all the XDoclet tags at the top of this class. |
Ora devi aggiungere il forward ''edit'' e l'action-mapping ''savePerson'', entrambi specificati in PersonActionTest. Per farlo, aggiungi un altro paio di tag XDoclet in cima al file PersonAction.java. Fai questo subito sotto la dichiarazione della classe. Dovresti avere di già il tag XDoclet per l'action-mapping ''editPerson'', ma te lo mostro qui in modo che tu possa vedere tutti i tag XDoclet in cima a questa classe. |
At line 314 changed 1 line. |
The main difference between the ''editPerson'' and ''savePerson'' action-mappings is that ''savePerson'' has validation turned on (see validation="true") in the XDoclet tag above. Note that the "input" attribute must refer to a forward, and cannot be a path (i.e. /editPerson.html). If you'd prefer to use the save path for both edit and save, that's possible too. Just make sure validate="false", and then in your "save" method - you'll need to call form.validate() and handle errors appropriately. |
La differenza principale fra gli action-mapping ''editPerson'' e ''savePerson'' è che ''savePerson'' ha la validazion attiva (vedi validation="true") nel tag XDoclet sopra. Nota che l'attributo "input" deve riferirsi ad un forward, e non può essre un path (i.e. /editPerson.html). Se preferisci usare il path di save sia per edit che per save, è possibile anche quello. Controlloa solo che sia impostato validate="false", poi nel tuo metodo "save" - dovrai richiamare form.validate() e gestire gli errori in modo appropriato. |
At line 316 changed 1 line. |
You might notice that the code you're using to call the PersonManager is the same as the code used in the PersonManagerTest. Both PersonAction and PersonManagerTest are ''clients'' of PersonManagerImpl, so this makes perfect sense. |
Potresti notare che il codice che stai usando per richiamare il PersonManager è lo stesso codice usato nel test PersonManagerTest. Sia PersonAction che PersonManagerTest sono ''client'' di PersonManagerImpl, pertanto ciò ha perfettamente senso. |
At line 318 changed 1 line. |
Everything is almost done for this tutorial, let's get to running the tests! |
É quasi tutto fatto per questo tutorial, andiamo ad eseguire i test! |
At line 323 changed 1 line. |
If you look at our PersonActionTest, all the tests depend on having a record with id=1 in the database (and testRemove depends on id=2), so add that to our sample data file (metadata/sql/sample-data.xml). I'd add it at the bottom - order is not important since it (currently) does not relate to any other tables. |
Se guardi il nostro PersonActionTest, tutti i test dipendono dall'avere un record con id=1 nel database (e testRemove dipende da id=2), pertanto aggiungilo al nostro file dati di esempio (metadata/sql/sample-data.xml). Lo aggiungerei in coda - l'ordine non è importante poiché (attualmente) non ha relazioni con altre tabelle. |
At line 343 changed 1 line. |
DBUnit loads this file before we run any of our tests, so this record will be available to the PersonActionTest. |
DBUnit carica questo file prima dell'esecuzione di uno qualsiasi dei nostri test, pertanto questo record sarà disponibile al PersonActionTest. |
At line 345 changed 1 line. |
Now if you run __ant test-web -Dtestcase=PersonAction__ - everything should work as planned. Make sure Tomcat isn't running before you try this. |
Ora se esegui __ant test-web -Dtestcase=PersonAction__ - tutto dovrebbe funzionare come previsto. Controlla che Tomcat non sia in esecuzione prima di provare questo. |
At line 352 changed 1 line. |
Now let's clean up the generated personForm.jsp. Change the ''action'' of the <html:form> to be "savePerson" so validation will be turned on when saving. Also, change the ''focus'' attribute from focus="" to focus="firstName" so the cursor will be in the firstName field when the page loads (this is done with JavaScript). |
Ora ripuliamo la pagina personForm.jsp generata. Modifica la ''action'' di <html:form> in "savePerson" in modo che la validazione sia attiva quando si registra. Modifica anche l'attributo ''focus'' da focus="" a focus="firstName" in modo che il cursore sia nel campo firstName quando la pagina viene caricata (questo viene fatto con JavaScript). |
At line 354 changed 1 line. |
Another thing you will need to do is comment out the following lines at the bottom of the personForm.jsp. This is because the Validator will throw an exception if a formName is specified and no validation rules exist for it. |
Un'altra cosa che devi fare è scommentare le righe seguenti al termine si personForm.jsp. Questo è perché il Validator lancerà un'eccezione se viene specificato un formName e non esistono regole di validazione per esso. |
At line 356 changed 1 line. |
;:''Personally, I think this is [a bug|http://nagoya.apache.org/bugzilla/show_bug.cgi?id=27316], but the Struts Committers disagreed.'' |
;:''Personalmente, credo che questo sia [un bug|http://nagoya.apache.org/bugzilla/show_bug.cgi?id=27316], ma i Committer di Struts non erano d'accordo.'' |
At line 363 changed 1 line. |
Now if you execute __ant db-load deploy__, start Tomcat and point your browser to [http://localhost:8080/appfuse/editPerson.html?id=1], you should see something like this: |
Ora se esegui __ant db-load deploy__, fai partire Tomcat e punti il tuo browser si [http://localhost:8080/appfuse/editPerson.html?id=1], dovresti vedere qualcosa del genere: |
At line 370 changed 1 line. |
%%note __NOTE:__ Use the __deploy-web__ target if you've changed any files under the ''web'' directory. Otherwise, use __deploy__ which compiles and deploys.%% |
%%note __NOTA:__ Usa il target __deploy-web__ se hai modificato un qualsiasi file sotto la directory ''web''. Altrimenti, usa __deploy__ che compila ed effettua il deploy.%% |
At line 372 changed 1 line. |
Finally, to make this page more user friendly, you may want to add a message for your users at the top of the form, which can easily be done by adding text (using <fmt:message>) at the top of the personForm.jsp page. |
Infine, per rendere questa pagina più user friendly, potresti voler aggiungere un messaggio per i tuoi utenti in cima al form, il che può essere facilmente fatto aggiungenfo del testo (usando <fmt:message>) in cima alla pagina personForm.jsp. |
At line 383 changed 3 lines. |
* Modifica - [http://localhost:8080/appfuse/editPerson.html?id=1] (make sure and run __ant db-load__ first). |
* Elimina - [http://localhost:8080/appfuse/editPerson.html?method=Delete&id=1] (or edit and click on the Delete button). |
* Registra - Click [edit|http://localhost:8080/appfuse/editPerson.html?id=1] and then click the Save button. |
* Modifica - [http://localhost:8080/appfuse/editPerson.html?id=1] (assicurati di aver eseguito orima __ant db-load__). |
* Elimina - [http://localhost:8080/appfuse/editPerson.html?method=Delete&id=1] (o modifica e fai clic sul pulsante Delete). |
* Registra - Click [edit|http://localhost:8080/appfuse/editPerson.html?id=1] e fai clic sul pulsante Save. |
At line 387 changed 1 line. |
I test du Canoo sono piuttosto slick in quanto si configurano tramite un semplice file XML. Per aggiungere test per aggiungi, modifica, registra ed elimina, apri test/web/web-tests.xml ed aggiungi il seguente XML. Noterai che questo frammento ha un target che si chiama ''PersonTests'' per eseguire tutti i test correlati. |
I test di Canoo sono piuttosto immediati in quanto si configurano tramite un semplice file XML. Per aggiungere test per add, edit, save e delete, apri test/web/web-tests.xml ed aggiungi il seguente XML. Noterai che questo frammento ha un target che si chiama ''PersonTests'' per eseguire tutti i test correlati. |
At line 389 changed 1 line. |
;:''I use CamelCase target names (vs. the traditional lowercase, dash-separated) because when you're typing ''-Dtestcase=Name'', I've found that I'm used to doing CamelCase for my JUnit Tests.'' |
;:''Io uso nomi CamelCase per i target (controlo il tradizionale minuscolo, separato da trattini) perché quando digiti ''-Dtestcase=Name'', ho scoperto che sono solito fare il CamelCase per i miei Test JUnit.'' |
At line 471 changed 1 line. |
After adding this, you should be able to run __ant test-canoo -Dtestcase=PersonTests__ with Tomcat running or __ant test-jsp -Dtestcase=PersonTests__ if you want Ant to start/stop Tomcat for you. To include the PersonTests when all Canoo tests are run, add it as a dependency to the "run-all-tests" target. |
Dopo aver aggiunto questo, dovresti essere in grado di eseguire __ant test-canoo -Dtestcase=PersonTests__ con Tomcat in esecuzione o __ant test-jsp -Dtestcase=PersonTests__ se vuoi che Ant faccia lo start/stop di Tomcat per te. Per includere i PersonTests quando vengono eseguiti tutti i test Canoo, aggiungilo come dipendenza al target "run-all-tests". |
At line 473 changed 1 line. |
You'll notice that there's no logging in the client-side window by Canoo. If you'd like to see what it's doing, you can add the following between </webtest> and </target> at the end of each target. |
Noteria che no c'è alcun log nella finestra lato client di Canoo. Se vuoi vedere cosa sta facendo, puoi aggiungere le righe seguenti fra </webtest> e </target> alla fine di ciascun target. |
At line 485 changed 1 line. |
''Next Up:'' __Part IV:__ [Adding Validation and List Screen|ValidationAndList] - Adding validation logic to the personForm so that firstName and lastName are required fields and adding a list screen to display all person records in the database. |
''Prossima Puntata:'' __Parte IV:__ [Aggiungere la Validazione ed una Schermata Elenco|ValidationAndList_it] - Aggiungere una logica di validazione al personForm in modo che firstName e lastName siano campi obbligatori ed aggiungere una schermata di elenco per visualizzare tutti i record di tipo person nel database. |