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>
17
demandé sur Cœur 2012-05-30 13:56:49

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.

13
répondu Japan Trivedi 2012-05-30 10:57:35

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;
    }
}
5
répondu Matt MacLean 2014-07-19 19:05:38

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);
3
répondu Satyajitsinh Raijada 2015-06-18 07:22:26

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:

  1. activer le lancer NoHandlerFoundException dans le répartiteur.
  2. 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.

1
répondu nmeln 2015-08-25 17:58:56

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);
            }
        }
    }
 }
}
1
répondu ycli 2016-05-12 10:56:36