La verdad es que no estoy tratando de reinventar la rueda, solo trato de que mi framework (java) este up to date. Hace un tiempo un ex-coworker me conto sobre el MOD_REWRITE Apache Webserver para tener urls un poco mas elegantes que algo como esto (q?u=w2&a=w3&…). Segun el (experto) son muchos mejores para los spiders que indexan paginas y mas atractivas para los usuarios que las leen.
Como mi fuerte es Java y no PHP decidi hace mi propia version de MOD_REWRITE. Primero antes de poner una linea de codigo obviamente googlee un poco para ver que habia y me encontre con un snippet escrito por Paul Tuckey aca. Paul hizo un laburo excelente, pero era demasiado para mi aplicacion, yo necesitaba algo mucho mas simple entonces tome los conceptos de su software y los aplique al mio.

1. Lo primero que pense fue que deberia haber una referencia entre la URL nice looking y la URL real de la pagina con contenido dinamico que queremos mostrar. En mi caso era un Blog software, por lo cual agregue a mi tabla POST un campo nuevo llamado title_url.

2. Ahora era el turno de algun tipo de Facade entre la URL virtual y la real, para eso utilice un Servlet Filter. Aca el codigo:

public class PostFilter implements Filter {

private Map<String, String> cache;
private Pattern pattern;

/**
* Inits the class
*/
public void init(FilterConfig config) throws ServletException {
this.cache = new HashMap<String, String>();
this.pattern = Pattern.compile(“/post/(?!images|myservlet)”);  // the regex string to filter all /post/* requests
}

/**
* Main filter method
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
HttpServletRequest req = (HttpServletRequest) request;
String uri = req.getRequestURI();
if (this.match(uri)) {
String titleUrl = uri.substring(uri.lastIndexOf(‘/’) 1, uri.length());
String url = null;
if (cache.containsKey(titleUrl)) {
url = cache.get(titleUrl);
} else {
url = this.createUrlForPost(titleUrl);
}
req.getRequestDispatcher(url).forward(request, response);
return;
}
chain.doFilter(request, response);
} catch (Exception e) {
e.printStackTrace();
response.getWriter().write(“ERROR”);
}
}

/**
* Returns the real url for this post
* @param titleUrl
* @return
* @throws Exception
*/
private String createUrlForPost(String titleUrl) throws Exception {
String postId = this.queryPostIdByTitleUrl(titleUrl);
String url = “../myservlet?key=value&key1=value1&etc,etc&id=” postId;
this.cache.put(titleUrl, url);
return url;
}

/**
* Match if the url is part of a post
* @param uri
* @return
*/
private boolean match(String uri) {
Matcher matcher = pattern.matcher(uri);
boolean found = false;
while (matcher.find()) {
found = true;
}
return found;
}

/**
* Inits the class
*/
private void queryPostIdByTitleUrl(String titleUrl) throws Exception {
// some code to access to the field of the database
return postid;
}

3. Ahora el siguiente paso es poner el filtro en el web.xml.

<filter>
<filter-name>PostFilter</filter-name>
<filter-class>PostFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>PostFilter</filter-name>
<url-pattern>/post/*</url-pattern>
</filter-mapping>

4. No hay mas que eso. Que lo disfruten :)