gpt4 book ai didi

java - 将 OutputStream 与 InputStream 连接起来

转载 作者:行者123 更新时间:2023-11-29 06:20:26 25 4
gpt4 key购买 nike

我正在试验一个小型网络框架,偶然发现了一个与流有关的问题。有像 Response get(HttpServletRequest) 这样的处理程序方法。从框架的角度来看,响应应该为响应主体提供输入流。框架读取此流并将数据写入 Servlet API 的底层 OutputStream。但是从用户的角度来看,需要写入一个 OutputStream。

框架的观点:

public interface Response {
InputStream getInputStream();
}

用户视角:

public interface Response {
InputStream getOutputStream();
}

应该这样使用:

public void get(HttpServletRequest request) {
Response response = new Response(OK);
response.getOutputStream().write(...);
return response;
}

问题是我无法在没有输出目标的情况下创建输出流(并且不想写入 ByteArray 缓冲区)。

知道如何给用户一个 OutputStream 而不像在 Servlet API 中那样传入吗?我想避免输出参数。

最佳答案

同时抽象/装饰Request,并从中获取Response

例如在您的前端 Controller servlet 中:

protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
Request request = new RequestImpl(req, res);
Action action = ActionFactory.getAction(req); // Do whatever way you do to locate the `Action`.
Response = action.get(request);
// ...
}

其中 RequestImpl 看起来像这样:

public class RequestImpl implements Request {
private HttpServletRequest request;
private HttpServletResponse response;

public RequestImpl(HttpServletRequest request, HttpServletResponse response) {
this.request = request;
this.response = response;
}

public Response newResponse(Status status) {
return new ResponseImpl(response, status);
// Add a boolean responseCreated to avoid creation of multiple responses? Illegal state!
}

public String getParameter(String name) { // Just another example of decorated method.
return request.getParameter(name);
}

// ...
}

ResponseImpl 看起来像这样:

public class ResponseImpl implements Response {
private HttpServletResponse response;

public ResponseImpl(HttpServletResponse response, Status status) {
this.response = response;
this.response.setStatus(status.getCode());
}

public OutputStream getOutputStream() {
return response.getOutputStream();
}

// ...
}

你最终在你的 Action 中使用它:

public ActionImpl implements Action {
public Response get(Request request) {
Response response = request.newResponse(OK);
response.getOutputStream().write("body");
return response;
}
}

或者,您也可以创建一个 Context,它同时接收 HttpServletRequestHttpServletResponse 并将其传递给 Request。这也或多或少是普通 MVC 框架所做的。例如

protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
Context context = new ContextImpl(req, res);
Action action = ActionFactory.getAction(req); // Do whatever way you do to locate the `Action`.
action.execute(context);
context.render(); // Do here whatever you'd initially to do with the obtained Response.
}

public ActionImpl implements Action {
public void execute(Context context) {
context.getResponseOutputStream().write("body");
}
}

也就是说,与其重新发明,我建议也看看现有的 API。根据您想做什么,JSF、JAX-RS 或 JAX-WS 可能正是您真正想要的。除非这是出于纯粹的爱好目的;)

关于java - 将 OutputStream 与 InputStream 连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3294586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com