2012-02-15 95 views
3

我有Vaadin Web应用程序与春季安全集成进行身份验证。 Vaadin servlet的配置非常简单:如何从Vaadin/Spring应用程序提供静态资源?

<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> 

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> 

登录表单样式与外部CSS和也有一些图像。基本上,图像位于/ jsp/img中,而样式表位于/jsp/login.css中。所以WAR结构如下:

  • /JSP
  • /META-INF
  • /VAADIN
  • /WEB-INF

无论是图像还是CSS被加载,因为显然所有这些请求都映射到vaadin servlet。我如何定义一些静态资源目录,这些目录不会由Vaadin servlet提供?我已经尝试过春季mvc:资源,但没有奏效。感谢您的帮助。

再见, 菲利普

我已经想通了这一点。虽然这是一种解决方法。我已将Vaadin应用程序Servlet映射到/ app/*而不是/ *(请记住,在这种情况下,您还必须将相同的servlet映射到/ VAADIN/*)。有了这个配置,我可以从我的web应用程序访问jsp目录,一切正常。我已经删除了整个Spring资源配置,因为这只是不起作用。

那么一次,我还是漂亮不漂亮这个解决方案舒适,宁愿让我的资源目录配置其他办法,但客户端是快乐:)。如果任何人有正确的解决方案,我将不胜感激地阅读它。

+0

“SpringApplicationServlet”扩展了哪些类? – 2012-02-15 11:35:46

+0

它扩展了com.vaadin.terminal.gwt.server.AbstractApplicationServlet – 2012-02-15 13:18:25

+0

尝试使用URL映射([Servlet mapping/vs /*](http://stackoverflow.com/a/4140659/267197))或静态映射资源([Servlet for serving static content](http://stackoverflow.com/a/3582215/267197))。 – 2012-02-18 23:22:55

回答

3

使用一个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> 

然后映射Vaadin应用程序/ vaadin例如,配置URL马平在urlrewrite.xml

<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> 

编辑 另一种选择是把静态文件/ VAADIN /目录。

+0

这不起作用,因为它仅翻译URL请求。我肯定需要一些服务于这个静态资源的servlet。更何况,这些规则是不正确的。不过谢谢你。 – 2012-02-15 14:00:03

1

我已经想通了。虽然这是一种解决方法。我已将Vaadin应用程序Servlet映射到/ app/*而不是/ *(请记住,在这种情况下,您还必须将相同的servlet映射到/ VAADIN/*)。有了这个配置,我可以从我的web应用程序访问jsp目录,一切正常。我已经删除了整个Spring资源配置,因为这只是不起作用。

那么一次,我还是漂亮不漂亮这个解决方案舒适,宁愿让我的资源目录配置的其他方式,但C

0

可能会晚点,但对于谁是仍然有提供静态内容的问题同时采用vaadin /*映射,我发现这是使用Apache的默认的servlet org.apache.catalina.servlets.DefaultServlet的解决方案,所以web.xml将有类似:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
    id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 

    <servlet> 
    <servlet-name>myservlet</servlet-name> 
    <servlet-class>com.vaadin.server.VaadinServlet</servlet-class> 
    <init-param> 
     <param-name>UI</param-name> 
     <param-value>com.ex.myprj.MyUI</param-value> 
    </init-param> 
    <!-- If not using the default widget set--> 
    <init-param> 
     <param-name>widgetset</param-name> 
     <param-value>com.ex.myprj.AppWidgetSet</param-value> 
    </init-param> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>myservlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

    <servlet> 
    <servlet-name>Static content Servlet</servlet-name> 
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> 
    <init-param> 
     <param-name>debug</param-name> 
     <param-value>0</param-value> 
    </init-param> 
    <init-param> 
     <param-name>listings</param-name> 
     <param-value>false</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Static content Servlet</servlet-name> 
    <url-pattern>/customer/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

所以在上面的例子中,尽管在有vaadin部分将作为静态内容由DefaultServlet