【问题标题】:Is Spring MVC without Controller Possible (but Using only DispatcherServlet)没有控制器的 Spring MVC 是否可能(但仅使用 DispatcherServlet)
【发布时间】:2015-10-08 02:39:26
【问题描述】:

我正在尝试在不编写显式控制器的情况下配置 spring mvc 应用程序,而仅使用 DispatcherServlet。我很难让它工作(我没有故意添加控制器)。这是我的代码:

<servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <load-on-startup>2</load-on-startup>
  </servlet>

  <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>*.htm</url-pattern>  
  </servlet-mapping>

在 JSP 中:

<a href="/myapp/test1.htm">Test1 HTML</a> &nbsp;

我看到以下错误:

[org.springframework.web.servlet.PageNotFound] WARN  No mapping found for HTTP request with URI [/myapp/test1.htm] in DispatcherServlet
with name 'dispatcher'

【问题讨论】:

  • 这在意料之中。你的目标到底是什么?您将 *.htm 映射到调度程序 servlet。您向 test1.htm 发送请求。所以它转到调度程序 servlet。分派器 servlet 尝试将请求分派到映射到 /test1.htm 的控制器,但没有找到任何控制器,因为您根本没有定义任何控制器,因此它发回 404 错误。
  • 您为什么要这样做?对我来说似乎很愚蠢。使用正确的成语书写。
  • 我的目标是了解为什么我们需要控制器,而我只想将请求发送到特定资源。 spring mvc的dispatcher servlet是不是不够灵活,无法判断这里没有控制器,dispatcher servlet应该只是将请求路由到test1.htm。如果它足够灵活,那么我只想知道如何去做。
  • 听起来您正在寻找视图控制器。
  • 将您的DispatcherServlet 映射到/ 并在您的xml 文件中注册&lt;mvc:default-servlet-handler /&gt;。这会将所有未解析的 URI 传递给容器。

标签: java html spring spring-mvc servlets


【解决方案1】:

您可以通过在 dispatcher-servlet.xml 中指定控制器来完成此操作,只要您还指定了某种视图解析器:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/htm/" />
  <property name="suffix" value=".htm" />
</bean>

<mvc:view-controller path="/test" view-name="test" />

【讨论】:

    【解决方案2】:

    好的,所以您的问题实际上是要知道是否可以提供名称与调度程序-servlet 匹配匹配的静态资源。

    这绝对是可能的,and documented:

    这允许将 DispatcherServlet 映射到“/”(从而覆盖容器默认 Servlet 的映射),同时仍然允许由容器的默认 Servlet 处理静态资源请求。它使用“/**”的 URL 映射和相对于其他 URL 映射的最低优先级配置 DefaultServletHttpRequestHandler。

    此处理程序会将所有请求转发到默认 Servlet。

    虽然选择将 spring servlet 映射到一个非常具体的映射 (*.htm) 是很奇怪的,尽管您知道这种映射会与静态资源发生冲突。您可以简单地选择将 servlet 映射到任何其他扩展名(*.action 或其他),因此一开始就不会发生这种冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 2016-12-03
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      相关资源
      最近更新 更多