package com.websystique.springmvc.configuration;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.websystique.springmvc")
public class AppConfig {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
}
Ancora una volta, @Configurationsegna questa classe come classe di configurazione come menzionato sopra e fa riferimento ComponentScanalle posizioni dei pacchetti per trovare i bean associati.
@EnableWebMvcè equivalente a mvc:annotation-drivenin XML.
Il metodo viewResolverconfigura un resolver di visualizzazione per identificare la vista reale.
In questo post, stiamo lavorando con l'invio dei moduli, convalidando l'input dell'utente (tramite annotazioni JSR303). In caso di errore di convalida, vengono visualizzati i messaggi di errore predefiniti. Per ignorare tali impostazioni predefinite dai propri messaggi personalizzati [internazionalizzati] da un pacchetto di messaggi esterno [file .properties], è necessario configurare a ResourceBundleMessageSource. Il metodo messageSourceè lì per lo stesso scopo. Notare il parametro fornito (messaggi) al metodo basename. Spring cercherà un file denominato messages.properties nel percorso della classe dell'applicazione. Aggiungiamo il file:
/src/main/resources/messages.properties
Size.employee.name=Name must be between {2} and {1} characters long
NotNull.employee.joiningDate=Joining Date can not be blank
NotNull.employee.salary=Salary can not be blank
Digits.employee.salary=Only numeric data with max 8 digits and with max 2 precision is allowed
NotEmpty.employee.ssn=SSN can not be blank
typeMismatch=Invalid format
non.unique.ssn=SSN {0} already exist. Please fill in different value.
Si noti che il messaggio precedente segue un modello specifico
{ValidationAnnotationClass}.{modelObject}.{fieldName}
Inoltre, sulla base di annotazioni specifiche (es. @Size) puoi anche passare gli argomenti a questi messaggi usando gli indici {0}, {1}, .. {i}.
Adesso bisogna configurare la seguente classe :
package com.websystique.springmvc.configuration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
public class AppInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext container) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(AppConfig.class);
ctx.setServletContext(container);
ServletRegistration.Dynamic servlet = container.addServlet(
"dispatcher", new DispatcherServlet(ctx));
servlet.setLoadOnStartup(1);
servlet.addMapping("/");
}
}
Il contenuto sopra è simile al contenuto di web.xml poiché stiamo utilizzando il front controller DispatherServler, assegnando il mapping (url-pattern in xml) e invece di fornire il percorso per il file di configurazione spring (spring-servlet.xml), eccoci registrazione della classe di configurazione.
AGGIORNAMENTO: nota che la classe sopra può essere scritta anche più concisamente [ ed è il modo preferito ], estendendo la AbstractAnnotationConfigDispatcherServletInitializerclasse base, come mostrato di seguito:
package com.websystique.springmvc.configuration;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { AppConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}