Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从Vaadin/Spring应用程序提供静态资源?_Java_Spring_Resources_Vaadin - Fatal编程技术网

Java 如何从Vaadin/Spring应用程序提供静态资源?

Java 如何从Vaadin/Spring应用程序提供静态资源?,java,spring,resources,vaadin,Java,Spring,Resources,Vaadin,我有一个Vaadin web应用程序,它与spring security集成用于身份验证。Vaadin servlet的配置非常简单: <servlet> <servlet-name>Vaadin Application Servlet</servlet-name> <servlet-class>com.example.SpringApplicationServlet</servlet-class> <i

我有一个Vaadin web应用程序,它与spring security集成用于身份验证。Vaadin servlet的配置非常简单:

<servlet>

    <servlet-name>Vaadin Application Servlet</servlet-name>
    <servlet-class>com.example.SpringApplicationServlet</servlet-class>
    <init-param>
        <param-name>applicationBean</param-name>
        <param-value>mainApplication</param-value>
    </init-param>
    <init-param>
        <param-name>widgetset</param-name>
        <param-value>com.example.widgetset.CustomWidgetSet</param-value>
    </init-param>

</servlet>

<servlet-mapping>
    <servlet-name>Vaadin Application Servlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

Vaadin应用程序Servlet
com.example.SpringApplicationServlet
应用程序bean
主要应用
widgetset
com.example.widgetset.CustomWidgetSet
Vaadin应用程序Servlet
/*
servlet初始化Spring上下文并返回Vaadin应用程序。我还为此配置了安全性,并按如下方式配置了自定义登录表单:

<servlet>
    <servlet-name>login</servlet-name>
    <jsp-file>/jsp/login.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>


<servlet>
    <servlet-name>login_error</servlet-name>
    <jsp-file>/jsp/loginError.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>login_error</servlet-name>
    <url-pattern>/login_error</url-pattern>
</servlet-mapping>

登录
/jsp/login.jsp
登录
/登录
登录错误
/jsp/loginError.jsp
登录错误
/登录错误
登录表单是用外部css设计的,还有一些图像。基本上,图像位于/jsp/img中,样式表位于/jsp/login.css中。因此,战争结构看起来像:

  • /jsp
  • /META-INF
  • /瓦丁
  • /WEB-INF
图像和css都不会被加载,因为显然所有这些请求都映射到了vaadin servlet。我如何定义一些静态资源目录,而vaadinservlet不会提供这些资源?我尝试了SpringMVC:resources,但没有成功。谢谢你的帮助

再见, 菲利普


我已经弄明白了。虽然这是一个解决办法。我已经将Vaadin应用程序Servlet映射到像/app/*这样的东西,而不是映射到/*(请记住,在本例中,您还必须将同一个Servlet映射到/Vaadin/*)。通过这种配置,我可以从我的webapp访问jsp目录,一切正常。我已经删除了整个Spring资源配置,因为这根本不起作用


所以再一次,我仍然对这个解决方案不太满意,我更愿意用其他方式配置我的资源目录,但客户很高兴:)。如果有人找到了正确的解决方案,我将不胜感激。

使用url重写过滤器可以更好地控制url映射

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

URL重写过滤器
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
URL重写过滤器
/*
然后将Vaadin应用程序映射到/Vaadin,并在urlrewrite.xml中配置url映射

 <rule>
    <from>/styles/**</from>
    <to last="true">/styles/$1</to>
 </rule>
 <rule>
    <from>/images/**</from>
     <to last="true">/images/$1</to>
 </rule>
 <rule>
    <from>/**</from>
    <to>/vaadin/$1</to>
 </rule>
 <outbound-rule>
    <from>/vaadin/**</from>
     <to>/$1</to>
 </outbound-rule>   

/风格/**
/款式/$1
/图像/**
/图片/$1
/**
/瓦丁/1美元
/瓦丁/**
/$1
编辑
另一个选项是将静态文件放在/VAADIN/目录中。

我已经解决了这个问题。虽然这是一个解决办法。我已经将Vaadin应用程序Servlet映射到像/app/*这样的东西,而不是映射到/*(请记住,在本例中,您还必须将同一个Servlet映射到/Vaadin/*)。通过这种配置,我可以从我的webapp访问jsp目录,一切正常。我已经删除了整个Spring资源配置,因为这根本不起作用


所以再一次,我仍然对这个解决方案不太满意,我更愿意用其他方式配置我的资源目录,但是c可能会迟到,但是对于那些在使用vaadin
/*
映射时仍然无法提供静态内容的人来说,我找到的解决方案是使用apache的默认servlet
org.apache.catalina.servlets.DefaultServlet
,因此web.xml将有如下内容:


myservlet
com.vaadin.server.VaadinServlet
用户界面
com.ex.myprj.MyUI
widgetset
com.ex.myprj.AppWidgetSet
myservlet
/*
静态内容Servlet
org.apache.catalina.servlets.DefaultServlet
调试
0
列表
假的
1.
静态内容Servlet
/顾客/*

因此,在上面的示例中,尽管vaadin位于
/*
,但是
/customer/*
部分将由
DefaultServlet

作为静态内容使用
SpringApplicationServlet
扩展了什么类?它扩展了com.vaadin.terminal.gwt.server.AbstractApplicationServlet尝试使用URL映射()或静态资源()的映射。使用更新此主题的一些主要更改。请参阅LeifÅstrand的这篇2018-07 Vaadin.com博客文章,了解关于放置静态资源的旧方法和新方法,以及Servlet 2和Servlet 3规范之间的关系的一些精彩解释。这不起作用,因为它只转换URL请求。我确实需要一些servlet来支持这些静态资源。更不用说,那些规则是不正确的。不过还是谢谢你。