2010-04-26 78 views
1

是否有可能让JSP页面不响应设置任何内容类型?在我的设置中,JSP不直接生成响应,而是直接生成中间表示,然后由附加的Java代码处理,然后根据此代码创建HTML或JSON。那么,我可以以某种方式使JSP 不是在响应中设置content-type并将其留给中间代码?如果我只是在JSP中删除contentType="...",它仍然默认为text/html使JSP页面未设置响应内容类型

回答

1

您可以使其忽略JSP页面设置的内容类型。这足够好吗?
你怎么做水暖?

基本思路是实现一个ServletResponseWrapper,重写对setContentType的调用,然后使用过滤器将此响应传递给JSP而不是真实的响应。

ResponseWrapperToIgnoreContentType.java

import javax.servlet.ServletResponse; 
import javax.servlet.ServletResponseWrapper; 

public class ResponseWrapperToIgnoreContentType extends ServletResponseWrapper{ 

    public ResponseWrapperToIgnoreContentType(final ServletResponse response) { 
     super(response);   
    } 

    @Override 
    public void setContentType(final String type) { 
     System.out.println("Ignoring call to set the content type to : " + type); 
    } 
} 

过滤器应用它:

import java.io.IOException; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 

public class ResponseContentTypeFilter implements Filter{ 

    @Override 
    public void destroy() { 

    } 

    @Override 
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { 
     chain.doFilter(request, new ResponseWrapperToIgnoreContentType(response)); 
    } 

    @Override 
    public void init(final FilterConfig filterConfig) throws ServletException { 

    } 

} 

编辑:只是发现在我的逻辑存在缺陷。在调用response.getWriter()之前,需要设置内容类型,以便它可以使用正确的字符编码。 不知道如果这会影响你。

+0

谢谢,这可能是我会做的。我会在后面对这些假响应对象上的内容类型进行分类。 – doublep 2010-04-27 16:35:49

0

没有。

为什么不在你正在创建的类中存储首选的内容类型,并为它生成访问器并让JSP从中获取它?

+0

“有JSP从那里得到它” - 如何? – doublep 2010-04-26 19:01:12