2010-07-20 6 views
1

약간의 웹 프레임 워크를 실험 중이며 스트림 문제가 발생했습니다. Response get(HttpServletRequest)과 같은 핸들러 메소드가 있습니다. 프레임 워크 관점에서 응답은 응답 본문에 대한 입력 스트림을 제공해야합니다. 프레임 워크는이 스트림을 읽고 서블릿 API의 기본 OutputStream에 데이터를 씁니다. 그러나 사용자의 관점에서 볼 때 OutputStream이 필요합니다.InputStream과 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; 
} 

문제는 내가 출력없이 OutputStream를 만들 수 있다는 것입니다 target (ByteArray 버퍼에 쓰고 싶지 않음).

Servlet API에서와 같이 사용자에게 OutputStream을 전달하지 않고 어떻게 사용자에게 줄 수 있습니까? 나는 출력 매개 변수를 피하고 싶습니다.

답변

1

초록/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보기 : 당신이 마지막으로 당신의 Action에서 다음과 같이 사용

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(); 
    } 

    // ... 
} 

:

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

또는, 당신은 또한 모두 HttpServletRequestHttpServletResponse 소요 Context을 만들고 대신의 Request 것을 전달할 수 있습니다. 평균 MVC 프레임 워크가하는 것보다 적거나 많습니다. 예 : 대신 개혁, 나는뿐만 아니라 API의 기존에 봐 가지고하는 것이 좋습니다이라고 말했다

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

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. 
} 

. JSF, JAX-RS 또는 JAX-WS는 사용자가 원하는 작업에 따라 실제로 수행 할 작업 일 수 있습니다. 순수한 취미 목적이 아닌 한)

1

클라이언트에게 OutputStream을 주면, 클라이언트는 버퍼, 소켓, 파일 또는 거기에 쓰여진 데이터를 처리 할 수있는 다른 것에 연결되어야한다.

하나의 옵션은 데이터를 처리하는 다른 스레드의 PipedInputStream에 연결된 PipedOutputStream으로 설정하는 것일 수 있습니다. 그러나 처리 스레드가 클라이언트 스레드를 따라갈 수없는 경우 문제가 발생합니다.

1

Jim Garrison이 말한 것처럼 OutputStream은 뭔가에 연결되어야합니다. 쓰여진 바이트는 어딘가로 가야합니다. 그렇지 않으면 버려 져야합니다.

내가해야 할 일은 Response이 (가) InputStream을 직접 감싸는 것 같습니다. 이 Response 등에 방법이 될 수 :

void setContent(InputStream content); 

그런 다음, 오히려 당신이 제공 OutputStream에 쓰기보다, 사용자는 그들이 원하는 당신의 프레임 워크를 복사 단지 것 InputStream의 어떤 종류의 제공 할 수있는 서블릿 OutputStream합니다. 당신은 기본적으로 사용자가 돈을 그렇게 OutputStream에 서면 당신이 사용하는 콜백을 제공 할 수있는 두 경우 모두

interface OutputProducer { 
    void writeTo(OutputStream out) throws IOException; 
} 

:

또한 그들이와 비슷한 인터페이스를 구현 뭔가를 제공 할 수 있도록 할 수 그것을 전달할 필요가 없습니다.

단지 출력 매개 변수를 사용하지 않아도되는 가치가 있는지는 모르지만 옵션입니다.

관련 문제