我的目的是想把jsp页面共通的设置放在一个文件里,然后其它文件使用include指令和include标签包含它,这样修改比较方便。
但是关于字符集发现设置包含文件没有用,因为jsp翻译时不会理会被包含文件的contentType设置。
但是我实在不想再每个页面中都设置<%@page contentType="text/html; charset=gb2312" %>
注意:如果不使用国际化的方法(即所有中文输出采用属性文件key值对应的方法,没办法,目前为了快都把中文直接写在jsp里了。),有没有别的解决方案?
谢谢解答!

解决方案 »

  1.   

    可是你的这样的做法
    如果有include 的多个页面要互相传值怎么办
    这个不好
    除非你的其他页面不需要传值
      

  2.   

    楼上的包含页面和互相传值有什么关系,公共页面不需要和其它页面传递业务值。
    而且系统使用的是struts2框架,页面间的传值如果参数简单就放到配置文件中,复杂一般使用session。
    系统是禁止jsp之间直接跳转的,所有页面的跳转一定要经过控制器,即使是简单的返回动作。顺便说一下,我参照网上所说的过滤器设置方法但不是不知道为什么不行。
    大家帮我分析一下,谢谢!具体如下:web.xml中增加如下语句
    <filter>
     <filter-name>encoding</filter-name>
     <filter-class>comtools.EncodingFilter</filter-class>
     <init-param>
      <param-name>encoding</param-name>
      <param-value>gb2312</param-value> 
     </init-param>
     </filter>
              
     <filter-mapping>        
      <filter-name>encoding</filter-name>        
      <url-pattern>/*</url-pattern>       
     </filter-mapping>其中comtools.EncodingFilter的代码如下(相当于拦截器拦截所有命令将字符集设置为web文件配置的字符集)
    package comtools;
    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;
    import javax.servlet.http.HttpServletRequest;
     
    public class EncodingFilter implements Filter
    {
      private String targetEncoding = "gb2312";
      protected FilterConfig filterConfig;
       
      public void init(FilterConfig config) throws ServletException {
          this.filterConfig = config;
          this.targetEncoding = config.getInitParameter("encoding");
      }
      public  void doFilter(ServletRequest srequest, ServletResponse  sresponse,FilterChain chain)
          throws IOException, ServletException {
          HttpServletRequest request = (HttpServletRequest)srequest;
          request.setCharacterEncoding(targetEncoding);//把请求用指定的方式编码
          // 把处理发送到下一个过滤器
          chain.doFilter(srequest,sresponse);  
      }
      
      public void destroy()
      {
       this.filterConfig=null;
      }
     
      public void setFilterConfig(final FilterConfig filterConfig)
      {
       this.filterConfig=filterConfig;
      }
    }
    我感觉这样应该没有问题了,但页面依旧是乱码,只有设置了contentType才有效,有经验的帮有请帮忙分析一下,谢谢!
      

  3.   

    复杂一般使用session??
    一个两个可以
    100 几百呢??
    include会造成页面速度变慢
    试想:
    读一个页面 快
    or
    读n个页面 快
    如果页面多的话
      

  4.   

    楼上的兄弟应该对MVC框架非常熟悉了,那请教:
    问题1:
    假使MVC采用struts2(1也行吧),页面之间传递参数您是使用什么方案解决的?
    我的理解一般来说页面之间传递业务参数都是比较少的,一般都是传递一个或少许主键值,在下一个页面进行持久层访问后再把需要的数据取出。
    struts1一般是放到actionform里,但我认为那样代码耦合较高,因此我一般是放在struts2的配置文件中传递参数(当然参数值是动态,只是参数个数是固定的)。对于有些业务页面,比如复杂查询,因为输入的查询条件很多,查询页面和结果页面是2个页面,当查询页面跳转结果页面时就会用到session来传递查询参数,但是您可能误会了,当系统离开结果页面时我们会把session中不再用的值清除。所以不存在你担心的什么100几百的问题。
    如果您认为我的设计有问题,那么请问您的页面之间跳转时参数是如何传递的?请赐教。
    另外小弟有些疑惑,难道session就不能用了吗?典型的网络购物车模式,这么多页面的数据需要保留,难道不用session?用户在多页面之间输入的数据如何保留?我以为,关键是要在适当的地方吧不需要的参数值及时从session里清除即可。如果您有更好的方案,不胜赐教。
    问题2:
    请问tiles框架是不是没有采用类似include的方法(我指的是后台代码),它是高度集成页面的一种前台显示框架方案。
    如果您觉得包含页面不可取,那您是如何解决每个页面都需要相同页头、页脚代码重复书写问题的?(不会每个页面都写这些代码吧,呵呵)
    请赐教,谢谢。
      

  5.   

    <%@page contentType="text/html; charset=gb2312" %> 这个无论怎样,我个人都强烈建议你写上。1 大多数编辑器,可以自动为你加上这一行
    2 而且,在你的页面出现多个编码类型时,只是唯一的方法,比如大部分是gb2312,可有一部分是UTF-8至于filter等解决方法,看上去也不错,但我个人不推荐
      

  6.   

    谢谢楼上大牛老兄的回复,您可能说的对,但我不是太理解filter解决方法为什么不可取?
    我的顾虑不是每页加一行<%@page contentType="text/html; charset=gb2312" %> ,这个没有问题的,拷贝粘贴即可。
    但是如果哪天系统想采用utf-8编码,那岂不是所有页面都要改一遍?可能你会说使用某个文件编辑工具统一改,可毕竟这不是标准的解决方案(不是继承关系,谁也不敢说都改的对),还是免不了要测试一遍。各位做过实际项目的朋友谈谈自己的解决方案?谢谢!