2015-09-12 11 views
5

Ho webAppContext nella classe principale e ho un servlet, che ha annotazione WebServlet e costruttore con args. Come posso passare argomenti dalla classe Main a Servlet?Argomento pass WebAppContext per il servlet constructor

Main.java:

String webappDirLocation = "src/main/java/frontend/webapp/"; 
WebAppContext webAppContext = new WebAppContext(); 
webAppContext.setResourceBase("public_html"); 
webAppContext.setContextPath("/"); 
webAppContext.setDescriptor(webappDirLocation + "WEB-INF/web.xml"); 
webAppContext.setConfigurations(new Configuration[]{ 
       new AnnotationConfiguration(), new WebXmlConfiguration(), 
       new WebInfConfiguration(), 
       new PlusConfiguration(), 
       new MetaInfConfiguration(), 
       new FragmentConfiguration(), 
       new EnvConfiguration()} 
); 
webAppContext.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*/classes/.*"); 
webAppContext.setParentLoaderPriority(true); 

web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
     metadata-complete="false" 
     version="3.0"> 
</web-app> 

Servlet:

@WebServlet(name = "WebSocketGameServlet", urlPatterns = {"/gameplay"}) 
public class WebSocketGameServlet extends WebSocketServlet { 
    static final Logger logger = LogManager.getLogger(GameWebSocket.class); 
    private final static int IDLE_TIME = 6000 * 1000; 
    private AccountService accountService; 
    private Game game; 
    private WebSocketService webSocketService; 

    public WebSocketGameServlet(AccountService accountService, Game game, WebSocketService webSocketService) { 
     this.accountService = accountService; 
     this.game = game; 
     this.webSocketService = webSocketService; 
    } 

    @Override 
    public void configure(WebSocketServletFactory factory) { 
     factory.getPolicy().setIdleTimeout(IDLE_TIME); 
     factory.setCreator(new GameWebSocketCreator(accountService, game, webSocketService)); 
    } 
} 
+0

È necessario utilizzare EJB Injection come si è deciso di utilizzare IoC (inversione del controllo). –

risposta

3

Beh, per quanto ho capito, ti ha creato un'applicazione web utilizzando JavaSE e molo incorporato Usi annotazioni per aggiungere servlet al tuo server. E poi Jetty crea i propri servlet che chiama costruttori predefiniti. Ma è necessario in qualche modo passare i collegamenti agli oggetti creati in main() ai propri servlet.

Quindi, ci sono diverse soluzioni:

  1. creare i propri "dependency injection": Aggiungi Singleton classe Context alla propria applicazione. In main() metti i tuoi servizi allo Map<Class<?>, Object> del Contesto. E portali in servlet.
  2. Utilizzare quadri di iniezione delle dipendenze. Come Spring.
  3. Passare a J2EE e utilizzare EJB. In questo caso è necessario dimenticare il proprio main() ed essere gestiti dal server web.

P.S. il molo server ha il metodo addBean(...). E puoi aggiungere il tuo "bean" al server (nel codice o nella configurazione). Ma per quanto ne so, non è possibile ottenere questo bean in un servlet.