serve static resource using spring 3.0.0 and tomcat - spring

I need to expose some static content (xsd files that are required by the wsdl). I cannot use the mvn:resources since it is not available in Spring 3.0.0
I don't have an idea as to where the static content should go. Hope someone can help me.
In my web.xml i have
<servlet>
<servlet-name>Resources</servlet-name>
<servlet-class>org.springframework.web.servlet.ResourceServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Resources</servlet-name>
<url-pattern>/resources/*</url-pattern>
</servlet-mapping>
then in the webapp dir I added a resources dir with the static files.
% ls webapp
index.jsp META-INF resources WEB-INF
can someone tell me where the static content should go.
thanks much.

Dont forget this one aswell:
<!-- Allows for mapping the DispatcherServlet to "/" by forwarding static resource
requests to the container's default Servlet -->
<mvc:default-servlet-handler/>

You wrote
I cannot use the mvn:resources since it is not available in Spring 3.0.0
This is complete wrong!
mvn:resources is avaiable in Spring mvc namespace for version 3.0.0 3.0.4
See the xsd: http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

Related

Deploying a RAP .war file in jetty

I created an hello-world RAP application following the eclipse tutorial. I have no problems starting it in eclipse.
Now i want to package it as a .war file with maven and deploy it inside a jetty server. That's the point where i'm already unsure if it is the right approach.
My .war file includes all RAP, equinox and maven plugins, a web.xml and a config.ini. I'm building it with Tycho but i'm open to other solutions.
config.ini:
#Product Runtime Configuration File
osgi.bundles=RapHello/BasicEntryPoint#start,\
org.eclipse.core.commands#start,\
org.eclipse.core.jobs#start,\
org.eclipse.equinox.common#start,\
org.eclipse.equinox.console#start,\
org.eclipse.equinox.ds#start,\
org.eclipse.equinox.http.registry#start,\
org.eclipse.equinox.servletbridge.extensionbundle,\
org.eclipse.equinox.http.servlet#start,\
org.eclipse.equinox.http.servletbridge#start,\
org.eclipse.equinox.registry#start,\
org.eclipse.equinox.servletbridge#start,\
org.eclipse.equinox.util#start,\
org.eclipse.osgi.services#start,\
org.eclipse.rap.jface#start,\
org.eclipse.rap.rwt#start,\
org.eclipse.rap.rwt.osgi#start,\
raphello.BasicEntryPoint#start
osgi.bundles.defaultStartLevel=4
web.xml (copied from another sample .war):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app id="WebApp">
<servlet id="bridge">
<servlet-name>equinoxbridgeservlet</servlet-name>
<display-name>Equinox Bridge Servlet</display-name>
<description>Equinox Bridge Servlet</description>
<servlet-class>org.eclipse.equinox.servletbridge.BridgeServlet</servlet-class>
<!-- Framework Controls could be useful for testing purpose, but
we disable it per default -->
<init-param>
<param-name>enableFrameworkControls</param-name>
<param-value>false</param-value>
</init-param>
<!-- Enable multi-language support for the extension registry -->
<!-- the OSGi console is useful for trouble shooting but will fill up your
appserver log quickly, so deactivate on production use. Uncomment
the -console parameter to enabled OSGi console access. -->
<init-param>
<param-name>commandline</param-name>
<param-value>-registryMultiLanguage <!-- -console --></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>equinoxbridgeservlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
When i deploy the file in my jetty server, i get no errors and it seems like the file gets picked up, but all i get are
HTTP ERROR 404
Problem accessing /hellorap. Reason:
ProxyServlet: /hellorap
i think i tried all possible paths. What i read so far is, that the path should be the file name of my .war but that doesn't work.
jetty start log:
INFO::main: Logging initialized #276ms to org.eclipse.jetty.util.log.StdErrLog
INFO:oejs.Server:main: jetty-9.4.10.v20180503; built: 2018-05-03T15:56:21.710Z; git: daa59876e6f384329b122929e70a80934569428c; jvm 1.8.0_181-b13
INFO:oejw.StandardDescriptorProcessor:main: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
INFO:oejs.session:main: DefaultSessionIdManager workerName=node0
INFO:oejs.session:main: No SessionScavenger set, using defaults
INFO:oejs.session:main: node0 Scavenging every 600000ms
INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext#561b6512{/,file:///C:/Users/USR/AppData/Local/Temp/jetty-0.0.0.0-8081-raphello.war-_-any-511053963228532950.dir/webapp/,AVAILABLE}{webapps/raphello.war}
INFO:oejs.AbstractConnector:main: Started ServerConnector#2898ac89{HTTP/1.1,[http/1.1]}{0.0.0.0:8081}
INFO:oejs.Server:main: Started #4477ms
So the question is: What am i doing wrong? Is it even the right approach?
This answer doesn't seem to work so my error is propably at an earlier stage.

Idea tomcat run configuration cannot find xml files of spring

I am using local tomcat server run configuration in idea. My code works just fine if I deploy it to the server through manager. However if I run it on idea it gives the following error :
java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml]
I have this setting in web.xml :
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
I have my mvc-dispatcher-servlet.xml in src/main/webapp/WEB-INF folder. What could be causing this?
Spring MVC looks for a file named [servlet-name]-servlet.xml in the WEB-INF directory of your web application and creates the beans defined there, overriding the definitions of any beans defined with the same name in the global scope.
See this link
The file name must be mvc-dispatcher-servlet.xml and not mvc-dispather-servlet.xml.

Servlets in Maven

In the Maven Webapp project, I created the servlet DiaServlet in the root directory of the project, i.e., the directory where pom.xml is.
Its description in web.xml is as follows:
<servlet>
<servlet-name>DiaServlet</servlet-name>
<servlet-class>DiaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DiaServlet</servlet-name>
<url-pattern>/DiaServlet</url-pattern>
</servlet-mapping>
To this, I am getting the error:
java.lang.ClassNotFoundException: DiaServlet
One thing I tried is changing <servlet-class> tag to
<servlet-class>Prj.base.DiaServlet</servlet-class>
Here, Prj.base is the groupId of the project in the pom.xml file-- if this would be any concern(?)
<groupId>Dia.base</groupId>
The same servlet web.xml definition worked as is in a "non-Maven" web application.
When I created the servlet (I'm using NetScape), the servlet description wasn't added to the web.xml file although I'd checked to add it automatically.
Is this a problem of the build environment, or my servlet definition in web.xml (if so, how come the same definition worked in the other web application?) or something else?
new to Maven
TIA
You are a maven user, at the time of initialization of your project, you are giving package name as Dia.base, so your classes are resides in the Dia.base package only
So,
<servlet>
<servlet-name>DiaServlet</servlet-name>
<servlet-class>Dia.base.DiaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DiaServlet</servlet-name>
<url-pattern>/DiaServlet</url-pattern>
</servlet-mapping>
you need to give the fully qualified class name in the <servlet-class>

Forcing JBoss AS 7 to use static files from source (development) directory in Spring project

I want to speed up development cycle: read/write code, build, deploy, test by eliminating build and deploy stage for such file types:
CSS (.css)
JavaScript (.js)
images (.png, .jpg, .gif)
as CSS/JS/img are static files (does not require build stage) and I hope that JBoss can scan for file timestamp changes to update static file cache.
I have such code in web.xml:
<servlet>
<servlet-name>resources</servlet-name>
<servlet-class>org.springframework.web.servlet.ResourceServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>resources</servlet-name>
<url-pattern>/js/**</url-pattern>
<url-pattern>/css/**</url-pattern>
<url-pattern>/images/**</url-pattern>
</servlet-mapping>
So I need change it to something that also give full path to CSS/JS/imgs, like ~/devel/$proj/src/main/webapp. Also I think that static content may be served by JBoss itself instead of Spring.
As summary: how to configure Java EE project with JBoss AS 7 to serve static files from selected (in my case development) directory, while other files deployed as usual through .war file (I deploy by mvn -DskipTests=true package jboss-as:deploy)?
After spending 4 hours I make it work! But not in general case because solution based on new Spring 3.x series.
For general case solution you must implement own servlet, like this done n famous blog article: http://balusc.blogspot.com/2009/02/fileservlet-supporting-resume-and.html
I don't like to write code but like to configure already prebuild components!
So first I change request handler for all URL to org.springframework.web.servlet.DispatcherServlet:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Before I have:
<url-pattern>*.htm</url-pattern>
<url-pattern>*.xml</url-pattern>
so *.js, *.css, *.png files managed by default container (JBoss) servlet and any options further have no effect...
Next I use Spring 3.0 features <mvc:resources> (xmlns:mvc="http://www.springframework.org/schema/mvc") and file: resource type:
<mvc:resources mapping="/css/**" location="file:/home/user/devel/proj/src/main/webapp/css/"/>
<mvc:resources mapping="/images/**" location="file:/home/user/devel/proj/src/main/webapp/images/"/>
<mvc:resources mapping="/js/**" location="file:/home/user/devel/proj/src/main/webapp/js/"/>
Any time I save .js or .css file and refresh web-page in browser I get new content!
So reduce static content deploy time from 2 minute to 1 second!!!
UPDATE After switching to Tomcat 7 I configure context /opt/apache-tomcat-7.0.40/conf/Catalina/localhost/CTXNAME.xml:
<Context docBase="/home/user/devel/proj-dev/src/main/webapp"
reloadable="true">
<Resources className="org.apache.naming.resources.VirtualDirContext"
extraResourcePaths="/WEB-INF/classes=/home/user/devel/proj-dev/target/classes,/WEB-INF/lib=/home/user/devel/proj-dev/target/proj/WEB-INF/lib"/>
<Loader className="org.apache.catalina.loader.VirtualWebappLoader"
virtualClasspath="/home/user/devel/proj-dev/target/classes;/home/user/devel/proj-dev/target/proj/WEB-INF/lib"/>
<JarScanner scanAllDirectories="true"/>
</Context>
according to:
http://tomcat.apache.org/tomcat-7.0-doc/config/context.html
http://tomcat.apache.org/tomcat-7.0-doc/config/resources.html
http://tomcat.apache.org/tomcat-7.0-doc/config/loader.html
Now JS/CSS/JSP files update by F5 in browser. In order to use new .class invoke mvn compile. To bootstrap invoke mvn package

How to access css file with Tomcat 6 and Spring 3.0.4

I try to access css file by:
<link rel="stylesheet" href="META-INF/resources/css/style.css" />
Structure:
springhibernate
-META-INF
-recources
-css
-style.css
-img
-WEB-INF
-classes
-jsp
web.xml
application-context.xml
web.xml part:
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
How can I refer to a css file?
The META-INF directory is not accessible using an URL according to the specification. It's purpose is to hold information useful to Java archive tools, xml descriptors, etc.
Create separate top-level directory in your .war file to serve CSS, Javascript, HTML, etc. files.
Note: you can access everything in META-INF in your Java code, using ServletContext's getResource and getResourceAsStream calls. The limititation is that it cannot be referenced with a URL.

Resources