2012-05-30 8 views
17

WebApplicationInitializer प्रोग्रामेटिक रूप से मानक वेब.एक्सएमएल फ़ाइल - सर्वलेट, फ़िल्टर, श्रोताओं के एक अच्छे हिस्से का प्रोग्राम करने के लिए एक तरीका प्रदान करता है।स्प्रिंग एमवीसी 3.1+ WebApplicationInitializer का प्रयोग सत्र-कॉन्फ़िगरेशन और त्रुटि-पृष्ठ

हालांकि मैं WebApplicationInitializer का उपयोग करके इन तत्वों (सत्र-टाइमआउट, त्रुटि-पृष्ठ) का प्रतिनिधित्व करने का एक अच्छा तरीका समझने में सक्षम नहीं हूं, क्या इन तत्वों के लिए अभी भी web.xml को बनाए रखना आवश्यक है?

<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> 

उत्तर

13

मैं इस विषय पर अनुसंधान के एक बिट किया और पाया कि sessionTimeOut और त्रुटि पृष्ठों की तरह विन्यास से कुछ के लिए आप अभी भी web.xml की आवश्यकता है।

इस Link

आशा यह आप में मदद करता है पर नज़र डालें। चीयर्स।

+0

@Japs धन्यवाद, हाँ लगता है इन web.xml फ़ाइल के माध्यम से किया जाना –

+1

स्थिति बदल गया है या हम अभी भी जरूरत है की आवश्यकता होगी 'web.xml' रखने के लिए? –

+0

मुझे इसके बारे में निश्चित नहीं है। हाल ही में नवीनतम वसंत संस्करण के साथ कोशिश नहीं की है। –

5

वसंत-बूट का उपयोग करना यह बहुत आसान है।

मुझे यकीन है कि यह वसंत बूट के बिना भी SpringServletContainerInitializer बढ़ाकर किया जा सकता है। ऐसा लगता है कि यह विशेष रूप से डिजाइन किया गया है।

सर्वलेट 3.0 ServletContainerInitializer कोड आधारित वसंत के WebApplicationInitializer एसपीआई का उपयोग कर के रूप में पारंपरिक web.xml आधारित दृष्टिकोण (साथ संयोजन में या संभवतः) करने का विरोध किया सर्वलेट कंटेनर के विन्यास का समर्थन करने के लिए डिज़ाइन किया गया।

नमूना कोड (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; 
    } 
} 
+0

मुझे लगता है कि servletContainer() विधि पर एक @ बीन एनोटेशन गायब है। – Felix

+0

आप सही, अद्यतन पोस्ट हैं। –

+3

यह केवल एक एम्बेडेड टोमकैट के लिए काम करता है। 'Application.properties' में 'server.session-timeout = 20' सेट करना आसान है – niels

3

असल WebApplicationInitializer यह सीधे प्रदान नहीं करता है। लेकिन जावा कॉन्फ़िगरेशन के साथ sessointimeout सेट करने का एक तरीका है।

आप बनाने के लिए एक HttpSessionListner पहले है:

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"); 
    } 
} 

इसके बाद बस जो विधि onStartup

servletContext.addListener(SessionListener.class); 
1

BwithLove टिप्पणी पर विस्तार के तहत WebApplicationInitializer में उपलब्ध हो जाएगा अपने सर्वलेट संदर्भ के साथ इस श्रोता रजिस्टर, आप अपवाद और नियंत्रक विधि का उपयोग कर 404 त्रुटि पृष्ठ को परिभाषित कर सकते हैं जो @ExceptionHandler है:

  1. DispatcherServlet में NoHandlerFoundException फेंकने में सक्षम करें।
  2. @ControllerAdvice और @ExceptionHandler नियंत्रक में उपयोग करें।

WebAppInitializer वर्ग:

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; 
} 
} 

नियंत्रक वर्ग:

@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" एक JSP फ़ाइल है।

1

web.xml में

<session-config> 
    <session-timeout>3</session-timeout> 
</session-config>--> 
<listener> 
    <listenerclass> 

    </listener-class> 
</listener> 

श्रोता वर्ग

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); 
      } 
     } 
    } 
} 
} 
संबंधित मुद्दे