我正在将一份已有6年历史的申请转换为Seam 2.2。 该应用程序用于在java 1.4和weblogic 8中运行。 它只使用jsp和servlet。 在我使用的一个servlet中:
public void doGet (HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException
{
//...
ServletOutputStream out = = res.getOutputStream();
// displaying a lot of messages
// after each println() I do a flush()
out.println("lots of messages.....");
out.flush();
out.close();
//...
}
运行应用程序时,会立即在浏览器中看到消息。
当我在Weblogic 10和Java 1.6中使用Seam 2.2运行时,浏览器中不会立即显示消息。 只有当servlet完成运行时才会。
我可以更改一些东西来解决这个问题吗?
我不想将servlet更改/转换为Seam组件。 servlet运行正常。唯一的事情是将消息刷新到浏览器窗口,这只发生在servlet停止运行之后。
可能原因是servlet现在通过Seam过滤器:
<filter>
<filter-name>Seam Filter</filter-name>
<filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Seam Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
答案 0 :(得分:2)
你正在运行一个servlet - 这里与Seam没有任何关系。我怀疑你需要重新评估你的设计,因为从servlet到Seam结构并没有真正的转换。
答案 1 :(得分:2)
原因可能是请求通过SeamFilter,正如您所想的那样。 我认为不是SeamFilter本身缓冲来自servlet的数据流,而是缓冲区链中调用的Ajax4Jsf过滤器。
如果类路径中有RichFaces,则会有一个seam组件在链中注册Ajax4jsf过滤器。即,Seam组件是org.jboss.seam.web.ajax4jsfFilter
。
如果您不需要RichFaces,请尝试将其从类路径中删除。如果您需要它,我建议您覆盖org.jboss.seam.web.ajax4jsfFilter
以跳过指向您的servlet的请求的Ajax4Jsf过滤器。
另一种可能的解决方案是将过滤器中的servlet转换为Seam组件(请参阅@Filter注释),并使用around属性将其定位在链的开头。类似的东西:
@Name("FormerServlet")
@Scope(STATELESS)
@BypassInterceptors
@Filter(around = "org.jboss.seam.web.ajax4jsfFilterInstantiator")
public class FormerServletFilter implements Filter
{
protected void init(FilterConfig filterConfig) throws Exception
{
}
protected void doDestroy()
{
}
/**
* Performs the filtering for a request.
*/
protected void doFilter(final HttpServletRequest request, final HttpServletResponse response,
final FilterChain chain) throws Exception
{
if (thisRequestShoudBeManagedByMyServlet(request) )
{
// do here what you previously did in the servlet
} else
{
// go ahead with the Seam lifecycle
chain.doFilter(request, response);
}
}