Using Jsp in a Jersey JAX-RS RESTful application
Posted: décembre 29th, 2011 | Author: usul | Filed under: Dev, Glassfish, Java, Java EE, JAX-RS, Jersey, Tools, Tutorial | Tags: EJB, Glassfish, Java, Java EE, JAX-RS, Jersey, jsp, RESTful, Tips, Tutorial, view, web | 4 Comments »So, ok we could easily produce some RESTful applications with Jersey.
But sometimes, the output could be very big to put in a method and a template could be useful.
Jersey provides MVC support for JSP pages.
There is a JSP template processor that resolves absolute template references to processable template references that are JSP.
1 – Configure web.xml
<filter> <filter-name>jersey</filter-name> <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>com.ezakus.web</param-value> </init-param> <init-param> <param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name> <param-value>/WEB-INF/jsp</param-value> </init-param> <init-param> <param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name> <param-value>/(resources|(WEB-INF/jsp))/.*</param-value> </init-param> </filter> <filter-mapping> <filter-name>jersey</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Instead of a servlet mapping you need to have a filter.
With the JSPTemplatesBasePath param, you choose your jsp folder
<param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name> <param-value>/WEB-INF/jsp</param-value>
And with the WebPageContentRegex you are able to serve static resources.
In the previous example, static resources are on the /resources/ or /WEB-INF/jsp/ path but you can put what you want :
<param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name> <param-value>/(resources|js|css|images)/.*</param-value>
2 – Return Viewable or Response
Now you can use the Viewable class with your jsp path
package com.ezakus.web;
import javax.ejb.Stateless;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import com.sun.jersey.api.view.Viewable;
@Stateless
@Path("/")
public class MyController {
@GET
@Produces("text/html")
public Viewable index() {
return new Viewable("/index");
}
}
Note : /index assume that you have a /WEB-INF/jsp/index.jsp on your path
You can also use the Response class
package com.ezakus.web;
import javax.ejb.Stateless;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import com.sun.jersey.api.view.Viewable;
@Stateless
@Path("/")
public class MyController {
@GET
@Produces("text/html")
public Response index() {
return Response.ok(new Viewable("/index")).build();
}
}
3 – Using Viewable’s model
The Viewable object could be created with a model :
package com.ezakus.web;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.Stateless;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import com.sun.jersey.api.view.Viewable;
@Stateless
@Path("/")
public class MyController {
@GET
@Produces("text/html")
public Response index() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("user", "usul");
List<String> l = new ArrayList<String>();
l.add("light saber");
l.add("fremen clothes");
map.put("items", l);
return Response.ok(new Viewable("/cart", map)).build();
}
}
Note : Jersey will assign the model instance to the attribute « it » in the jsp. (Yes, life is hard)
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@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>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${it.user}!</h1>
<p>
items in your cart :<br />
<c:forEach var="item" items="${it.items}">
${item}<br />
</c:forEach>
</p>
</body>
</html>