diff --git a/src/org/redkale/boot/NodeHttpServer.java b/src/org/redkale/boot/NodeHttpServer.java index 152dd5bf2..b62278b4a 100644 --- a/src/org/redkale/boot/NodeHttpServer.java +++ b/src/org/redkale/boot/NodeHttpServer.java @@ -107,12 +107,8 @@ public final class NodeHttpServer extends NodeServer { if (ws == null || ws.value().length == 0) continue; final HttpServlet servlet = clazz.newInstance(); factory.inject(servlet, this); - String[] mappings = ws.value(); - if (ws.repair() && !prefix.isEmpty()) { - for (int i = 0; i < mappings.length; i++) { - mappings[i] = prefix + mappings[i]; - } - } + final String[] mappings = ws.value(); + String pref = ws.repair() ? prefix : ""; DefaultAnyValue servletConf = (DefaultAnyValue) en.getProperty(); WebInitParam[] webparams = ws.initParams(); if (webparams.length > 0) { @@ -121,8 +117,13 @@ public final class NodeHttpServer extends NodeServer { servletConf.addValue(webparam.name(), webparam.value()); } } - this.httpServer.addHttpServlet(servlet, servletConf, mappings); - if (ss != null) ss.add(new AbstractMap.SimpleEntry<>(clazz.getName(), mappings)); + this.httpServer.addHttpServlet(servlet, pref, servletConf, mappings); + if (ss != null) { + for (int i = 0; i < mappings.length; i++) { + mappings[i] = pref + mappings[i]; + } + ss.add(new AbstractMap.SimpleEntry<>(clazz.getName(), mappings)); + } } if (ss != null) { Collections.sort(ss, (AbstractMap.SimpleEntry o1, AbstractMap.SimpleEntry o2) -> o1.getKey().compareTo(o2.getKey())); diff --git a/src/org/redkale/net/PrepareServlet.java b/src/org/redkale/net/PrepareServlet.java index 2734a6a5c..44ed75475 100644 --- a/src/org/redkale/net/PrepareServlet.java +++ b/src/org/redkale/net/PrepareServlet.java @@ -13,12 +13,15 @@ import java.util.logging.*; /** * - *

详情见: http://www.redkale.org + *

+ * 详情见: http://www.redkale.org + * * @author zhangjx + * @param Context的子类型 * @param Request的子类型 * @param

Response的子类型 */ -public abstract class PrepareServlet> extends Servlet { +public abstract class PrepareServlet, P extends Response> extends Servlet { protected final AtomicLong executeCounter = new AtomicLong(); //执行请求次数 diff --git a/src/org/redkale/net/Request.java b/src/org/redkale/net/Request.java index 091679066..ffcd4c15a 100644 --- a/src/org/redkale/net/Request.java +++ b/src/org/redkale/net/Request.java @@ -17,9 +17,9 @@ import org.redkale.convert.json.*; * * @author zhangjx */ -public abstract class Request { +public abstract class Request { - protected final Context context; + protected final C context; protected final BsonConvert bsonConvert; @@ -39,7 +39,7 @@ public abstract class Request { protected final Map attributes = new HashMap<>(); - protected Request(Context context) { + protected Request(C context) { this.context = context; this.bsonConvert = context.getBsonConvert(); this.jsonConvert = context.getJsonConvert(); @@ -104,7 +104,7 @@ public abstract class Request { return attributes; } - public Context getContext() { + public C getContext() { return this.context; } diff --git a/src/org/redkale/net/Servlet.java b/src/org/redkale/net/Servlet.java index ce71460fa..e5ca89825 100644 --- a/src/org/redkale/net/Servlet.java +++ b/src/org/redkale/net/Servlet.java @@ -14,17 +14,18 @@ import java.io.IOException; * 详情见: http://www.redkale.org * * @author zhangjx + * @param Context的子类型 * @param Request的子类型 * @param

Response的子类型 */ -public abstract class Servlet> { +public abstract class Servlet, P extends Response> { - public void init(Context context, AnyValue config) { + public void init(C context, AnyValue config) { } public abstract void execute(R request, P response) throws IOException; - public void destroy(Context context, AnyValue config) { + public void destroy(C context, AnyValue config) { } } diff --git a/src/org/redkale/net/http/BasedHttpServlet.java b/src/org/redkale/net/http/BasedHttpServlet.java index c506e89df..007169044 100644 --- a/src/org/redkale/net/http/BasedHttpServlet.java +++ b/src/org/redkale/net/http/BasedHttpServlet.java @@ -7,7 +7,6 @@ package org.redkale.net.http; import org.redkale.net.Response; import org.redkale.net.Request; -import org.redkale.net.Context; import org.redkale.util.AnyValue; import java.io.IOException; import java.lang.annotation.*; @@ -120,8 +119,8 @@ public abstract class BasedHttpServlet extends HttpServlet { } @Override - public void init(Context context, AnyValue config) { - String path = ((HttpContext) context).getContextPath(); + public void init(HttpContext context, AnyValue config) { + String path = _prefix == null ? "" : _prefix; WebServlet ws = this.getClass().getAnnotation(WebServlet.class); if (ws != null && !ws.repair()) path = ""; HashMap map = load(); @@ -194,7 +193,7 @@ public abstract class BasedHttpServlet extends HttpServlet { FieldVisitor fv; MethodVisitor mv; AnnotationVisitor av0; - final String factfield = "factServlet"; + final String factfield = "_factServlet"; cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, null, supDynName, null); { fv = cw.visitField(ACC_PUBLIC, factfield, interDesc, null, null); diff --git a/src/org/redkale/net/http/HttpContext.java b/src/org/redkale/net/http/HttpContext.java index 4b3ff7d08..ce0f3dffb 100644 --- a/src/org/redkale/net/http/HttpContext.java +++ b/src/org/redkale/net/http/HttpContext.java @@ -17,26 +17,22 @@ import org.redkale.watch.*; /** * - *

详情见: http://www.redkale.org + *

+ * 详情见: http://www.redkale.org + * * @author zhangjx */ public class HttpContext extends Context { - protected final String contextPath; - protected final SecureRandom random = new SecureRandom(); public HttpContext(long serverStartTime, Logger logger, ExecutorService executor, int bufferCapacity, ObjectPool bufferPool, ObjectPool responsePool, int maxbody, Charset charset, InetSocketAddress address, PrepareServlet prepare, - WatchFactory watch, int readTimeoutSecond, int writeTimeoutSecond, String contextPath) { + WatchFactory watch, int readTimeoutSecond, int writeTimeoutSecond) { super(serverStartTime, logger, executor, bufferCapacity, bufferPool, responsePool, maxbody, charset, address, prepare, watch, readTimeoutSecond, writeTimeoutSecond); - this.contextPath = contextPath; - random.setSeed(Math.abs(System.nanoTime())); - } - public String getContextPath() { - return this.contextPath; + random.setSeed(Math.abs(System.nanoTime())); } protected String createSessionid() { diff --git a/src/org/redkale/net/http/HttpPrepareServlet.java b/src/org/redkale/net/http/HttpPrepareServlet.java index b72e949a4..9795a838d 100644 --- a/src/org/redkale/net/http/HttpPrepareServlet.java +++ b/src/org/redkale/net/http/HttpPrepareServlet.java @@ -23,7 +23,7 @@ import org.redkale.watch.*; * * @author zhangjx */ -public final class HttpPrepareServlet extends PrepareServlet> { +public final class HttpPrepareServlet extends PrepareServlet> { private final List servlets = new ArrayList<>(); @@ -34,11 +34,11 @@ public final class HttpPrepareServlet extends PrepareServlet { s.init(context, s._conf); }); - final WatchFactory watch = ((HttpContext) context).getWatchFactory(); + final WatchFactory watch = context.getWatchFactory(); if (watch != null) { this.servlets.stream().forEach(s -> { watch.inject(s); @@ -83,14 +83,15 @@ public final class HttpPrepareServlet extends PrepareServlet(Pattern.compile(mapping).asPredicate(), servlet); } } else if (mapping != null && !mapping.isEmpty()) { - strmaps.put(mapping, servlet); + strmaps.put(prefix + mapping, servlet); } } servlet._conf = conf; + servlet._prefix = prefix == null ? "" : prefix; this.servlets.add(servlet); } @@ -124,7 +126,7 @@ public final class HttpPrepareServlet extends PrepareServlet { s.destroy(context, s._conf); diff --git a/src/org/redkale/net/http/HttpRequest.java b/src/org/redkale/net/http/HttpRequest.java index 02ecdca39..35a05ab09 100644 --- a/src/org/redkale/net/http/HttpRequest.java +++ b/src/org/redkale/net/http/HttpRequest.java @@ -23,19 +23,17 @@ import org.redkale.net.*; * 获取页号: int page = request.getRequstURIPath("page:", 1); * 获取行数: int size = request.getRequstURIPath("size:", 10); * - *

详情见: http://www.redkale.org + *

+ * 详情见: http://www.redkale.org + * * @author zhangjx */ -public class HttpRequest extends Request { +public class HttpRequest extends Request { protected static final Charset UTF8 = Charset.forName("UTF-8"); protected static final String SESSIONID_NAME = "JSESSIONID"; - private static final byte[] flashRequestContent1 = "\0".getBytes(); - - private static final byte[] flashRequestContent2 = "".getBytes(); - private String method; private String protocol; @@ -68,7 +66,7 @@ public class HttpRequest extends Request { private final String remoteAddrHeader; - public HttpRequest(Context context, String remoteAddrHeader) { + public HttpRequest(HttpContext context, String remoteAddrHeader) { super(context); this.remoteAddrHeader = remoteAddrHeader; } @@ -226,11 +224,6 @@ public class HttpRequest extends Request { super.removeProperty(name); } - @Override - public HttpContext getContext() { - return (HttpContext) this.context; - } - public String getRemoteAddr() { if (remoteAddrHeader != null) { String val = getHeader(remoteAddrHeader); diff --git a/src/org/redkale/net/http/HttpResourceServlet.java b/src/org/redkale/net/http/HttpResourceServlet.java index fdb413b72..c8d4f8ff9 100644 --- a/src/org/redkale/net/http/HttpResourceServlet.java +++ b/src/org/redkale/net/http/HttpResourceServlet.java @@ -16,12 +16,13 @@ import java.util.concurrent.atomic.*; import java.util.function.*; import java.util.logging.*; import java.util.regex.*; -import org.redkale.net.*; import org.redkale.util.*; /** * - *

详情见: http://www.redkale.org + *

+ * 详情见: http://www.redkale.org + * * @author zhangjx */ public final class HttpResourceServlet extends HttpServlet { @@ -98,7 +99,7 @@ public final class HttpResourceServlet extends HttpServlet { protected Predicate ranges; @Override - public void init(Context context, AnyValue config) { + public void init(HttpContext context, AnyValue config) { if (config != null) { String rootstr = config.getValue("webroot", "root"); if (rootstr.indexOf(':') < 0 && rootstr.indexOf('/') != 0 && System.getProperty("APP_HOME") != null) { @@ -140,7 +141,7 @@ public final class HttpResourceServlet extends HttpServlet { } @Override - public void destroy(Context context, AnyValue config) { + public void destroy(HttpContext context, AnyValue config) { if (this.watchThread != null) { try { this.watchThread.watcher.close(); diff --git a/src/org/redkale/net/http/HttpServer.java b/src/org/redkale/net/http/HttpServer.java index 4c8358013..b91821cef 100644 --- a/src/org/redkale/net/http/HttpServer.java +++ b/src/org/redkale/net/http/HttpServer.java @@ -15,13 +15,13 @@ import org.redkale.watch.*; /** * - *

详情见: http://www.redkale.org + *

+ * 详情见: http://www.redkale.org + * * @author zhangjx */ public final class HttpServer extends Server { - private String contextPath; - public HttpServer() { this(System.currentTimeMillis(), null); } @@ -34,11 +34,10 @@ public final class HttpServer extends Server { public void init(AnyValue config) throws Exception { super.init(config); AnyValue conf = config == null ? null : config.getAnyValue("servlets"); - this.contextPath = conf == null ? "" : conf.getValue("path", ""); } - public void addHttpServlet(HttpServlet servlet, AnyValue conf, String... mappings) { - ((HttpPrepareServlet) this.prepare).addHttpServlet(servlet, conf, mappings); + public void addHttpServlet(HttpServlet servlet, final String prefix, AnyValue conf, String... mappings) { + ((HttpPrepareServlet) this.prepare).addHttpServlet(servlet, prefix, conf, mappings); } @Override @@ -120,7 +119,7 @@ public final class HttpServer extends Server { AtomicLong cycleResponseCounter = watch == null ? new AtomicLong() : watch.createWatchNumber("HTTP_" + port + ".Response.cycleCounter"); ObjectPool responsePool = HttpResponse.createPool(createResponseCounter, cycleResponseCounter, this.responsePoolSize, null); HttpContext httpcontext = new HttpContext(this.serverStartTime, this.logger, executor, rcapacity, bufferPool, responsePool, - this.maxbody, this.charset, this.address, this.prepare, this.watch, this.readTimeoutSecond, this.writeTimeoutSecond, contextPath); + this.maxbody, this.charset, this.address, this.prepare, this.watch, this.readTimeoutSecond, this.writeTimeoutSecond); responsePool.setCreator((Object... params) -> new HttpResponse(httpcontext, new HttpRequest(httpcontext, addrHeader), addHeaders, setHeaders, defCookie)); return httpcontext; } diff --git a/src/org/redkale/net/http/HttpServlet.java b/src/org/redkale/net/http/HttpServlet.java index 59c17aa9a..f0061dbf4 100644 --- a/src/org/redkale/net/http/HttpServlet.java +++ b/src/org/redkale/net/http/HttpServlet.java @@ -10,13 +10,17 @@ import org.redkale.util.*; /** * - *

详情见: http://www.redkale.org + *

+ * 详情见: http://www.redkale.org + * * @author zhangjx */ -public abstract class HttpServlet extends Servlet> { +public abstract class HttpServlet extends Servlet> { AnyValue _conf; //当前HttpServlet的配置 + String _prefix = ""; //当前HttpServlet的path前缀 + @Override public final boolean equals(Object obj) { return obj != null && obj.getClass() == this.getClass(); diff --git a/src/org/redkale/net/http/WebSocketServlet.java b/src/org/redkale/net/http/WebSocketServlet.java index 3cde7b091..05eba2633 100644 --- a/src/org/redkale/net/http/WebSocketServlet.java +++ b/src/org/redkale/net/http/WebSocketServlet.java @@ -13,7 +13,6 @@ import java.security.*; import java.util.*; import java.util.logging.*; import javax.annotation.*; -import org.redkale.net.*; import org.redkale.util.*; /** @@ -64,7 +63,7 @@ public abstract class WebSocketServlet extends HttpServlet { protected WebSocketEngine engine; @Override - public void init(Context context, AnyValue conf) { + public void init(HttpContext context, AnyValue conf) { InetSocketAddress addr = context.getServerAddress(); this.engine = new WebSocketEngine(addr.getHostString() + ":" + addr.getPort() + "-[" + name() + "]", this.node, logger); this.node.putWebSocketEngine(engine); @@ -73,7 +72,7 @@ public abstract class WebSocketServlet extends HttpServlet { } @Override - public void destroy(Context context, AnyValue conf) { + public void destroy(HttpContext context, AnyValue conf) { this.node.destroy(conf); super.destroy(context, conf); engine.close(); diff --git a/src/org/redkale/net/sncp/SncpContext.java b/src/org/redkale/net/sncp/SncpContext.java new file mode 100644 index 000000000..54bfdb470 --- /dev/null +++ b/src/org/redkale/net/sncp/SncpContext.java @@ -0,0 +1,29 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.net.sncp; + +import java.net.*; +import java.nio.*; +import java.nio.charset.*; +import java.util.concurrent.*; +import java.util.logging.*; +import org.redkale.net.*; +import org.redkale.util.*; +import org.redkale.watch.*; + +/** + * + * @author zhangjx + */ +public class SncpContext extends Context { + + public SncpContext(long serverStartTime, Logger logger, ExecutorService executor, int bufferCapacity, ObjectPool bufferPool, + ObjectPool responsePool, int maxbody, Charset charset, InetSocketAddress address, PrepareServlet prepare, + WatchFactory watch, int readTimeoutSecond, int writeTimeoutSecond) { + super(serverStartTime, logger, executor, bufferCapacity, bufferPool, responsePool, maxbody, charset, + address, prepare, watch, readTimeoutSecond, writeTimeoutSecond); + } +} diff --git a/src/org/redkale/net/sncp/SncpPrepareServlet.java b/src/org/redkale/net/sncp/SncpPrepareServlet.java index d67c2da92..03ac96877 100644 --- a/src/org/redkale/net/sncp/SncpPrepareServlet.java +++ b/src/org/redkale/net/sncp/SncpPrepareServlet.java @@ -6,7 +6,6 @@ package org.redkale.net.sncp; import org.redkale.net.PrepareServlet; -import org.redkale.net.Context; import org.redkale.util.AnyValue; import java.io.IOException; import java.nio.ByteBuffer; @@ -15,10 +14,12 @@ import org.redkale.util.*; /** * - *

详情见: http://www.redkale.org + *

+ * 详情见: http://www.redkale.org + * * @author zhangjx */ -public class SncpPrepareServlet extends PrepareServlet { +public class SncpPrepareServlet extends PrepareServlet { private static final ByteBuffer pongBuffer = ByteBuffer.wrap("PONG".getBytes()).asReadOnlyBuffer(); @@ -50,7 +51,7 @@ public class SncpPrepareServlet extends PrepareServlet> values = this.maps.values(); values.stream().forEach((en) -> { en.values().stream().forEach(s -> s.init(context, s.conf)); @@ -58,7 +59,7 @@ public class SncpPrepareServlet extends PrepareServlet> values = this.maps.values(); values.stream().forEach((en) -> { en.values().stream().forEach(s -> s.destroy(context, s.conf)); diff --git a/src/org/redkale/net/sncp/SncpRequest.java b/src/org/redkale/net/sncp/SncpRequest.java index fd4ccfbe2..684227e7e 100644 --- a/src/org/redkale/net/sncp/SncpRequest.java +++ b/src/org/redkale/net/sncp/SncpRequest.java @@ -16,7 +16,7 @@ import org.redkale.util.*; *

详情见: http://www.redkale.org * @author zhangjx */ -public final class SncpRequest extends Request { +public final class SncpRequest extends Request { public static final int HEADER_SIZE = 72; @@ -42,7 +42,7 @@ public final class SncpRequest extends Request { private byte[] bufferbytes = new byte[6]; - protected SncpRequest(Context context) { + protected SncpRequest(SncpContext context) { super(context); this.convert = context.getBsonConvert(); } diff --git a/src/org/redkale/net/sncp/SncpServer.java b/src/org/redkale/net/sncp/SncpServer.java index 36f7f383d..2bb96dd6a 100644 --- a/src/org/redkale/net/sncp/SncpServer.java +++ b/src/org/redkale/net/sncp/SncpServer.java @@ -62,7 +62,7 @@ public final class SncpServer extends Server { AtomicLong createResponseCounter = watch == null ? new AtomicLong() : watch.createWatchNumber("SNCP_" + port + ".Response.creatCounter"); AtomicLong cycleResponseCounter = watch == null ? new AtomicLong() : watch.createWatchNumber("SNCP_" + port + ".Response.cycleCounter"); ObjectPool responsePool = SncpResponse.createPool(createResponseCounter, cycleResponseCounter, this.responsePoolSize, null); - Context sncpcontext = new Context(this.serverStartTime, this.logger, executor, rcapacity, bufferPool, responsePool, + SncpContext sncpcontext = new SncpContext(this.serverStartTime, this.logger, executor, rcapacity, bufferPool, responsePool, this.maxbody, this.charset, this.address, this.prepare, this.watch, this.readTimeoutSecond, this.writeTimeoutSecond); responsePool.setCreator((Object... params) -> new SncpResponse(sncpcontext, new SncpRequest(sncpcontext))); return sncpcontext; diff --git a/src/org/redkale/net/sncp/SncpServlet.java b/src/org/redkale/net/sncp/SncpServlet.java index 02ac6574e..1043f9ffe 100644 --- a/src/org/redkale/net/sncp/SncpServlet.java +++ b/src/org/redkale/net/sncp/SncpServlet.java @@ -5,15 +5,17 @@ */ package org.redkale.net.sncp; -import org.redkale.net.Servlet; +import org.redkale.net.*; import org.redkale.util.*; /** * - *

详情见: http://www.redkale.org + *

+ * 详情见: http://www.redkale.org + * * @author zhangjx */ -public abstract class SncpServlet extends Servlet implements Comparable { +public abstract class SncpServlet extends Servlet implements Comparable { AnyValue conf; @@ -30,7 +32,7 @@ public abstract class SncpServlet extends Servlet imp public final int hashCode() { return this.getClass().hashCode(); } - + @Override public int compareTo(SncpServlet o) { return 0;