ResourceServingPortlet是从Portlet 2.0才引入的接口,如果使用了它,就没有必要使用servlet来处理资源或者处理Ajax请求了。
- public abstract interface ResourceServingPortlet
- {
- public abstract void serveResource(ResourceRequest paramResourceRequest, ResourceResponse paramResourceResponse)
- throws PortletException, IOException;
- }
这个接口可以让Portlet容器来处理和资源相关的请求。值得一提的是,这个ResourceResponse可以让Portlet容器渲染jsp页面,也可以渲染二进制内容。
还有一点非常非常重要:就是当一个resource请求到达某个Portlet时候,Portlet容器会调用这个Portlet的serveResource方法,但是这个Portlet的render方法,乃至同一个Portal 页面上的所有的其他的Portlet的render方法都不会被调用。
步骤1: 首先在Portlet中定义一个resource,这里我们给了一个resourceURL,因为GenericPortlet已经实现了 ResourceServingPortlet,所以这里无需显示的实现它而且可以直接使用serveResource方法
- public class DateTimePortlet extends GenericPortlet {
- @RenderMode(name = "view")
- public void showHomePage(...)... {
-
//创建一个ResourceURL,他将会在页面上被点击链接事件所使用到 - ResourceURL dateTimeResourceURL = response.createResourceURL();
//给这个ResourceURL赋值唯一的资源ID - dateTimeResourceURL.setResourceID("dateTime");
- //将这个resourceURL放在RenderRequest的属性上
- request.setAttribute("dateTimeResourceURL", dateTimeResourceURL);
- getPortletContext().getRequestDispatcher(
- //请求分发到页面来渲染
- response.encodeURL("/WEB-INF/jsp/home.jsp")).
- include(request, response);
- }
- ...
- }
步骤2:然后在这个Portlet中定义一个事件处理函数,来响应从页面发来的Ajax请求
- public class DateTimePortlet extends GenericPortlet {
- @RenderMode(name = "view")
- public void showHomePage(...)... {
- }
- ...
- public void serveResource(...)...{
- OutputStream outStream
- = response.getPortletOutputStream();
- StringBuffer buffer = new StringBuffer();
- if (request.isUserInRole("User")) {
- SimpleDateFormat sdf = new SimpleDateFormat(
- "dd-MMM-yyyy hh:mm:ss a");
- buffer.append("Hello World (<i> "
- + sdf.format(new Date())+ " </i>)");
- } else {
- buffer.append("<font color=\"red\"> You are not authorized to view server date/time");
- }
- outStream.write(buffer.toString().getBytes());
- }
- }
本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/847686,如需转载请自行联系原作者