在普通的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向前发挥作用。
有更好的方法吗?
答案 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”。 ..