Java 在Spring3.0中寻找更简洁的JSP转发配置

Java 在Spring3.0中寻找更简洁的JSP转发配置,java,spring,jsp,spring-mvc,forwarding,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

在普通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" />
并在控制器中添加映射:

@RequestMapping(value = {"/something"}, method = RequestMethod.GET)
public final String something(HttpServletRequest req, ModelMap model) {
    ...
    }
但是,要让一个简单的JSP继续工作,这是一个相当重要的绕道


有更好的方法吗?

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

如果使用最典型的视图解析器配置,则返回/something从控制器转发到名为something.jsp的jsp

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


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

如果使用最典型的视图解析器配置,则返回/something从控制器转发到名为something.jsp的jsp

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

我就是这样做的:

设置视图解析程序,使视图名称基于请求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。

我就是这样做的:

设置视图解析程序,使视图名称基于请求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。

首先,无论您能够从servlet执行什么操作,您都可以从Spring MVC控制器中执行,因为此时您基本上在DispatcherServlet.service中,因此如果您获得404,这可能与您的servlet映射有关。是否可能将Dispatcher servlet映射为/*

单独但更重要的是,我要说,SpringMVC作为基本上任何web框架都应该对您隐藏servlet基础设施,因此您需要使用RequestDispatcher并转发请求对我来说不是很清楚


要将请求转发到JSP,只需将其放在ViewResolver知道的位置,然后从controller方法返回一些内容-因为这具有完全相同的效果,而且更像MVC…

首先,无论您能从servlet执行什么操作,您都可以从Spring MVC控制器中执行,因为此时您基本上在DispatcherServlet.service中,因此如果您得到404,这可能与您的servlet映射有关。是否可能将Dispatcher servlet映射为/*

单独但更重要的是,我要说,SpringMVC作为基本上任何web框架都应该对您隐藏servlet基础设施,因此您需要使用RequestDispatcher并转发请求对我来说不是很清楚


要将请求转发到JSP,只需将其放在ViewResolver知道的位置,然后从controller方法返回一些内容-因为这具有完全相同的效果,并且更像MVC…

是否可以将Dispatcher servlet映射为/*?对我没看到。谢谢。是否可以将Dispatcher servlet映射为/*?对我没看到。谢谢。如果我不清楚,很抱歉。是的,我知道你的观点。但是,我正在将一些servlet和jsp从非SpringMVC应用程序导入到我的SpringMVC应用程序中,它们包含诸如getServletConfig.getServletContext.getRequestDispatcher/something.jsp.forwardreq,resp;即使我将something.jsp放在Spring应用程序中存储所有其他jsp的位置,我的应用程序也无法将其识别为有效重定向。是的,我知道你的观点。但是,我正在将一些servlet和JSP从非SpringMVC应用程序导入到我的SpringMVC应用程序中,它们包含诸如getServletConfig.getServletContext.getRequ之类的语法 estDispatcher/something.jsp.forwardreq,resp;即使我将something.jsp放在Spring应用程序中存储所有其他jsp的位置,我的应用程序也无法将其识别为有效重定向。