diff --git a/src/org/redkale/net/PrepareServlet.java b/src/org/redkale/net/PrepareServlet.java index 44ed75475..28195d476 100644 --- a/src/org/redkale/net/PrepareServlet.java +++ b/src/org/redkale/net/PrepareServlet.java @@ -21,7 +21,7 @@ import java.util.logging.*; * @param Request的子类型 * @param

Response的子类型 */ -public abstract class PrepareServlet, P extends Response> extends Servlet { +public abstract class PrepareServlet, P extends Response> extends Servlet { protected final AtomicLong executeCounter = new AtomicLong(); //执行请求次数 diff --git a/src/org/redkale/net/Response.java b/src/org/redkale/net/Response.java index d6758c44c..38cfd694a 100644 --- a/src/org/redkale/net/Response.java +++ b/src/org/redkale/net/Response.java @@ -18,9 +18,9 @@ import java.util.function.*; * @param Request的子类型 */ @SuppressWarnings("unchecked") -public abstract class Response { +public abstract class Response> { - protected final Context context; + protected final C context; protected final R request; @@ -28,7 +28,7 @@ public abstract class Response { private boolean inited = true; - protected BiConsumer> recycleListener; + protected BiConsumer> recycleListener; private final CompletionHandler finishHandler = new CompletionHandler() { @@ -84,7 +84,7 @@ public abstract class Response { }; - protected Response(Context context, final R request) { + protected Response(C context, final R request) { this.context = context; this.request = request; } @@ -137,7 +137,7 @@ public abstract class Response { this.request.createtime = System.currentTimeMillis(); } - public void setRecycleListener(BiConsumer> recycleListener) { + public void setRecycleListener(BiConsumer> recycleListener) { this.recycleListener = recycleListener; } @@ -224,7 +224,7 @@ public abstract class Response { }); } - public Context getContext() { + public C getContext() { return context; } } diff --git a/src/org/redkale/net/Servlet.java b/src/org/redkale/net/Servlet.java index 53ed1e250..28e05e80c 100644 --- a/src/org/redkale/net/Servlet.java +++ b/src/org/redkale/net/Servlet.java @@ -18,7 +18,7 @@ import java.io.IOException; * @param Request的子类型 * @param

Response的子类型 */ -public abstract class Servlet, P extends Response> { +public abstract class Servlet, P extends Response> { public void init(C context, AnyValue config) { } diff --git a/src/org/redkale/net/http/HttpPrepareServlet.java b/src/org/redkale/net/http/HttpPrepareServlet.java index 9795a838d..306a6783f 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<>(); diff --git a/src/org/redkale/net/http/HttpRequest.java b/src/org/redkale/net/http/HttpRequest.java index ed8e7fd17..89f52bc3c 100644 --- a/src/org/redkale/net/http/HttpRequest.java +++ b/src/org/redkale/net/http/HttpRequest.java @@ -441,7 +441,7 @@ public class HttpRequest extends Request { return host; } - protected static InetSocketAddress parseSocketAddress(String host) { + protected InetSocketAddress parseSocketAddress(String host) { if (host == null || host.isEmpty()) return null; int pos = host.indexOf(':'); String hostname = pos < 0 ? host : host.substring(0, pos); diff --git a/src/org/redkale/net/http/HttpResponse.java b/src/org/redkale/net/http/HttpResponse.java index 575714039..b753746f2 100644 --- a/src/org/redkale/net/http/HttpResponse.java +++ b/src/org/redkale/net/http/HttpResponse.java @@ -32,7 +32,7 @@ import org.redkale.util.*; * * @param HttpRequest的子类型 */ -public class HttpResponse extends Response { +public class HttpResponse extends Response { /** * HttpResponse.finish 方法内调用 @@ -131,7 +131,7 @@ public class HttpResponse extends Response { return new ObjectPool<>(creatCounter, cycleCounter, max, creator, (x) -> ((HttpResponse) x).prepare(), (x) -> ((HttpResponse) x).recycle()); } - public HttpResponse(Context context, R request, String[][] defaultAddHeaders, String[][] defaultSetHeaders, HttpCookie defcookie) { + public HttpResponse(HttpContext context, HttpRequest request, String[][] defaultAddHeaders, String[][] defaultSetHeaders, HttpCookie defcookie) { super(context, request); this.defaultAddHeaders = defaultAddHeaders; this.defaultSetHeaders = defaultSetHeaders; @@ -160,6 +160,12 @@ public class HttpResponse extends Response { super.init(channel); } + /** + * 获取状态码对应的状态描述 + * + * @param status 状态码 + * @return 状态描述 + */ protected String getHttpCode(int status) { return httpCodes.get(status); } @@ -173,11 +179,11 @@ public class HttpResponse extends Response { return v == null ? defValue : v; } - @Override - public HttpContext getContext() { - return (HttpContext) context; - } - + /** + * 增加Cookie值 + * + * @param cookies + */ public void addCookie(HttpCookie... cookies) { if (this.cookies == null) { this.cookies = cookies; @@ -189,31 +195,65 @@ public class HttpResponse extends Response { } } + /** + * 将对象以JSON格式输出 + * + * @param obj 输出对象 + */ public void finishJson(final Object obj) { this.contentType = "text/plain; charset=utf-8"; finish(request.getJsonConvert().convertTo(context.getBufferSupplier(), obj)); } + /** + * 将对象以JSON格式输出 + * + * @param convert 指定的JsonConvert + * @param obj 输出对象 + */ public void finishJson(final JsonConvert convert, final Object obj) { this.contentType = "text/plain; charset=utf-8"; finish(convert.convertTo(context.getBufferSupplier(), obj)); } + /** + * 将对象以JSON格式输出 + * + * @param type 指定的类型 + * @param obj 输出对象 + */ public void finishJson(final Type type, final Object obj) { this.contentType = "text/plain; charset=utf-8"; finish(request.getJsonConvert().convertTo(context.getBufferSupplier(), type, obj)); } + /** + * 将对象以JSON格式输出 + * + * @param convert 指定的JsonConvert + * @param type 指定的类型 + * @param obj 输出对象 + */ public void finishJson(final JsonConvert convert, final Type type, final Object obj) { this.contentType = "text/plain; charset=utf-8"; finish(convert.convertTo(context.getBufferSupplier(), type, obj)); } + /** + * 将对象以JSON格式输出 + * + * @param objs 输出对象 + */ public void finishJson(final Object... objs) { this.contentType = "text/plain; charset=utf-8"; finish(request.getJsonConvert().convertTo(context.getBufferSupplier(), objs)); } + /** + * 将指定字符串以响应结果输出 + * + * @param obj 输出内容 + */ public void finish(String obj) { if (obj == null || obj.isEmpty()) { final ByteBuffer headbuf = createHeader(); @@ -248,25 +288,50 @@ public class HttpResponse extends Response { } } + /** + * 以指定响应码附带内容输出 + * + * @param status 响应码 + * @param message 输出内容 + */ public void finish(int status, String message) { this.status = status; if (status != 200) super.refuseAlive(); finish(message); } + /** + * 以304状态码输出 + * + */ public void finish304() { super.finish(buffer304.duplicate()); } + /** + * 以404状态码输出 + * + */ public void finish404() { super.finish(buffer404.duplicate()); } + /** + * 将指定ByteBuffer按响应结果输出 + * + * @param buffer 输出内容 + */ @Override public void finish(ByteBuffer buffer) { finish(false, buffer); } + /** + * 将指定ByteBuffer按响应结果输出 + * + * @param kill 输出后是否强制关闭连接 + * @param buffer 输出内容 + */ @Override public void finish(boolean kill, ByteBuffer buffer) { if (!this.headsended) { @@ -283,11 +348,22 @@ public class HttpResponse extends Response { } } + /** + * 将指定ByteBuffer数组按响应结果输出 + * + * @param buffers 输出内容 + */ @Override public void finish(ByteBuffer... buffers) { finish(false, buffers); } + /** + * 将指定ByteBuffer数组按响应结果输出 + * + * @param kill 输出后是否强制关闭连接 + * @param buffers 输出内容 + */ @Override public void finish(boolean kill, ByteBuffer... buffers) { if (bufferHandler != null) { @@ -316,6 +392,14 @@ public class HttpResponse extends Response { } } + /** + * 异步输出指定内容 + * + * @param 泛型 + * @param buffer 输出内容 + * @param attachment 异步回调参数 + * @param handler 异步回调函数 + */ public void sendBody(ByteBuffer buffer, A attachment, CompletionHandler handler) { if (!this.headsended) { if (this.contentLength < 0) this.contentLength = buffer == null ? 0 : buffer.remaining(); @@ -331,10 +415,21 @@ public class HttpResponse extends Response { } } + /** + * 将指定文件按响应结果输出 + * + * @param file 输出文件 + */ public void finish(File file) throws IOException { finishFile(file, null); } + /** + * 将指定文件句柄或文件内容按响应结果输出,若fileBody不为null则只输出fileBody内容 + * + * @param file 输出文件 + * @param fileBody 文件内容, 没有则输出file + */ protected void finishFile(final File file, ByteBuffer fileBody) throws IOException { if (file == null || !file.isFile() || !file.canRead()) { finish404(); @@ -465,6 +560,11 @@ public class HttpResponse extends Response { return sb; } + /** + * 跳过header的输出 + * 通常应用场景是,调用者的输出内容里已经包含了HTTP的响应头信息,因此需要调用此方法避免重复输出HTTP响应头信息。 + * + */ public void skipHeader() { this.headsended = true; } @@ -473,42 +573,94 @@ public class HttpResponse extends Response { return this.header.duplicate(); } + /** + * 设置Header值 + * + * @param name header名 + * @param value header值 + */ public void setHeader(String name, Object value) { this.header.setValue(name, String.valueOf(value)); } + /** + * 添加Header值 + * + * @param name header名 + * @param value header值 + */ public void addHeader(String name, Object value) { this.header.addValue(name, String.valueOf(value)); } + /** + * 设置状态码 + * + * @param status 状态码 + */ public void setStatus(int status) { this.status = status; } + /** + * 获取状态码 + * + * @return 状态码 + */ public int getStatus() { return this.status; } + /** + * 获取 ContentType + * + * @return ContentType + */ public String getContentType() { return contentType; } + /** + * 设置 ContentType + * + * @param contentType ContentType + */ public void setContentType(String contentType) { this.contentType = contentType; } + /** + * 获取内容长度 + * + * @return 内容长度 + */ public long getContentLength() { return contentLength; } + /** + * 设置内容长度 + * + * @param contentLength 内容长度 + */ public void setContentLength(long contentLength) { this.contentLength = contentLength; } + /** + * 获取输出时的拦截器 + * + * @return 拦截器 + */ protected BufferHandler getBufferHandler() { return bufferHandler; } + /** + * 设置输出时的拦截器 + * + * @param bufferHandler 拦截器 + */ protected void setBufferHandler(BufferHandler bufferHandler) { this.bufferHandler = bufferHandler; } diff --git a/src/org/redkale/net/http/HttpServlet.java b/src/org/redkale/net/http/HttpServlet.java index f0061dbf4..517f4ca6a 100644 --- a/src/org/redkale/net/http/HttpServlet.java +++ b/src/org/redkale/net/http/HttpServlet.java @@ -15,7 +15,7 @@ import org.redkale.util.*; * * @author zhangjx */ -public abstract class HttpServlet extends Servlet> { +public abstract class HttpServlet extends Servlet { AnyValue _conf; //当前HttpServlet的配置 diff --git a/src/org/redkale/net/sncp/SncpResponse.java b/src/org/redkale/net/sncp/SncpResponse.java index a22536a07..cf9c2aa19 100644 --- a/src/org/redkale/net/sncp/SncpResponse.java +++ b/src/org/redkale/net/sncp/SncpResponse.java @@ -14,10 +14,12 @@ import org.redkale.util.*; /** * - *

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

+ * 详情见: http://www.redkale.org + * * @author zhangjx */ -public final class SncpResponse extends Response { +public final class SncpResponse extends Response { public static final int RETCODE_ILLSERVICEID = (1 << 10); //无效serviceid @@ -43,7 +45,7 @@ public final class SncpResponse extends Response { return null; } - protected SncpResponse(Context context, SncpRequest request) { + protected SncpResponse(SncpContext context, SncpRequest request) { super(context, request); this.addrBytes = context.getServerAddress().getAddress().getAddress(); this.addrPort = context.getServerAddress().getPort();