views:

57

answers:

2

Hi,

I have a J2EE application with a web service which goes like

http://servername/service?task=getFile&id=25

How can I convert these type of urls to

http://servername/service/getFile/25
http://servername/service/getFile/26

etc?

Please provide your suggestions.

+2  A: 

You can use the UrlRewriteFilter in order to achieve this. You will just have to write the rules for rewriting, similar to mod_rewrite. For example:

<rule>
    <from>^/products/([0-9]+)$</from>
    <to>/products/index.jsp?product_id=$1</to>
</rule>
Bozho
This is a great solution and many thanks for suggesting it! Stil, I'm going for the Filter method to get a better understanding of it and ofcourse learn by coding it.
whoopy_whale
@whoopy_whale as the name suggests this is a `Filter` as well. It is open source, so you can view its code.
Bozho
+1  A: 

To the point, you thus want to forward the friendly URL to an unfriendly URL (so that you don't need to change existing request parameter collecting logic of the servlet) and to redirect the unfriendly URL to an friendly URL (so that the friendly URL get reflected in the browser address bar of the client).

The best place for this is a Filter. To access the HttpServletRequest, just downcast ServletRequest to HttpServletRequest. You can get the query string by getQueryString() and you can get the pathinfo by getRequestURI(). Here's a kickoff example:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException
{
    HttpServletRequest httpreq = (HttpServletRequest) request;
    String query = httpreq.getQueryString();
    if (query != null) {
        // Unfriendly URL invoked. Convert params to pathinfo and redirect.
        StringBuffer newURL = httpreq.getRequestURL();
        for (String param : query.split("&")) {
            newURL.append('/').append(param.substring(param.indexOf('=') + 1));
        }
        ((HttpServletResponse) response).sendRedirect(newURL.toString());
    } else {
        // Friendly URL invoked. Convert pathinfo to params and forward.
        String[] parts = httpreq.getRequestURI().replace(httpreq.getContextPath(), "").split("/");
        String newURL = String.format("%s?task=%s&id=%s", parts[1], parts[2], parts[3]);
        httpreq.getRequestDispatcher(newURL).forward(request, response);
    }
}

You can of course also grab the aforementioned UrlRewriteFilter.

BalusC
rightly explained :)
Bozho
Thanks a bunch for the help...But I'm having doubts on where to implement this logic. I can add this in the Servlet, but will the request ever reach here? If I give the friendly url directly, it will only give a 404 error,right?Upon giving the friendly url, how will the control go to the servlet(that process the url) directly?After all the friendly url mimics a directory strutcure. I should use the mod_rewrite for this,no?
whoopy_whale
Filter, I said Filter. Please read the introductory text as well and not only the code.
BalusC
I'm sorry. I jumped into an unnecessary conclusion.Its clear to me now. Meanwhile the UrlRewriteFilter also looks like a good solution. Thanks a lot!
whoopy_whale