我有一个Backing Bean,其中我读取了未绑定到组件的参数。 Seam提供了读取get参数。我用了
@RequestParameter private String param1;
这样他就不会在验证错误上跳过我的动作方法,就像我使用时一样 < param name =“param1”value =“#{myBean.param1}”/> ,因为我不想呈现HTML响应,而是重用业务逻辑。相反,我抓住响应流并自己编写渲染的响应
FacesContext ctx = FacesContext.getCurrentInstance();
final HttpServletResponse resp = (HttpServletResponse)ctx.getExternalContext().getResponse();
resp.getOutputStream().write(xml.getBytes());
resp.getOutputStream().flush();
resp.getOutputStream().close();
ctx.responseComplete(); // render response phase done
我试图从HttpServletRequest inputStream中读取该文件,但该文件已经为空。有没有办法从JSF获取“文件”。我可以使用一个单独的servlet并在那里处理它,但这会打破我构建接口其余部分的一点点。
任何建议都是如此。
编辑:仅为了完整性输入流的代码
final HttpServletRequest request = (HttpServletRequest)ctx.getExternalContext().getRequest();
ServletInputStream stream = request.getInputStream();
int byt = stream.read(); // byt was -1
编辑编辑:对不起,很长的帖子。现在我做了一个单独的servlet。在那里我也得到一个空的输入流,即使Firefug说我传输了文件。怎么可能是空的?
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
ServletInputStream stream= req.getInputStream();
int test = stream.read(); // test == -1
servlet代码在单独的项目中工作正常,因此过滤器链中的一个JSF / Seam servlet必须删除数据。如果有人提示哪一个或如何检查。
答案 0 :(得分:2)
如果是一个POST和多部分请求,SeamFilter或者更确切地说是MultipartFilter正在检查每个请求。如果是这样,他们将请求包装在MultipartRequest中,并将文件放在单独的参数映射中。
final HttpServletRequestWrapper request = (HttpServletRequestWrapper)FacesContext.getCurrentInstance().getExternalContext().getRequest();
final ServletRequest innerRequest = request.getRequest();
if(innerRequest instanceof MultipartRequest){
byte[] imageData = ((MultipartRequest)innerRequest).getFileBytes("image");