一个关于Freemark和servelet组合的问题?请知道的朋友帮忙一下~

[code="java"]Map root = new HashMap();

root.put("message", "Hello World!");

Template t = cfg.getTemplate("test.ftl");

System.out.println(t.getEncoding());//GBK编码

response.setContentType("text/html; charset=" + t.getEncoding());

Writer out = response.getWriter();

try {

t.process(root, out);

} catch (TemplateException e) {

throw new ServletException(

"Error while processing FreeMarker template", e);

} [/code]

这是http get或者post方法里面的内容.主要问题是try...catch..部分的问题.里面执行的是Template中的process方法.
执行这个方法可能会抛出异常.

问题:
抛出异常时无法设置response的状态码.返回的居然还是200状态码.而我请求端是根据状态码来处理的.出异常了还200的话.我会请求端会得到异常信息直接返回给用户.这样是不行的.请问下,抛出异常时改如何设置response的错误状态码呢??

执行t.process(root,out)前设置是有效的.执行后设置是无效的..知道的朋友们帮忙回答下~~ 因为没分了.所以没办法给分.只能表示万分感谢了~~~

15个回答

[code="java"]
CharArrayWriter out = new CharArrayWriter(1000);
//...
resp.getWriter().write(out.toCharArray());
resp.flushBuffer();
[/code]
这样不就可以把它写入到响应了吗!

你是不是在 process 中对 out 进行了什么操作啊?把对 out 的操作贴出来吧。
另外,你先试试下面的方法呢,在 catch 里面加上:
[code="java"]
response.reset();
response.setXXXX(); // 设置response状态码
[/code]

1,你把异常打出来,先不要重新抛出
2,在process后面加上
out.flush();
out.close();试试。

你异常先不要抛出,打出来,把你异常贴出来吧

那么估计是你ftl文件里面的属性没有对应。

[quote]恩.是这样的.我没有ftl文件.直接在内存中弄的.这个异常是我故意弄出来的.因为我在测试的时候.得到了这边的异常信息.异常信息不应该返回给用户.但是出异常的时候.response无法设置错误码.还是200.所以才看看出现异常时要怎么样才能重新设置response的错误码 [/quote]

两个比较常用的方法是setStatus和sendError

[quote]恩 这两个都试过了.只要在执行process方法之后.就没办法设置了.执行之前还是设置的有效.执行之后设置就无效了~~ 难道还要去看process源码.再修改源码..泪奔了.. [/quote]

别急啊,我觉得执行之后,已经修改了response并且刷新了,所以你执行之后再加上
out.flush();
out.close();试试。

恩,你试试再说吧。

我估计在process里面response就已经被刷新了。

因为报java.lang.IllegalStateException这个异常就说明sendError调用了多次。

共15条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!