问题
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
- create resources folder inside /WebContent folder & outside /WebContent/WEB-INF. So my Application structure would be like below.
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/>
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