How to serve static resources using Spring's mvc:resources on WebLogic?

我只是一个虾纸丫 提交于 2020-04-30 12:18:23

问题


We have a web app that works beautifully on tomcat, but fails to run on a latest weblogic cause of static resource loading issues - basically we serve all resources from /static/** and have set this up in the spring servlet xml file like this:

<mvc:resources mapping="/static/**" location="/static/" />

This works on tomcat, but on weblogic you simply see an ugly page as all CSS/JS/jpgs within the static directoty cannot be found.

I played with this, too:

<mvc:default-servlet-handler />

I placed it once at the end of the spring config and at the beginning, but no result...

How to serve our static resources?


回答1:


for a start I would check 2 things. First as I am not a Spring user I am not sure what method spring uses to find and load the files and if it uses getRealPath you could try enabling this in weblogic.

In admin console you click in the domain name, web applications and down the page(last option) you will find a checkbox to enable getRealPath to work even when your app is packaged in a .war or .ear file. You will need to restart the servers for your domain for this configuration to take effect.

If this does not fix your problem you could try mapping the static files using weblogic.xml file.

You will have to use the weblogic tags like:

<wls:virtual-directory-mapping>
<wls:local-path>/var/docs/weblogic</wls:local-path>
<wls:url-pattern>/static/*</wls:url-pattern>
</wls:virtual-directory-mapping>

In the example above you would have a file under fisic disc path /var/docs/weblogic suppose it is named myfile.css to be loaded correctly by the complete url: http://seudominio.com/static/myfile.css or using the relative path /static/myfile.css

I believe one of these approaches could help you.

regards.




回答2:


For my Spring MVC I have below platform and that works quite well for static resources like CSS or JS.

Platform

  • Spring MVC 4.2.0
  • Hibernate 4.2.20
  • Weblogic 10.3.6
  • Eclipse

    1. create resources folder inside /WebContent folder & outside /WebContent/WEB-INF. So my Application structure would be like below.

  1. In the front controller config XML file i.e. dispatcher-config.xml should be as below.

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-4.2.xsd 
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-4.2.xsd 
       http://www.springframework.org/schema/mvc 
       http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
       http://www.springframework.org/schema/aop  
       http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
       http://www.springframework.org/schema/tx  
       http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
    
    <!-- default page to show when app starts -->
    <mvc:view-controller path="/" view-name="Home"/>
    
    <!-- essentially sets you your Spring context to allow for dispatching requests to Controllers --> 
    <mvc:annotation-driven />
    
    <!-- used to load static resources like css, js etc... -->
    <mvc:default-servlet-handler/>  
    
    <!-- automatically wire values into properties, methods, and constructors. -->
    <context:annotation-config/>
    
    <!-- scan for components like @Controller, @Repository, @Service, @Component etc...-->
    <context:component-scan base-package="au.com.snh" />
    
    <!-- spring view resolver bean -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
    
    <!-- load database properties file -->
    <context:property-placeholder location="classpath:database.properties"/>
    
     <!-- declare beans -->
    <bean id="regionDao" class="au.com.snh.dao.RegionDaoImpl" />
    <bean id="regionService" class="au.com.snh.service.RegionServiceImpl" />
    
    <!-- declare datasource bean -->  
     <bean id="dataSource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <property name="driverClassName" value="${db.driver}" />  
        <property name="url" value="${db.url}" />
        <property name="username" value="${db.user}" />  
        <property name="password" value="${db.pwd}" />  
     </bean>
    
     <!-- hibernate -->
     <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="au.com.snh.model" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>  
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> 
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
            </props>
        </property>
     </bean>
    
     <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
     </bean>
    
     <tx:annotation-driven transaction-manager="transactionManager"/>
    
    <!-- resource bundles -->
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename"  value="/WEB-INF/propertybundle/common"/>     
    </bean>
    


In above config file notice below 2 tags are important for static content i.e css

<mvc:annotation-driven />
<mvc:default-servlet-handler/>  
  1. I have included the CSS file in my JSP as below.

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Welcome to the World of Spring MVC</title>   
        <link rel="stylesheet" href="/${initParam.appRootPath}/resources/css/main.css">
    </head>
    <body>
        <center>
            <h1>Welcome to the World of Spring MVC 4.2 & Hibernate 4.2 </h1>
        </center>
    </body>
    </html>
    

FYI, I have also included here my web.xml

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

      <!-- global variables -->
      <context-param>
        <param-name>appRootPath</param-name>
        <param-value>SpringMVCHibernateProject</param-value>
      </context-param>

      <!-- front controller  -->
      <servlet>
        <servlet-name>spring-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
         <init-param>
             <param-name>contextConfigLocation</param-name>
             <param-value>/WEB-INF/dispatcher-config.xml</param-value>
         </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>

      <servlet-mapping>
        <servlet-name>spring-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping> 


    </web-app>

Hopefully my post would be useful.

Thanks - Hitesh



来源:https://stackoverflow.com/questions/8038834/how-to-serve-static-resources-using-springs-mvcresources-on-weblogic

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!