SRobertJames
SRobertJames

Reputation: 9208

Java Servlet - Mapping a servlet to every URL but a string

I have a servlet configured to handle all URLs (*):

<servlet>
    <servlet-name>MyServ</servlet-name>
    <servlet-class>MyServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>MyServ</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

I need that for URLS beginning with /static/, it should serve them from the static WEB-INF. That is, MyServ should serve everything but /static.

How can I do that?


UPDATE: To clarify, what I'd like is:

/*/ - Goes to MyServ
/static/dir/file.css - Jetty serves the static file.css from the /dir/.

I'm not sure what web.xml to do, or where to put the static files.

I tried adding this:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

But, when I go to a /static/ URL, I just get:

HTTP ERROR 404

Problem accessing /static/dir/file.css. Reason: 
    Not Found

Powered by Jetty://

I'm not sure if my web.xml is wrong, or if I'm simply putting the files in the wrong place (I've tried under src/main/webapp and src/main/webapp/lib/META-INF/resources/)


Jetty

I am using Jetty. I want to avoid any other layers, such as Nginx, Apache, etc.

To win the bounty, please make sure you answer works for Jetty.

Upvotes: 11

Views: 2374

Answers (6)

Srinivasu
Srinivasu

Reputation: 1235

Your problem can by solved using the Nginx. Nginx serves static content HTML files, images (.jpg, .png, .gif), stylesheets (.css) and JavaScript (.js). These files need not to be processed by the web server. Nginx will do this job.

server {
  listen          80;
  server_name     YOUR_DOMAIN;
  root            /PATH/TO/YOUR/WEB/APPLICATION;
  location / {
    index index.jsp;
  }
  location ~ \.jsp$ {
    proxy_pass              http://localhost:8080;
  }
  location ^~/servlets/* {
    proxy_pass              http://localhost:8080;
  }
}

Upvotes: 4

Sanjay Bharwani
Sanjay Bharwani

Reputation: 4759

Based on my experience (as already suggested by Srinivasu Talluri), reverse proxy is the answer to your problem.

You could use Nginx See detail configuration or configure Apache to work as reverse proxy.

Detail configuration for serving static content thru Nginx could be find here

When static contents will be handled by the web server itself, then your servlet configuration could be used as is. Thus your servlet will serve only the dynamic resources.

Hope it helps.

Upvotes: 0

sudhir patel
sudhir patel

Reputation: 11

Simply put your static content into webapp Directory. That part can be directly access. using localhost:port/yourAppName/ResourceName

Upvotes: 1

BK Batchelor
BK Batchelor

Reputation: 457

First, files that are located in "WEB-INF" directory aren't directly web accessible.

Also, I noticed that your entry "src/main/webapp/lib/META-INF/resources/" does not include a extracted WAR directory, aka web application folder.

Example: src/main/webapp/[WAR folder]/lib/META-INF/resources/

I assumed that you are using Tomcat. So, after you create your WAR file drop it into "webapp" directory, then start Tomcat. The WAR file should extract into a web application folder of the same name as the WAR file. Now from a browser you should has access to any files outside of "WEB-INF".

example: localhost:8080/[web app folder name]/[some file]

Hope this helps,

Upvotes: 1

Sariq Shaikh
Sariq Shaikh

Reputation: 1124

To serve static content you dont even need to have a servlet. You can put your static content in a folder which is directly accessible through your server.

For example if your application name is TestApp than you can place your content in TestApp/static/dir directory. Based on that your directory structure would be :

TestApp
   |
   |_____ WEB-INF
   |
   |_____ static
             |
             |____ dir

By doing above directory structure all your static content e.g. Sample.css will be accessible through below URL:

/TestApp/static/dir/Sample.css

Please look at this question for more information How to serve static content from tomcat

Note that by doing this your static directory will be open to everyone without any restriction which means anyone will be able to access your static content without any authentication. But as its your static content I guess its fine unless you have any reason for it.

Upvotes: 3

zebediah49
zebediah49

Reputation: 7611

Your best bet is probably to have a rule for static that occurs before the rule for *.

Rule for URL path mapping:

It is used in the following order. First successful match is used with no further attempts.

  1. The container will try to find an exact match of the path of the request to the path of the servlet. A successful match selects the servlet.
  2. The container will recursively try to match the longest path-prefix. This is done by stepping down the path tree a directory at a time, using the ’/’ character as a path separator. The longest match determines the servlet selected.
  3. If the last segment in the URL path contains an extension (e.g. .jsp), the servlet container will try to match a servlet that handles requests for the extension. An extension is defined as the part of the last segment after the last ’.’ character.
  4. If neither of the previous three rules result in a servlet match, the container will attempt to serve content appropriate for the resource requested. If a “default” servlet is defined for the application, it will be used.

So it will match the rule for /static/, and stop there.

Upvotes: 5

Related Questions