【问题标题】:Having a servlet to setup the WebApplication有一个 servlet 来设置 Web 应用程序
【发布时间】:2013-04-18 15:54:23
【问题描述】:

在我的 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>

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

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

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

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

问题

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

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

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    最好将初始化代码移至ServletContextListener

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

    this 是您将其挂接到 web.xml 的方式

    【讨论】:

    • 这没有回答他的问题,因为他有两个 servlet,而且他不想在一个 servlet 中初始化上下文。
    • @CBass 的重点是将初始化代码从 servlet 中移开。
    • 是的,但不是他的问题。他的问题是使用第一个加载的第三个 servlet 是否可行。当然可以。
    • 我认为这两种方法都可以工作......但我更喜欢使用 ServletContextListener 而不是使用特殊的 servlet 来执行此操作......
    • 我还有一些清理代码可以挂在 ServletContetextListener 的上下文破坏中
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 2012-07-12
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      相关资源
      最近更新 更多