Utiliser le ressort MVC 3.1+ WebApplicationInitializer pour configurer programmatically session-config et error-page
WebApplicationInitializer fournit un moyen de représenter programmatiquement une bonne partie d'un web standard.fichier xml - les servlets, filtres, écouteurs.
cependant je n'ai pas été en mesure de comprendre une bonne façon de représenter ces éléments(session-timeout, erreur-page) en utilisant WebApplicationInitializer, est-il nécessaire de maintenir encore un web.xml pour ces éléments?
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/uncaughtException</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/resourceNotFound</location>
</error-page>
5 réponses
j'ai fait un peu de recherche sur ce sujet et j'ai trouvé que pour certaines des configurations comme les pages sessionTimeOut et error vous avez encore besoin d'avoir le web.XML.
un coup d'oeil à ce Lien
j'Espère que cela vous aide. Acclamation.
en utilisant le ressort-boot c'est assez facile.
je suis sûr qu'il pourrait être fait sans ressort de démarrage, ainsi que par l'extension SpringServletContainerInitializer. Il semble que c'est ce pour quoi il est spécifiquement conçu.
Servlet 3.0 ServletContainerInitializer conçu pour prendre en charge les configuration du réservoir de servlet à L'aide du ressort WebApplicationInitializer SPI par opposition à (ou éventuellement en combinaison avec le traditionnel Web.approche fondée sur le xml.
Code de L'échantillon (utilisant SpringBootServletInitializer)
public class MyServletInitializer extends SpringBootServletInitializer {
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory containerFactory = new TomcatEmbeddedServletContainerFactory(8080);
// configure error pages
containerFactory.getErrorPages().add(new ErrorPage(HttpStatus.UNAUTHORIZED, "/errors/401"));
// configure session timeout
containerFactory.setSessionTimeout(20);
return containerFactory;
}
}
en fait WebApplicationInitializer
ne fournit pas directement. Mais il y a une façon de définir sessointimeout avec la configuration java.
Vous devez créer un HttpSessionListner
le premier :
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
//here session will be invalidated by container within 30 mins
//if there isn't any activity by user
se.getSession().setMaxInactiveInterval(1800);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session destroyed");
}
}
après cela, enregistrez cet écouteur avec votre contexte servlet qui sera disponible en WebApplicationInitializer
selon la méthode onStartup
servletContext.addListener(SessionListener.class);
extension sur le commentaire BwithLove, vous pouvez définir la page d'erreur 404 en utilisant la méthode exception et controller qui est @ExceptionHandler:
- activer le lancer NoHandlerFoundException dans le répartiteur.
- Utiliser @ControllerAdvice et @ExceptionHandler dans le contrôleur.
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
DispatcherServlet dispatcherServlet = new DispatcherServlet(getContext());
dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", dispatcherServlet);
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
private AnnotationConfigWebApplicationContext getContext() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.my.config");
context.scan("com.my.controllers");
return context;
}
}
classe de Contrôleur:
@Controller
@ControllerAdvice
public class MainController {
@RequestMapping(value = "/")
public String whenStart() {
return "index";
}
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public String requestHandlingNoHandlerFound(HttpServletRequest req, NoHandlerFoundException ex) {
return "error404";
}
}
"error404" est un JSP fichier.
Dans le web.xml
<session-config>
<session-timeout>3</session-timeout>
</session-config>-->
<listener>
<listenerclass>
</listener-class>
</listener>
Classe D'Écoute
public class ProductBidRollBackListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
//To change body of implemented methods use File | Settings | File Templates.
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
HttpSession session=httpSessionEvent.getSession();
WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext());
ProductService productService=(ProductService) context.getBean("productServiceImpl");
Cart cart=(Cart)session.getAttribute("cart");
if (cart!=null && cart.getCartItems()!=null && cart.getCartItems().size()>0){
for (int i=0; i<cart.getCartItems().size();i++){
CartItem cartItem=cart.getCartItems().get(i);
if (cartItem.getProduct()!=null){
Product product = productService.getProductById(cartItem.getProduct().getId(),"");
int stock=product.getStock();
product.setStock(stock+cartItem.getQuantity());
product = productService.updateProduct(product);
}
}
}
}
}