Абстрагируйте / украсьте Request
, а вместо этого получите Response
.
например. в сервлете вашего фронт-контроллера:
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
, который принимает и HttpServletRequest
и HttpServletResponse
и передает его вместо 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 могут быть тем, что вы на самом деле ищете. Если только это не для чисто хобби;)