在Spring 3.0中寻找更简洁的JSP转发配置

时间:2011-02-17 13:08:03

标签: java spring jsp spring-mvc forwarding

在普通的Java weba应用程序中,如果我将它放在我的servlet代码中,则转发工作正常:

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

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

    <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向前发挥作用。

有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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。

答案 2 :(得分:1)

首先,无论你能从servlet中做什么,你都可以在Spring MVC控制器中做到(因为那时你基本上都在DispatcherServlet.service()内),所以如果你得到404这个可能与您的servlet映射有关。是否可能将Dispatcher servlet映射为/ *?

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

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