📄 renderresponseimpl.java
字号:
/* * @author <a href="mailto:novotny@gridsphere.org">Jason Novotny</a> * @version $Id: RenderResponseImpl.java 4988 2006-08-04 09:57:48Z novotny $ */package org.gridsphere.portlet.impl;import org.gridsphere.services.core.user.User;import javax.portlet.PortletURL;import javax.portlet.RenderResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Locale;import java.util.SortedSet;/** * The <CODE>RenderResponse</CODE> defines an object to assist a portlet in * sending a response to the portal. * It extends the <CODE>PortletResponse</CODE> interface to provide specific * render response functionality to portlets.<br> * The portlet container creates a <CODE>RenderResponse</CODE> object and * passes it as argument to the portlet's <CODE>render</CODE> method. * * @see javax.portlet.RenderRequest * @see javax.portlet.PortletResponse */public class RenderResponseImpl extends PortletResponseImpl implements RenderResponse { protected String contentType = null; // needed as servlet 2.3 does not have a response.getContentType protected boolean hasWriter = false; protected boolean hasOutputStream = false; /** * Constructs an instance of SportletResponse using an * <code>HttpServletResponse</code> as a proxy * * @param req the <code>HttpServletRequest</code> * @param res the <code>HttpServletResponse</code> */ public RenderResponseImpl(HttpServletRequest req, HttpServletResponse res) { super(req, res); } // Jakarta Pluto method private String stripCharacterEncoding(String type) { int xs = type.indexOf(';'); String strippedType; if (xs == -1) { strippedType = type; } else { strippedType = type.substring(0, xs); } return strippedType.trim(); } /** * Returns the MIME type that can be used to contribute * markup to the render response. * <p/> * If no content type was set previously using the {@link #setContentType} method * this method retuns <code>null</code>. * * @return the MIME type of the response, or <code>null</code> * if no content type is set * @see #setContentType */ public String getContentType() { // in servlet 2.4 we could simply use this: // return this._getHttpServletResponse().getContentType(); return contentType; } /** * Creates a portlet URL targeting the portlet. If no portlet mode, * window state or security modifier is set in the PortletURL the * current values are preserved. If a request is triggered by the * PortletURL, it results in a render request. * <p/> * The returned URL can be further extended by adding * portlet-specific parameters and portlet modes and window states. * <p/> * The created URL will per default not contain any parameters * of the current render request. * * @return a portlet render URL */ public PortletURL createRenderURL() { PortletURLImpl portletURL = new PortletURLImpl(req, (HttpServletResponse) this.getHttpServletResponse(), true); portletURL.setRender(""); return portletURL; } /** * Creates a portlet URL targeting the portlet. If no portlet mode, * window state or security modifier is set in the PortletURL the * current values are preserved. If a request is triggered by the * PortletURL, it results in an action request. * <p/> * The returned URL can be further extended by adding * portlet-specific parameters and portlet modes and window states. * <p/> * The created URL will per default not contain any parameters * of the current render request. * * @return a portlet action URL */ public PortletURL createActionURL() { PortletURLImpl portletURL = new PortletURLImpl(req, this.getHttpServletResponse(), false); portletURL.setAction(""); return portletURL; } /** * The value returned by this method should be prefixed or appended to * elements, such as JavaScript variables or function names, to ensure * they are unique in the context of the portal page. * * @return the namespace */ public String getNamespace() { // this is done due to an issue with MyFaces using getNamespace String pid = ((String) req.getAttribute(SportletProperties.PORTLETID)).replace('#', '_'); return "gridsphere_" + pid + "_" + (String) req.getAttribute(SportletProperties.COMPONENT_ID); } /** * This method sets the title of the portlet. * <p/> * The value can be a text String * * @param title portlet title as text String or resource URI */ public void setTitle(String title) { if (title == null) title = "Unknown portlet title"; req.setAttribute(SportletProperties.PORTLET_TITLE, title); } /** * Sets the MIME type for the render response. The portlet must * set the content type before calling {@link #getWriter} or * {@link #getPortletOutputStream}. * <p/> * Calling <code>setContentType</code> after <code>getWriter</code> * or <code>getOutputStream</code> does not change the content type. * * @param type the content MIME type * @throws java.lang.IllegalArgumentException * if the given type is not in the list returned * by <code>PortletRequest.getResponseContentTypes</code> * @see javax.portlet.RenderRequest#getResponseContentTypes * @see #getContentType */ public void setContentType(String type) { if (type == null) throw new IllegalArgumentException("supplied MIME type is null!"); String mimeType = stripCharacterEncoding(type); SortedSet<String> types = (SortedSet<String>) req.getAttribute(SportletProperties.PORTLET_MIMETYPES); if (types != null) { if (!types.contains(type)) throw new IllegalArgumentException("Unsupported portlet mimeType: " + type); } this.getHttpServletResponse().setContentType(mimeType); this.contentType = mimeType; } /** * Returns the name of the charset used for * the MIME body sent in this response. * <p/> * <p>See <a href="http://ds.internic.net/rfc/rfc2045.txt">RFC 2047</a> * for more information about character encoding and MIME. * * @return a <code>String</code> specifying the * name of the charset, for * example, <code>ISO-8859-1</code> */ public String getCharacterEncoding() { return this.getHttpServletResponse().getCharacterEncoding(); } /** * Returns a PrintWriter object that can send character * text to the portal. * <p/> * Before calling this method the content type of the * render response must be set using the {@link #setContentType} * method. * <p/> * Either this method or {@link #getPortletOutputStream} may be * called to write the body, not both. * * @return a <code>PrintWriter</code> object that * can return character data to the portal * @throws java.io.IOException if an input or output exception occurred * @throws java.lang.IllegalStateException * if the <code>getPortletOutputStream</code> method * has been called on this response, * or if no content type was set using the * <code>setContentType</code> method. * @see #setContentType * @see #getPortletOutputStream */ public java.io.PrintWriter getWriter() throws java.io.IOException { if ((contentType == null) || (hasOutputStream)) throw new IllegalStateException("A writer has already been obtained or the content type has not been set!"); hasWriter = true; return this.getHttpServletResponse().getWriter(); } /** * Returns the locale assigned to the response. * * @return Locale of this response */ public java.util.Locale getLocale() { Locale locale = (Locale) this.req.getSession(true).getAttribute(User.LOCALE); if (locale != null) return locale; locale = this.req.getLocale(); if (locale != null) return locale; return Locale.ENGLISH; } /** * Sets the preferred buffer size for the body of the response. * The portlet container will use a buffer at least as large as * the size requested. * <p/> * This method must be called before any response body content is * written; if content has been written, or the portlet container * does not support buffering, this method may throw an * <code>IllegalStateException</code>. * * @param size the preferred buffer size * @throws java.lang.IllegalStateException * if this method is called after * content has been written, or the * portlet container does not support buffering * @see #getBufferSize * @see #flushBuffer * @see #isCommitted * @see #reset */ public void setBufferSize(int size) { throw new IllegalStateException("portlet container does not support buffering"); } /** * Returns the actual buffer size used for the response. If no buffering * is used, this method returns 0. * * @return the actual buffer size used * @see #setBufferSize * @see #flushBuffer * @see #isCommitted * @see #reset */ public int getBufferSize() { return 0; } /** * Forces any content in the buffer to be written to the client. A call * to this method automatically commits the response. * * @throws java.io.IOException if an error occured when writing the output * @see #setBufferSize * @see #getBufferSize * @see #isCommitted * @see #reset */ public void flushBuffer() throws java.io.IOException { this.getHttpServletResponse().flushBuffer(); } /** * Clears the content of the underlying buffer in the response without * clearing properties set. If the response has been committed, * this method throws an <code>IllegalStateException</code>. * * @throws java.lang.IllegalStateException * if this method is called after * response is comitted * @see #setBufferSize * @see #getBufferSize * @see #isCommitted * @see #reset */ public void resetBuffer() { this.getHttpServletResponse().resetBuffer(); } /** * Returns a boolean indicating if the response has been * committed. * * @return a boolean indicating if the response has been * committed * @see #setBufferSize * @see #getBufferSize * @see #flushBuffer * @see #reset */ public boolean isCommitted() { return this.getHttpServletResponse().isCommitted(); } /** * Clears any data that exists in the buffer as well as the properties set. * If the response has been committed, this method throws an * <code>IllegalStateException</code>. * * @throws java.lang.IllegalStateException * if the response has already been * committed * @see #setBufferSize * @see #getBufferSize * @see #flushBuffer * @see #isCommitted */ public void reset() { this.getHttpServletResponse().reset(); } /** * Returns a <code>OutputStream</code> suitable for writing binary * data in the response. The portlet container does not encode the * binary data. * <p/> * Before calling this method the content type of the * render response must be set using the {@link #setContentType} * method. * <p/> * Calling <code>flush()</code> on the OutputStream commits the response. * <p/> * Either this method or {@link #getWriter} may be called to write the body, not both. * * @throws java.lang.IllegalStateException * if the <code>getWriter</code> method * has been called on this response, or * if no content type was set using the * <code>setContentType</code> method. * @throws java.io.IOException if an input or output exception occurred * @return a <code>OutputStream</code> for writing binary data * @see #setContentType * @see #getWriter */ public java.io.OutputStream getPortletOutputStream() throws java.io.IOException { if ((contentType == null) || (hasWriter)) throw new IllegalStateException("A writer has already been obtained or the content type has not been set!"); hasOutputStream = true; return this.getHttpServletResponse().getOutputStream(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -