2011-02-17 59 views
0

在一個普通的Java WEBA應用程序,如果我把這個在我的servlet代碼的轉發工作:在Spring 3.0尋找一個更簡潔的JSP轉發配置

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

但是,當我做到這一點在同一個servlet中在Spring 3.0的應用程序,我得到一個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着工作。

有沒有更好的方法來做到這一點?

回答

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 /頁面的視圖。在你的例子中,它將是/WEB-INF/pages/something.jsp。

+0

很好的答案。謝謝。 – Tree 2011-02-17 15:30:00

2

我不完全理解你的問題,但:

  • return "/something"從控制器轉發到一個jsp叫做something.jsp(如果使用的最典型的視圖解析器配置)

  • ,如果你沒有來自方法的返回值,默認情況下查找帶有方法名稱的jsp。

+0

對不起,如果我不清楚。是的,我知道你提出的觀點。但是,我從非SpringMVC應用程序導入了一些servlet和JSP到我的Spring MVC應用程序中,並且它們包含諸如`getServletConfig()。getServletContext()。getRequestDispatcher(「/ something.jsp」)等語法。forward(req, );`我的應用程序沒有被認爲是有效的重定向,儘管我把`something.jsp`放在了我的Spring應用程序中。 – Tree 2011-02-17 15:32:32

1

首先,無論你從一個servlet中做什麼,你都可以從一個Spring MVC控制器中做到這一點(因爲那時你基本上在DispatcherServlet.service()之內),所以如果你得到一個404這可能是相關的到你的servlet映射。是否有可能將Dispatcher servlet映射爲/ *?另外(但更重要的是,我會說),Spring MVC(基本上是任何Web框架)都應該隱藏您的servlet基礎結構,因此您需要使用RequestDispatcher並轉發請求並不是非常清楚對我來說。

要將請求轉發到JSP,只需在ViewResolver知道的位置並從控制器方法返回「something」,因爲這具有完全相同的效果,並且更「MVC-ish」 ...

+0

「您可能將Dispatcher servlet映射爲/ *?」是。沒有看到。謝謝。 – Tree 2011-02-17 15:29:36

相關問題