Cela peut être un peu déroutant mais j'ai des problèmes. Mon but est de prendre un document HTML en entrée, puis de traiter ce document et d'utiliser les données HTML pour sortir un document image. Par exemple, un utilisateur demandera une URL, avec un peu d'action = png dans la chaîne de requête, puis le filtre sera appelé pour l'URL et le document d'image de sortie.Comment sortir un document binaire basé sur un document HTML en utilisant des filtres en Java
J'ai tout essayé mais dans mon environnement (Websphere), je ne peux sortir que d'un seul type. Si le type d'entrée est text/html alors je ne peux sortir qu'un document texte, je n'arrive pas à sortir un document binaire. Pourquoi? Parce que j'obtiens une exception d'état illégale à chaque fois.
[29/01/09 17: 59: 57: 576 EST] 00000020 SystemErr R java.lang.IllegalStateException: SRVE0209E: Writer déjà obtenu [29/01/09 17: 59: 57: 576 EST] 00000020 SystemErr R à com.ibm.ws.webcontainer.srt.SRTServletResponse.getOutputStream (SRTServletResponse.java:505)
J'utilise le code pseudo ne pas révéler tout mon code:
<filter>
<filter-name>TestFilter</filter-name>
<filter-class>
com.util.TestFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>TestFilter</filter-name>
<url-pattern>/index_test2.html</url-pattern>
</filter-mapping>
La classe wrapper le code est essentiellement ceci:
public class ContentCaptureServletResponse extends HttpServletResponseWrapper {
private ByteArrayOutputStream contentBuffer;
private PrintWriter writer;
public PrintWriter getWriter() throws IOException {
if (writer == null) {
contentBuffer = new ByteArrayOutputStream();
writer = new PrintWriter(contentBuffer);
}
return writer;
}
public String getContent(){
try {
writer = getWriter();
} catch (IOException e) {
e.printStackTrace();
}
writer.flush();
String xhtmlContent = new String(contentBuffer.toByteArray());
System.out.println(xhtmlContent);
return xhtmlContent;
}
}
Et le code de filtre est le suivant:
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
final String renderType = request.getParameter("R");
final String renderClassName = request.getParameter("C");
if ((renderType != null) && (renderClassName != null)) {
try {
this.setFilterChain(filterChain);
response.setContentType("image/png");
PrintWriter out = response.getWriter();
// I call getWriter but not BOTH!
//response.getOutputStream();
response.getWriter();
// Build up the HTML document into a string.
CaptureResponse capContent = new CaptureResponse(response);
this.mainFilterChain.doFilter(req,);
String myString = capHtmlContent.getContent();
// What I really want to do here is output an output stream
// so I can write a binary image
processStr(myString);
response.getOutputStream();
response.write(binaryimage)
} catch (Exception e) {
e.printStackTrace();
}
// No data will be output to the user.
} else {
filterChain.doFilter(request, response);
} // End of if-else
} // End of the method.
Le code fonctionne si je veux prendre un document texte html d'entrée. Je suppose en raison du flux de l'éditeur libre. Mais j'ai du mal à passer à un format différent. Fondamentalement, parce que je ne peux pas appeler response.getOutputStream()
Je pense que je l'ai compris. Je peux utiliser 'response.getOutputstream'. Mais j'avais un code dans lequel le navigateur ne reconstruisait pas la page, il semblait donc que je recevais une réponse nulle. Fondamentalement, mon approche va fonctionner. –
Pouvez-vous expliquer pourquoi vous avez besoin d'utiliser response.getWriter()? –
En fait, je peux être un peu perdu. Il semble que cela puisse être un bug avec Websphere 6.1/RAD7. Sur response.getWriter(), j'ai pensé que j'en avais besoin parce que quand je l'utilise, le code a fonctionné correctement. –