servletcommand.java

来自「很棒的web服务器源代码」· Java 代码 · 共 209 行

JAVA
209
字号
// ServletCommand.java// $Id: ServletCommand.java,v 1.12 2000/08/16 21:37:48 ylafon Exp $  // (c) COPYRIGHT MIT and INRIA, 1997.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.jigsaw.ssi.servlets;import java.util.Dictionary;import java.util.Hashtable;import java.net.MalformedURLException;import java.net.URL;import org.w3c.www.http.HTTP;import org.w3c.www.http.HttpMessage;import org.w3c.jigsaw.http.Reply;import org.w3c.jigsaw.http.Request;import org.w3c.jigsaw.http.httpd;import org.w3c.tools.resources.FramedResource;import org.w3c.tools.resources.InvalidResourceException;import org.w3c.tools.resources.LookupResult;import org.w3c.tools.resources.LookupState;import org.w3c.tools.resources.ProtocolException;import org.w3c.tools.resources.Resource;import org.w3c.tools.resources.ResourceException;import org.w3c.tools.resources.ResourceReference;import org.w3c.jigsaw.servlet.JigsawHttpServletRequest;import org.w3c.jigsaw.servlet.JigsawHttpServletResponse;import org.w3c.jigsaw.servlet.ServletWrapper;import org.w3c.util.ArrayDictionary;import org.w3c.jigsaw.ssi.commands.Command;import org.w3c.jigsaw.ssi.SSIFrame;import org.w3c.tools.resources.ProtocolException;import org.w3c.tools.resources.ResourceException;/** * Implementation of the SSI <code>servlet</code> command. * Servlet can be executed  * simply by providing a url path to a servlet class. * @author Benoit Mahe <bmahe@sophia.inria.fr>  */public class ServletCommand implements Command {    private final static String  NAME  = "servlet";    private final static boolean debug = true;    private static final String keys[] = {	"code",	"param",	"value",	"name"    };    protected static Hashtable wrappers = null; // <classname , wrapper>    static {	wrappers = new Hashtable(10);    }    protected void addParam(Dictionary d, String name, 			    String param, String value)     {	Hashtable params = (Hashtable)d.get(getClass().getName()+"."+name);	if (params == null) {	    params = new Hashtable(5);	    params.put(param,value);	} else {	    Object ovalue = params.get(param);	    if (ovalue == null) {		params.put(param,value);	    } else  if (ovalue instanceof String[]) {		String oldValues [] = (String[])ovalue;		String newValues [] = new String[oldValues.length+1];		System.arraycopy(oldValues,0,newValues,0,oldValues.length);		newValues[oldValues.length] = value;		params.put(param,newValues); 	    } else {		String newValues [] = new String[2];		newValues[0] = (String)ovalue;		newValues[1] = value;		params.put(param,newValues);	    }	}	d.put(getClass().getName()+"."+name, params);    }    protected Hashtable getParams(Dictionary d, String name) {	return (Hashtable) d.get(getClass().getName()+"."+name);    }    public String getName() {	return NAME;    }    public String getValue(Dictionary variables, String var, Request request) {	return null;    }    protected boolean isRemote(String code) {	try {	    URL url = new URL(code);	} catch (MalformedURLException ex) {	    return false;	}	return true;    }    /**     * return true if reply can be cached.     * @return a boolean.     */    public boolean acceptCaching() {	return false;    }    public Reply execute(SSIFrame ssiframe			 , Request request			 , ArrayDictionary parameters			 , Dictionary variables) {	Object values[] = parameters.getMany(keys);	String code     = (String) values[0];	String param    = (String) values[1];	String value    = (String) values[2];	String name     = (String) values[3];	if (name != null) {	    if ((param != null) && (value != null)) {		//store a new param for servlet "name"		addParam(variables,name,param,value);	    }	    if (code != null) { // remote or not ??		ResourceReference r_wrapper = 		    (ResourceReference)wrappers.get(code);		if (r_wrapper == null) { //lookup for wrapper		    httpd server = 			(httpd) ssiframe.getFileResource().getServer();		    ResourceReference rr_root = server.getRootReference();		    try {			FramedResource root = (FramedResource) rr_root.lock();			LookupState ls = new LookupState(code);			LookupResult lr = new LookupResult(rr_root);			ResourceReference wrap = null;			if (root.lookup(ls,lr))			    wrap = lr.getTarget();			if (wrap != null) {			    try {				if (wrap.lock() instanceof ServletWrapper) {				    wrappers.put(code,wrap);				    r_wrapper = wrap;				}			    } catch (InvalidResourceException ex) { 				ex.printStackTrace();				r_wrapper = null;			    } finally {				wrap.unlock();			    }			}		    } catch (ProtocolException ex) {			ex.printStackTrace();			r_wrapper = null;		    } catch (InvalidResourceException ex) {			ex.printStackTrace();			r_wrapper = null;		    } finally {			rr_root.unlock();		    }		}		if (r_wrapper != null) {		    //initialize the wrapper (params)		    Hashtable params = getParams(variables, name);		    request.setState(JigsawHttpServletRequest.STATE_PARAMETERS,				     params);		    //perform the request		    try {			FramedResource wrapper = 			    (FramedResource)r_wrapper.lock();			Request req = (Request)request.getClone();			req.setState(JigsawHttpServletResponse.INCLUDED, 				     Boolean.TRUE);			return (Reply) wrapper.perform(req);		    } catch (ProtocolException ex) {			ex.printStackTrace();			// return default reply		    } catch (ResourceException ex2) {			ex2.printStackTrace();			// return default reply		    } catch (InvalidResourceException ex3) {			ex3.printStackTrace();			// return default reply		    } finally {			r_wrapper.unlock();		    }		}	    }	}	// We are NOT doing notMod hack here (tricky and useless ?)	//Reply reply = ssiframe.createCommandReply(request, HTTP.OK);	Reply reply = request.makeReply(HTTP.OK);	reply.setContent("");	return reply;    }}

⌨️ 快捷键说明

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