coreimporttag.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 376 行
JAVA
376 行
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */package com.caucho.jstl.rt;import com.caucho.jsp.BodyContentImpl;import com.caucho.jsp.ResinJspWriter;import com.caucho.jstl.NameValueTag;import com.caucho.server.connection.CauchoResponse;import com.caucho.util.CharBuffer;import com.caucho.util.L10N;import com.caucho.vfs.ReadStream;import com.caucho.vfs.Vfs;import javax.servlet.RequestDispatcher;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspTagException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.BodyTagSupport;import java.io.IOException;import java.io.InputStream;import java.io.Reader;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;public class CoreImportTag extends BodyTagSupport implements NameValueTag { private static L10N L = new L10N(CoreImportTag.class); private String _url; private String _context; private CharBuffer _query = new CharBuffer(); private String _charEncoding; private String _var; private String _scope; private String _varReader; private Reader _reader; private Reader _oldReader; /** * Sets the URL to be imported. */ public void setURL(String url) { _url = url; } /** * Sets the external context for the import. */ public void setContext(String context) { _context = context; } /** * Adds a parameter. */ public void addParam(String name, String value) { if (name == null) return; if (value == null) value = ""; if (_query.length() != 0) _query.append('&'); _query.append(name); _query.append('='); int len = value.length(); for (int i = 0; i < len; i++) { char ch = value.charAt(i); switch (ch) { case '&': _query.append("%26"); break; case '%': _query.append("%25"); break; case '+': _query.append("%2b"); break; case '=': _query.append("%3d"); break; default: _query.append(ch); break; } } } /** * Sets the external character encoding for the import. */ public void setCharEncoding(String charEncoding) { _charEncoding = charEncoding; } /** * Sets the variable for the import. */ public void setVar(String var) { _var = var; } /** * Sets the scope for the result variable for the output. */ public void setScope(String scope) { _scope = scope; } /** * Sets the variable for the import. */ public void setVarReader(String varReader) { _varReader = varReader; } /** * Process the tag. */ public int doStartTag() throws JspException { _query.clear(); JspWriter jspWriter = null; try { if (_varReader != null) { jspWriter = pageContext.pushBody(); BodyContentImpl body = (BodyContentImpl) pageContext.getOut(); handleBody(body); _reader = body.getReader(); pageContext.setAttribute(_varReader, _reader); return EVAL_BODY_INCLUDE; } else return EVAL_BODY_BUFFERED; } catch (JspException e) { throw e; } catch (ServletException e) { throw new JspException(e); } catch (IOException e) { throw new JspException(e); } finally { if (jspWriter != null) pageContext.popBody(); } } /** * Process the end tag */ public int doEndTag() throws JspException { if (_varReader != null) { this.pageContext.removeAttribute(_varReader); } else { try { JspWriter jspWriter = pageContext.pushBody(); BodyContentImpl body = (BodyContentImpl) pageContext.getOut(); handleBody(body); if (_var != null) { String value = body.getString(); pageContext.popBody(); CoreSetTag.setValue(pageContext, _var, _scope, value); } else { body.writeOut(body.getEnclosingWriter()); pageContext.popBody(); } } catch (JspException e) { throw e; } catch (ServletException e) { Throwable e1 = e; if (e1.getCause() != null) e1 = e1.getCause(); throw new JspException(e1.getMessage(), e1); } catch (Exception e) { throw new JspException(e.getMessage(), e); } } return EVAL_PAGE; } private void handleBody(BodyContentImpl body) throws JspException, ServletException, IOException { String url = _url; if (url == null || url.equals("")) throw new JspTagException(L.l("URL may not be null for `{0}'", _url)); int p; if (_query == null || _query.getLength() == 0) { } else if ((p = url.indexOf('?')) > 0) { // jsp/1cip url = url.substring(0, p) + '?' + _query + '&' + url.substring(p + 1); } else url = url + '?' + _query; JspWriter out = body; if (out instanceof ResinJspWriter) ((ResinJspWriter) out).flushBuffer(); else { // jsp/1ei0 // out.flush(); } if (_context != null) { String context = _context; if (! url.startsWith("/")) throw new JspException(L.l("URL `{0}' must start with `/' with context `{0}'", url, context)); if (context != null && context.startsWith("/")) { ServletContext app = pageContext.getServletContext().getContext(context); RequestDispatcher disp = app.getRequestDispatcher(url); if (disp == null) throw new JspException(L.l("URL `{0}' does not map to any servlet", url)); CauchoResponse response = (CauchoResponse) pageContext.getResponse(); response.getResponseStream().setEncoding(_charEncoding); disp.include(pageContext.getRequest(), response); } else handleExternalBody(context + url); return; } int colon = url.indexOf(':'); int slash = url.indexOf('/'); if (slash == 0 || colon < 0 || slash < 0 || slash < colon) { ServletRequest request = pageContext.getRequest(); CauchoResponse response = (CauchoResponse) pageContext.getResponse(); response.getResponseStream().setEncoding(_charEncoding); RequestDispatcher disp = request.getRequestDispatcher(url); disp.include(request, response); } else handleExternalBody(url); } private void handleExternalBody(String url) throws JspException, ServletException, IOException { URL netURL = new URL(url); URLConnection conn = netURL.openConnection(); if (conn instanceof HttpURLConnection) ((HttpURLConnection) conn).setFollowRedirects(true); InputStream is = conn.getInputStream(); try { ReadStream in = Vfs.openRead(is); String encoding = conn.getContentEncoding(); String contentType = conn.getContentType(); if (_charEncoding != null) { encoding = _charEncoding; if (encoding != null && ! encoding.equals("")) in.setEncoding(encoding); } else if (encoding != null) in.setEncoding(encoding); else if (contentType != null) { int p = contentType.indexOf("charset="); if (p > 0) { CharBuffer cb = new CharBuffer(); for (int i = p + 8; i < contentType.length(); i++) { int ch = contentType.charAt(i); if (ch == '"' || ch == '\'') { } else if (ch >= 'a' && ch <= 'z') cb.append((char) ch); else if (ch >= 'A' && ch <= 'Z') cb.append((char) ch); else if (ch >= '0' && ch <= '9') cb.append((char) ch); else if (ch == '-' || ch == '_') cb.append((char) ch); else break; } encoding = cb.toString(); in.setEncoding(encoding); } } JspWriter out = pageContext.getOut(); int ch; while ((ch = in.readChar()) >= 0) out.print((char) ch); } finally { is.close(); } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?