使用SpringMVCs viewResolvers解析不在Web应用程序的根JSP目录中的JSP文件的路径的简单方法是什么?例如,假设我们有以下Web应用程序结构:
web-app
|-WEB-INF
|-jsp
|-secure
|-admin.jsp
|-admin2.jsp
index.jsp
login.jsp
我想使用一些开箱即用的组件来解析 jsp 根文件夹和 secure 子目录中的JSP文件。我有一个*-servlet.xml
文件定义:
开箱即用,InternalResourceViewResolver
:
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
处理程序映射:
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/index.htm">urlFilenameViewController</prop>
<prop key="/login.htm">urlFilenameViewController</prop>
<prop key="/secure/**">urlFilenameViewController</prop>
</props>
</property>
</bean>
一个开箱即用的UrlFilenameViewController
控制器:
<bean id="urlFilenameViewController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController">
</bean>
我遇到的问题是无法解析对 secure 目录中的JSP的请求,因为jspViewResolver
只有前缀定义为/jsp/
而不是{{ 1}}。
有没有办法处理像这样的子目录?我更喜欢保留这种结构,因为我也试图利用 Spring Security 并在子目录中拥有所有安全页面是一种很好的方法。
可能有一种简单的方法来实现这一点,但我是Spring和Spring MVC框架的新手,所以任何指针都会受到赞赏。
答案 0 :(得分:2)
我无法找到问题的确切解决方案,但我确实有适合我特定要求的解决方法。问题似乎在于手柄映射。如果在帖子的示例中指定,则对安全文件夹中的页面的任何请求都会导致尝试在/WEB-INF/JSP/
文件夹中找到实际的JSP文件失败,当然实际文件位于{{1} }。
但是,如果指定如此:
/WEB-INF/jsp/secure/
然后正确解析所有页面。对 <bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/login.htm">loginFormController</prop>
<prop key="**/*.htm">urlFilenameViewController</prop>
</props>
</property>
</bean>
的请求将转到特定的表单控制器,但是请求所有其他页面,无论它们是否位于根JSP目录中,或者将找到子目录。对我来说这很好,因为我真正想要的是避免为应用程序中的每个页面指定控制器的方法(嗯...也许我应该在第一篇文章中明确说明 - 也许有更好的方法来无论如何这样做(?))。 /login.html
充当了一个包罗万象的案例,我想要由不同控制器处理的任何页面都可以在此属性上明确指定,如**/*.htm
所示。
答案 1 :(得分:2)
尝试使用UrlFilenameViewController
或return new ModelAndView("secure/login");
答案 2 :(得分:1)
您可以尝试在控制器中提供视图的名称,如
<property name="formView" value="secure/admin"/>
<property name="successView" value="secure/admin2"/>
将前缀和后缀映射如下
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
这最终将映射到/WEB-INF/jsp/secure/admin.jsp和/WEB-INF/jsp/secure/admin2.jsp
答案 3 :(得分:1)
您需要将Handler中的alwaysUseFullPath属性设置为true:
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
...
<property name="alwaysUseFullPath" value="true" />
</bean>
这将强制处理程序使用URI的'/ secure /'部分,然后解析器将在WEB-INF / jsp中查找JSP时包含它。
答案 4 :(得分:1)
根据文件显示,这似乎应该有效:
您展示的配置似乎与文档中的示例相匹配。如果您的Spring MVC调度程序servlet映射到“/”,则对“{context} /secure/whatever.jsp”的请求应转换为视图名称“secure / whatever”。也许它与“**”通配符有关?或者你的其他一些配置可能不对?您是否可以在web.xml中包含设置Spring调度程序servlet的部分,还包括您在浏览器中请求的完整路径?
找到问题的另一种方法是下载Spring MVC源代码并将其包含在您的应用程序中,然后使用调试器查看SimpleUrlHandlerMapping和UrlFilenameViewController bean中的确切内容,以尝试查明错误。你应该能够很快地确定出错的地方。
答案 5 :(得分:0)
您需要按如下方式设置属性:
<property name="prefix" value="/WEB-INF/jsp/"/>
然后您可以访问URI secure/admin1.jsp
答案 6 :(得分:0)
可以使用前缀
中的通配符访问所有子文件夹
从控制器你可以简单地将jsp名称作为字符串返回,即使它位于/ WEB-INF / jsp / like / WEB-INF / jsp / abc
的子文件夹下,也会显示jsp