2015-09-12 2 views
5

У меня есть webAppContext в основном классе, и у меня есть сервлет, который имеет аннотацию и конструктор WebServlet с args. Как я могу передать аргументы от Главного класса до Сервлета?аргумент аргумента WebAppContext для конструктора сервлета

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

Вы должны использовать EJB Injection, поскольку вы решили использовать IoC (инверсия управления). –

ответ

3

Ну, насколько я понимаю, вы создали веб-приложения с помощью JavaSE и встроенный Jetty. Вы используете аннотации для добавления сервлетов на ваш сервер. И затем Jetty создает ваши сервлеты, которые он вызывает конструкторы по умолчанию. Но вам нужно как-то передать ссылки на объекты, созданные вами в main(), на ваши сервлеты.

Итак, есть несколько решений:

  1. создать собственный "dependency injection": Добавить одноплодный класс Context для приложения. В main() поставьте свои услуги на Map<Class<?>, Object> Контекста. И получить их в сервлетах.
  2. Используйте рамки для инъекций зависимостей. Как Spring.
  3. Перейти к J2EE и использовать EJB. В этом случае вам нужно забыть о своем main() и управлять им с помощью веб-сервера.

P.S. Причал имеет способ addBean(...). И вы можете добавить свой «bean» к серверу (в коде или в config). Но, насколько я знаю, невозможно получить этот компонент в сервлете.

Смежные вопросы