1

在一个普通的 Java weba 应用程序中,如果我把它放在我的 servlet 代码中,转发工作:

getServletConfig().getServletContext().getRequestDispatcher("/something.jsp").forward(req, resp);

但是当我在 Spring 3.0 应用程序的同一个 servlet 中执行此操作时,404即使我将此条目添加到我的应用程序上下文 xml 文件中,我也会得到一个:

    <intercept-url pattern="/something.jsp**" access="hasRole('ROLE_ANONYMOUS')" requires-channel="http" />

相反,我似乎必须在 Spring 中执行此操作:

getServletConfig().getServletContext().getRequestDispatcher("/something").forward(req, resp);

并在控制器中添加一个映射:

@RequestMapping(value = {"/something"}, method = RequestMethod.GET)
public final String something(HttpServletRequest req, ModelMap model) {
    ...
    }

但是,要让一个简单的 JSP 前向工作,这是一个相当重要的弯路。

有一个更好的方法吗?

4

3 回答 3

3

我不完全理解你的问题,但是:

  • return "/something"从控制器转发到被调用的 jsp something.jsp(如果使用最典型的视图解析器配置)

  • 如果您没有来自方法的返回值,默认情况下会查找具有方法名称的 jsp。

于 2011-02-17T13:17:52.650 回答
1

我就是这样做的:

设置视图解析器,使视图名称基于请求 URL:

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
  <property name="prefix" value="/WEB-INF/pages/"/>
  <property name="suffix" value=".jsp"/>
</bean>

其次,servlet 容器根据匹配的最长路径选择映射。因此,您可以将此映射放入您的 JSP,它将被选择而不是 /* 映射。

<servlet-mapping>
  <servlet-name>jsp</servlet-name>
  <url-pattern>/WEB-INF/pages/*</url-pattern>
</servlet-mapping>

实际上,对于 Tomcat,这就是您所需要的,因为 jsp 是一个开箱即用的 servlet。对于其他容器,您要么需要找出 JSP servlet 的名称,要么添加一个 servlet 定义,例如:

<servlet>
  <servlet-name>jsp</servlet-name>
  <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>

一旦这两件事都到位,那么除了返回模型外,您无需在控制器中执行任何操作。它将根据您请求的 URL 自动从 WEB-INF/pages 转发到视图。在您的示例中,它将是 /WEB-INF/pages/something.jsp。

于 2011-02-17T13:32:57.310 回答
1

首先,无论您可以从 servlet 做什么,都可以在 Spring MVC 控制器中执行(因为那时您基本上在DispatcherServlet.service(). 您是否可以将 Dispatcher servlet 映射为 /* ?

另外(但更重要的是,我会说),Spring MVC(基本上是任何 Web 框架)应该对您隐藏 servlet 基础结构,因此您需要使用 RequestDispatcher 并转发请求对我来说不是很清楚。

要将请求转发到 JSP,只需将其放在 ViewResolver 知道的位置,然后从控制器方法返回“某物”——因为这具有完全相同的效果,并且更“MVC-ish”...

于 2011-02-17T13:33:38.103 回答