⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dhtmlupdateservlet.java

📁 非常接近C/S操作方式的Java Ajax框架-ZK 用ZK框架使你的B/S应用程序更漂亮更易操作。 官网:www.zkoss.org
💻 JAVA
字号:
/* DHtmlUpdateServlet.java{{IS_NOTE	Purpose:			Description:			History:		Mon May 30 21:11:28     2005, Created by tomyeh}}IS_NOTECopyright (C) 2005 Potix Corporation. All Rights Reserved.{{IS_RIGHT	This program is distributed under GPL Version 2.0 in the hope that	it will be useful, but WITHOUT ANY WARRANTY.}}IS_RIGHT*/package org.zkoss.zk.au.http;import java.util.List;import java.util.LinkedList;import java.util.Date;import java.io.StringWriter;import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServlet;import org.zkoss.mesg.Messages;import org.zkoss.lang.Exceptions;import org.zkoss.util.logging.Log;import org.zkoss.web.servlet.Servlets;import org.zkoss.web.servlet.http.Https;import org.zkoss.web.servlet.http.Encodes;import org.zkoss.web.util.resource.ClassWebResource;import org.zkoss.zk.mesg.MZk;import org.zkoss.zk.ui.Execution;import org.zkoss.zk.ui.WebApp;import org.zkoss.zk.ui.Session;import org.zkoss.zk.ui.Desktop;import org.zkoss.zk.ui.ComponentNotFoundException;import org.zkoss.zk.ui.sys.WebAppCtrl;import org.zkoss.zk.ui.sys.UiEngine;import org.zkoss.zk.ui.http.ExecutionImpl;import org.zkoss.zk.ui.http.WebManager;import org.zkoss.zk.ui.http.I18Ns;import org.zkoss.zk.au.AuRequest;import org.zkoss.zk.au.AuResponse;import org.zkoss.zk.au.AuObsolete;import org.zkoss.zk.au.AuAlert;import org.zkoss.zk.au.AuSendRedirect;import org.zkoss.zk.au.Command;import org.zkoss.zk.au.CommandNotFoundException;/** * Used to receive command from the server and send result back to client. * Though it is called * DHtmlUpdateServlet, it is used to serve all kind of HTTP-based clients, * including html, mul and others (see {@link Desktop#getClientType}. * * <p>Design decision: it is better to use independent servlets for * /web, /upload and /view. However, to simplify the configuration, * we choose not to. * * @author tomyeh */public class DHtmlUpdateServlet extends HttpServlet {	private static final Log log = Log.lookup(DHtmlUpdateServlet.class);	private ServletContext _ctx;	private long _lastModified;	public void init(ServletConfig config) throws ServletException {		if (log.debugable()) log.debug("Starting DHtmlUpdateServlet at "+config.getServletContext());		_ctx = config.getServletContext();	}	public ServletContext getServletContext() {		return _ctx;	}	//-- super --//	protected long getLastModified(HttpServletRequest request) {		final String pi = Https.getThisPathInfo(request);		if (pi != null && pi.startsWith(ClassWebResource.PATH_PREFIX)		&& !pi.endsWith(".dsp") && !Servlets.isIncluded(request)) {			if (_lastModified == 0) _lastModified = new Date().getTime();				//Hard to know when it is modified, so cheat it..			return _lastModified;		}		return -1;	}	protected	void doGet(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {		final Session sess = WebManager.getSession(_ctx, request);		final Object old = I18Ns.setup(sess, request, response, "UTF-8");		try {			final String pi = Https.getThisPathInfo(request);			//if (log.finerable()) log.finer("Path info: "+pi);			if (pi != null && pi.length() > 0) {				if (pi.startsWith(ClassWebResource.PATH_PREFIX)) {					WebManager.getWebManager(_ctx).						getClassWebResource().doGet(request, response);				} else if (pi.startsWith("/upload")) {					Uploads.process(sess, _ctx, request, response);				} else if (pi.startsWith("/view")) {					DynaMedias.process(						sess, _ctx, request, response, pi.substring(5));				} else {					log.warning("Unknown path info: "+pi);				}				return;			}			process(sess, request, response);		} finally {			I18Ns.cleanup(request, old);		}	}	protected	void doPost(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {		doGet(request, response);	}	//-- ASYNC-UPDATE --//	/** Process update requests from the client. */	private void process(Session sess,	HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {		final WebApp wapp = sess.getWebApp();		final WebAppCtrl wappc = (WebAppCtrl)wapp;		final UiEngine uieng = wappc.getUiEngine();		final List aureqs = new LinkedList();		//parse desktop ID		final String dtid = request.getParameter("dtid");		if (dtid == null) {			log.warning("dtid not found: CP="+request.getContextPath()				+", SP="+request.getServletPath()+", QS="+request.getQueryString()				+", params="+request.getParameterMap().keySet());			//responseError(uieng, response, "Illegal request: dtid is required");			//Tom M. Yeh: 20060922: Unknown reason to get here but it is annoying			//to response it back to users			return;		}		final Desktop desktop = wappc.getDesktopCache(sess).getDesktopIfAny(dtid);		if (desktop == null) {			final StringWriter out = getXMLWriter();			final String scmd = request.getParameter("cmd.0");			if (!"rmDesktop".equals(scmd) && !"onRender".equals(scmd)			&& !"onTimer".equals(scmd)) {//possible in FF due to cache				String uri = wapp.getConfiguration().getTimeoutURI();				final AuResponse resp;				if (uri != null) {					if (uri.length() != 0)						uri = Encodes.encodeURL(_ctx, request, response, uri);					resp = new AuSendRedirect(uri, null);				} else {					resp = new AuObsolete(						dtid, Messages.get(MZk.UPDATE_OBSOLETE_PAGE, dtid));				}				uieng.response(resp, out);			}			flushXMLWriter(response, out);			return;		}		WebManager.setDesktop(request, desktop);			//reason: a new page might be created (such as include)		//parse commands		try {			for (int j = 0;; ++j) {				final String scmd = request.getParameter("cmd."+j);				if (scmd == null)					break;				final Command cmd = AuRequest.getCommand(scmd);				final String uuid = request.getParameter("uuid."+j);				final String[] data = request.getParameterValues("data."+j);				if (data != null) {					for (int k = data.length; --k >= 0;)						if ("zk_null~q".equals(data[k]))							data[k] = null;				}				if (uuid == null || uuid.length() == 0) {					aureqs.add(new AuRequest(desktop, cmd, data));				} else {					aureqs.add(new AuRequest(desktop, uuid, cmd, data));				}			}			if (aureqs.isEmpty()) {				responseError(uieng, response, "Illegal request: cmd is required");				return;			}		} catch (CommandNotFoundException ex) {			responseError(uieng, response, Exceptions.getMessage(ex));			return;		}		//if (log.debugable()) log.debug("AU request: "+aureqs);		final StringWriter out = getXMLWriter();		final Execution exec = new ExecutionImpl(			_ctx, request, response, desktop, null);		uieng.execUpdate(exec, aureqs, out);		flushXMLWriter(response, out);	}	/** Returns the writer for output XML.	 * @param withrs whether to output <rs> first.	 */	private static StringWriter getXMLWriter() {		final StringWriter out = new StringWriter();		out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rs>\n");		return out;	}	/** Flushes all content in out to the response.	 * Don't write the response thereafter.	 * @param withrs whether to output </rs> first.	 */	private static final	void flushXMLWriter(HttpServletResponse response, StringWriter out)	throws IOException {		out.write("\n</rs>");		//Use OutputStream due to Bug 1528592 (Jetty 6)		final byte[] bs = out.toString().getBytes("UTF-8");		response.setContentType("text/xml;charset=UTF-8");		response.setContentLength(bs.length);		response.getOutputStream().write(bs);		response.flushBuffer();	}	/** Generates a response for an error message.	 */	private static	void responseError(UiEngine uieng, HttpServletResponse response,	String errmsg) throws IOException {		log.debug(errmsg);		//Don't use sendError because Browser cannot handle UTF-8		final StringWriter out = getXMLWriter();		uieng.response(new AuAlert(errmsg), out);		flushXMLWriter(response, out);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -