Spring 新手:我的 DispatcherServlet 的 url 模式似乎“覆盖”了欢迎文件

发布于 2024-11-03 04:30:14 字数 4215 浏览 3 评论 0原文

我使用 Spring 来呈现 JSP,并且我的 DispatcherServlet 的 url 模式是“/”。这似乎使得欢迎文件列表永远不会被考虑。我实际上希望 DispatcherServlet 能够处理除“/”之外的所有内容。但是,我想避免使用文件扩展名(例如 *.html、.do 等),并且我使用 InternalResourceViewResolver,因此为调度程序 servlet 设置 url 模式到“/”使其接受太多(例如,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.xmldispatcher

<?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)
}

I am using Spring to render my JSPs, and the url-pattern for my DispatcherServlet is "/". This seems to be making it so that the welcome-file-list is never considered. I would actually like DispatcherServlet to handle everything except "/". However, I would like to avoid file name extensions (e.g., *.html, .do, etc), and I am using an InternalResourceViewResolver, so setting the url-pattern for the dispatcher servlet to "/" makes it accept too much (e.g. the internal requests for the JSP pages that InternalResourceViewResolver generates would be intercepted by the dispatcher servlet, which would then throw an error because it does not have a mapping for /WEB-INF/jsp/about.jsp). Any help would be appreciated - I am very new to Spring (e.g. 2 days ;-) )

Here are the appropriate files:

Directory Structure

/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>

dispatcher-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 Controller (one of the controllers contained within the org.foo.server.controllers" package)

@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)
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

笑脸一如从前 2024-11-10 04:30:14

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

The way I've gotten around this is to give the dipatcher servlet some prefix and forwarded everything with that prefix to it (including extensions). In my case, I used webappand then there were other first-level directories like images etc. This is the only way I've found (short of URL rewriting) to get this to work. Additionally, if you like, you could then use a URL rewriting engine to remove the webapp from requests that don't have an extension on them, etc.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文