有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个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>

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。因此,战争结构看起来像:

  • /jsp
  • /META-INF
  • /瓦丁
  • /WEB-INF

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

再见, 菲利普

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

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


共 (3) 个答案

  1. # 1 楼答案

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

    所以再一次,我仍然对这个解决方案不太满意,我更愿意用另一种方式配置我的资源目录,但是c

  2. # 2 楼答案

    使用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,并在URLRewite中配置url映射。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/目录中

  3. # 3 楼答案

    可能已经晚了,但是对于那些在使用vaadin/*映射时仍然无法提供静态内容的人来说,我找到的解决方案是使用apache的默认servletorg.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,但是/customer/*部分将被DefaultServlet用作静态内容