2015-09-12 13 views
5

Ich habe WebAppContext in der Hauptklasse und ich habe ein Servlet, die WebServlet Annotation und Konstruktor mit Argumenten haben. Wie kann ich Argumente von der Hauptklasse an Servlet übergeben?WebAppContext übergeben Argument zu Servlet Konstruktor

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> 

Servlets:

@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

Sie sollten EJB Injection verwenden, da Sie sich für IoC entschieden haben (Inversion der Kontrolle). –

Antwort

3

Nun, soweit ich verstehe, Sie Web-Anwendung erstellt JavaSE mit und eingebettete Anlegestelle. Sie verwenden Anmerkungen, um Servlets zu Ihrem Server hinzuzufügen. Und dann erstellt Jetty Ihre Servlets, die es Standardkonstruktoren aufruft. Aber Sie müssen irgendwie Links zu Objekten, die Sie in main() erstellt haben, an Ihre Servlets übergeben.

So gibt es mehrere Lösungen:

  1. erstellen Sie besitzen „dependency injection“: Fügen Sie Ihre Anwendung Singletonklasse Kontext. In main() setzen Sie Ihre Dienste auf die Map<Class<?>, Object> des Context. Und nimm sie in Servlets.
  2. Verwenden Sie Abhängigkeits-Injection-Frameworks. Wie Spring. Gehen Sie zu J2EE und verwenden Sie EJB. In diesem Fall müssen Sie Ihre eigene main() vergessen und von Webserver verwaltet werden.

P.S. Anlegestegserver hat Methode addBean(...). Und Sie können Ihre "Bean" zum Server hinzufügen (in Code oder in Config). Aber soweit ich weiß, ist es nicht möglich, diese Bean in ein Servlet zu bekommen.

Verwandte Themen