客户端脚本常常引用外部资源(如图像、电影和外部页面)来增强用户界面。常见的示例是预先加载图像以使交换图像更有效的JavaScript。以下是一个示例:
<script>
function preloadImages(){
var menuImage =
new Image();
menuImage.src = "images/icon.gif";
var menuImageDark=new Image();
menuImageDark.src = "images/icon.gif";
}
</script>
客户端脚本中的URL必须根据JSR-168规范进行重写。这些脚本必须在JSP或JSP-168 portlet类中,以便调用重写API的URL。它们不能在单独的JavaScript (.js)文件中。以下是一个包含URL重写的适当名称空间脚本在JSR-168 portlet中看起来的样子:
<script>
function <portlet:namespace/>preloadImages(){
var menuImage = new Image();
menuImage.src = "<%=renderResponse.encodeURL(renderRequest.getContextPath()+ "images/icon.gif")%>";
var menuImageDark= new Image();
menuImageDark.src = "<%=renderResponse.encodeURL(renderRequest.getContextPath()+ "images/icon_dark.gif") %>";
}
</script>
根据JSR-168规范,“portlet必须使用RenderResponse接口的setContentType方法设置响应的内容类型”。没有显式设置其内容类型的portlet仍然会成功获得编译。但WebLogic Portal不会执行没有设置其内容类型的portlet。确保您的portlet设置了其内容类型。
以下示例演示了一个正确设置其内容类型的portlet:
public class MyPortlet extends GenericPortlet {
public void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.println("I set my content type!
");
}
}
此示例是不正确的,但仍将获得编译:
public class MyPortlet extends GenericPortlet {
public void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
// no content type set!
PrintWriter writer = response.getWriter();
writer.println("I did NOT set my content type!
");
}
}
