【问题标题】:Spring newbie: The url-pattern for my DispatcherServlet seems to 'override' the welcome-file春季新手:我的 DispatcherServlet 的 url 模式似乎“覆盖”了欢迎文件
【发布时间】:2011-04-25 02:47:55
【问题描述】:

我正在使用 Spring 来呈现我的 JSP,我的 DispatcherServlet 的 url 模式是“/”。这似乎使得欢迎文件列表永远不会被考虑。我实际上希望DispatcherServlet 处理除“/”之外的所有内容。但是,我想避免文件扩展名(例如,*.html、.do 等),并且我使用的是InternalResourceViewResolver,因此将调度程序 servlet 的 url-pattern 设置为“/ em>" 使其接受太多(例如,InternalResourceViewResolver 生成的 JSP 页面的内部请求将被调度程序 servlet 拦截,然后会抛出错误,因为它没有 /WEB-INF/jsp 的映射/about.jsp)。任何帮助将不胜感激 - 我是 Spring 非常新手(例如 2 天 ;-))

以下是相应的文件:

目录结构

/war (I'm using AppEngine)
  index.jsp (Simply includes WEB-INF/jsp/index.jsp)
  /WEB-INF
    XML Config files

    /jsp
      index.jsp
      about.jsp
      ...

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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

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

<!--
    We purposefully do not make this /*. The convention here is to define
    mappings for files that exist, and write a good 404 page for anything
    else. Also, if you say /*, then the dispatcher servlet will intercept
    all requests, and the InternalResourceViewResolver will fail to
    resolve internal resources (e.g. jsp pages) because the dispatcher
    servlet will be intercepting all of the requests, even the internal
    ones
-->
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

</web-app>

调度程序-servlet.xml

<!-- Search for and import all components in the controllers package -->
<context:component-scan base-package="org.foo.server.controllers" />


<bean name="viewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
    <property name="order" value="2" />
    <property name="location" value="/WEB-INF/views.xml" />
</bean>

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="100000" />
</bean>


<!--
    Given an arbitrary view name, such as 'about, that has been returned
    from a handler (controller), this will simply create
    '/WEB-INF/jsp/about.jsp' and send that to the Dispatcher Servlet.
    Because of the way ViewResolvers are chained (e.g. search until a View
    is found), coupled with the annoyance that this ViewResolver cannot
    determine if a View is found, this *has* to be the last ViewResolver
    considered, so I have set the order very high. See
    http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-viewresolver-chaining
    for more details
-->
<bean id="jspResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
    <property name="order" value="999" />
</bean>

JSP 控制器(包含在 org.foo.server.controllers 包中的控制器之一)

@Controller
public class WebportalController {
@RequestMapping(value = "/myforms", method = RequestMethod.GET)
public String getMyForms() {
    return "myforms";
}

@RequestMapping(value = "/about", method = RequestMethod.GET)
public String getAbout() {
    return "about";
}
... etc (for now all of the JSP pages are fairly static)
}

【问题讨论】:

  • 能否为通过 spring 调度的动态页面添加前缀? /spring 或 /x 之类的东西?这样,您可以将 /spring/* 映射到调度程序 servlet 并保留未映射的 '/' 以便读取欢迎文件。

标签: java spring configuration spring-mvc url-pattern


【解决方案1】:

我解决这个问题的方法是给 dipatcher servlet 一些前缀,并将带有该前缀的所有内容转发给它(包括扩展)。就我而言,我使用了webapp,然后还有其他一级目录,如images 等。这是我找到的唯一方法(缺少URL 重写)让它工作。此外,如果您愿意,您可以使用 URL 重写引擎从没有扩展名的请求中删除 webapp,等等。

【讨论】:

  • 我认为这是唯一“简单”的答案:-/我真的希望避免这样做,因为我已经有一些链式视图解析器 - 我基本上需要更改我的所有请求使用新的前缀(或后缀),然后如果我不希望它出现,我将需要进行 URL 重写,这可能会导致内部至少有 3 个链式解析器,对于其他春季新手来说可能很难对项目了解
  • 啊,你正在为你正在学习的课程写这篇文章,不是吗?
  • 其实是为了一个研究项目,但我在指导一些本科生。他们很快,但在某个时候会有一批新的本科生进来接管,所以我必须提前计划一点;-)
猜你喜欢
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多