0

在我的 Web 应用程序中,我有两个充当控制器的 servlet。一个 servlet 用于处理 Web 请求,另一个 servlet 用于处理 AJAX 请求。

//This servlet manages web requests, and forwards to JSP to display data
WebController extends HttpServlet: 

// This servlet manages AJAX requests. And returns JSON to user
AJAXController extends HttpServlet: This servlet manages 

在我web.xml的我定义了以下映射:

<servlet>
  <servlet-name>WebController</servlet-name>
  <servlet-class>com.frontend.WebController</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>WebController</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet>

  <servlet-name>AJAXController</servlet-name>
  <servlet-class>com.AJAXController</servlet-class>
  <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>AJAXController</servlet-name>
  <url-pattern>*.xhr</url-pattern>
</servlet-mapping>

所以你可以看到我之前加载WebControllerAJAXController
init()方法中webController,我完成了所有的初始化任务。

loading the database driver
initializing the configuration
and other stuff that I need for my web application

启动时加载确保在任何 AJAX 请求到达服务器之前,Web 应用程序已初始化,并且我可以确保进行数据库访问。

但是,我不喜欢在一个 servlet 中初始化 Web 应用程序的想法。我正在考虑调用一个单独的 servlet并将InitServlet代码从WebControllerinit 方法移动到方法InitServletinit()

问题

  1. 这是个好主意吗?还有其他方法可以解决这个问题吗?
  2. 我的 servlet 映射应该是什么样子,因为 init servlet 的唯一目的是初始化 Web 应用程序,因此它不应该映射到任何 URL

我将发送HttpServletResponse.SC_FORBIDDEN他们的doPost()方法doGet()。但如果可能的话,我希望 servlet 不被映射到任何东西。

4

2 回答 2

2

将初始化代码移动到ServletContextListener是一个更好的主意。

当您的应用程序启动时,它将执行contextInitialized(ServletContextEvent sce),您将有机会初始化所有内容。

就是你如何将它连接到你的 web.xml

于 2013-04-24T22:25:23.703 回答
-1

我认为这不一定是一个坏主意。只需在 web.xml 中定义要首先加载的初始化服务器。就入口而言,它需要定义 servlet 类,当然还有启动时的加载顺序。

将您的初始化代码放入已实现的 init 方法中。将 doGet doPost 方法留空,因此如果它们被调用,则不会发生任何事情。init 方法只会在加载 servlet 时被调用一次。

我看到的唯一问题是,如果这是在一组集群应用程序服务器的上下文中运行的,并且您拥有真正单例的资源(如连接池),但在这种情况下,您可以通过应用程序中的应用程序配置来初始化这些资源服务器。它们将在应用程序启动时和加载 servlet 之前被初始化。

于 2013-04-24T22:29:31.900 回答