如何将我的 src/main/webapp/WEB-INF/views 文件夹移出 src/main/webapp/?
Posted
技术标签:
【中文标题】如何将我的 src/main/webapp/WEB-INF/views 文件夹移出 src/main/webapp/?【英文标题】:How do I move my src/main/webapp/WEB-INF/views folder out of src/main/webapp/? 【发布时间】:2014-03-31 19:59:45 【问题描述】:我在 Spring MVC src/main/webapp/WEB-INF/views
中有一个文件夹,其中包含我的视图模板。我想把它移到src/main/java/views
(或src/main/webapp
之外的其他文件夹)。如何在 Spring MVC 中配置它?
我看到一个文件 src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
包含
<beans:property name="prefix" value="/WEB-INF/views/" />
很明显,我可以将其更改为
<beans:property name="prefix" value="/views/" />
这会将我的观点放在src/main/webapp/views
中,但我看不到任何将views
移出src/webapp
文件夹的方法。
换句话说,很明显value="/"
等同于src/main/webapp/
,所以我似乎仅限于将我的视图文件夹放在 src/main/webapp 中。
究竟如何将我的视图文件夹设置在src/main/webapp
之外,例如src/main/foobar
!?!无论我在 Google/Bing 上搜索什么,我都找不到任何东西。
编辑:我尝试使用/../
来实现它:
<beans:property name="prefix" value="/../java/edu/csus/csc191/views/" />
但这会导致错误提示
严重:Servlet.service() for servlet [appServlet] 在上下文中 路径 [/hp-dsat] 抛出异常 [请求处理失败;嵌套的 异常是 org.thymeleaf.exceptions.TemplateInputException:错误 解析模板“v2_upload”,模板可能不存在或可能不存在 可以通过任何已配置的模板解析器访问] 原因
上述模板确实存在于src/main/webapp/../java/views
,相当于src/main/java/views
【问题讨论】:
你为什么想要/需要?您呈现的视图或视图模板等资源属于已部署 Web 应用程序的 webapp 目录。此外,根据您的模板引擎加载模板文件的方式,webapp/WEB-INF 之外的内容可能无法通过类路径访问 为什么模板“属于已部署的 Web 应用的 webapp 目录”?为了简单起见,我希望我的controllers
、models
和views
目录都在同一个位置。框架不应该让这件事变得困难(这是我第一次使用 Spring)。
严格来说,没有什么说他们需要加入webapp
(据我所知)。由 Servlet 规范支持的约定说它们确实应该如此。请参阅此答案:***.com/questions/19786142/…。虽然我想不出任何真正阻止您这样做的原因,但我不知道有多少人会为了方便而建议这样做。此外,根据您放置它们的位置,您可能必须修改容器的 classpath
才能读取它们。 IMO,所有的麻烦都超过了它的价值。
【参考方案1】:
通常在应用程序构建到战争时,它会在 src/main/webapp 中查找组件,您可以使用 maven 自定义项目结构来更改它。
How to configure custom maven project structure
最好将视图组件保留在 WEB-INF 中,因为它不可公开访问。
【讨论】:
阅读你链接到的 Q/A 让我不喜欢 maven,如果它真的那么不灵活的话。这是我第一次从事涉及 maven 的项目。【参考方案2】:当您使用 Thymeleaf 时,这很容易实现。我不确定 Jsps 是否有类似的解决方案。
您需要做的就是更改(或添加)一个模板解析器。 Thymeleaf 目前直接支持 ServletContextTemplateResolver 和 ClassLoaderTemplateResolver(如果我没记错的话,还有 FilepathTemplateResolver)。
所以你想要的是在 TemplateEngine 中声明的 ClassLoaderTemplateResolver:
<beans:bean id="classLoaderTemplateResolver"
class="org.thymeleaf.templateresolver.ClassLoaderTemplateResolver">
<beans:property name="prefix" value="views/" />
<beans:property name="suffix" value=".html" />
<beans:property name="templateMode" value="HTML5" />
<beans:property name="characterEncoding" value="UTF-8" />
<beans:property name="cacheable" value="$thymeleaf.template.cacheable" />
<beans:property name="order" value="0" />
</beans:bean>
<beans:bean class="org.thymeleaf.spring3.dialect.SpringStandardDialect"
id="thymeleafSpringDialect" />
<beans:bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
<beans:property name="templateResolvers">
<beans:set>
<beans:ref bean="classLoaderTemplateResolver" />
</beans:set>
</beans:property>
</beans:bean>
【讨论】:
我正在尝试将视图模板放入src/main/java/views
。您的示例似乎会将模板放在src/webapp/views
中。我可以将它们放在src/main/java/views
中吗?
ClassLoaderTemplateResolver 根据类路径解析。 src/main/java 文件夹下的每个“文件”都在类路径中。配置中的属性“prefix”是thymeleaf会查找模板的“包名”,所以src/main/java/views文件夹是正确的
其实我刚查过。模板不应位于 src/main/java 中,而应位于 src/main/resources 中。 Maven 将合并这些。【参考方案3】:
我认为,您不能这样做,因为将视图放在 webapp 文件夹之外意味着您将 Web 应用程序组件放在应用程序根目录之外,因为 src/main/webapp 是您的 Web 应用程序的根目录。
Web 服务器始终仅在 Web 应用程序根目录中部署 Web 应用程序组件。如果你把视图放在 webapp 之外,那么 web 服务器将不会部署它。
如果我错了,让我纠正。
【讨论】:
以上是关于如何将我的 src/main/webapp/WEB-INF/views 文件夹移出 src/main/webapp/?的主要内容,如果未能解决你的问题,请参考以下文章