如何将我的 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 目录”?为了简单起见,我希望我的controllersmodelsviews 目录都在同一个位置。框架不应该让这件事变得困难(这是我第一次使用 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/?的主要内容,如果未能解决你的问题,请参考以下文章

maven+tomcat调试下,如何做到不用每次都打包,而是直接启动服务就ok?

完整的WICKET6 HELLO WORKD WEBAPP

Z平台-源码包结构介绍

Z平台-源码包结构介绍

maven 如何给web项目添加jar包依赖

如何将“WEB-INF/lib”文件夹移动到 Java 动态 Web 应用程序中的子文件夹?