为 Java Web 应用程序中的所有 jsps 设置默认字符编码

Setting default character encoding for all jsps in a Java Web Application

奇怪的场景。

我有一个支持 UTF-8 字符的 Java Web 应用程序。即它们显示并可以在应用程序上输入

我还有另一个应用程序访问前一个应用程序,如下基本片段

final URL urlObject = new URL("someurlyadayada");
final URLConnection connection = urlObject.openConnection(); 
...
....
connection.connect(); 
final InputStream is = connection.getInputStream();
InputStreamReader isr = new InputStreamReader(is,"UTF8");
final OutputStream out = new FileOutputStream(new File(somelocalfile));
OutputStreamWriter osw = new OutputStreamWriter(out,"UTF8");

int read = 0;

while ((read = isr.read()) != -1) {
    osw.write(read);
    }
....

在浏览器中查看给定页面时,所有内容都呈现良好的 UTF-8 字符和所有字符。但是当使用上面的代码片段时,字符会损坏,或者返回为 ???????? 或者只是错误的字符。

到目前为止,我已经尝试将 input/output 流编写器以及应用程序中的请求和响应对象的编码设置为 UTF-8。

这部分适用于给定具有以下行的 JPS

Прочтено Прочтено,Прочтено,
<%=someJavaMethodWhichReturnsTheAboveLineAlso()%>

在浏览器中,这呈现得很好:

Прочтено Прочтено,Прочтено,

Прочтено Прочтено,Прочтено,

但是使用页面解析器会return

оÑÑено ÐÑоÑÑеноÑоÑÑено ÐÑоÑÑено

Прочтено Прочтено,Прочтено,

如果我在我所有页面的顶部设置 contentType="text/html;charset=UTF-8" JSPs 它解决了这两个问题,但我被更高的人告知更新 100s of JSPs 有这个不可能。

我也觉得这是我应该能够设置一次并将其用作默认值的东西。

此处的最佳做法是什么。关于在 JSP 上设置内容,我有两种想法。不确定这样做是错误的还是我们一开始就没有这样做是错误的。

我仔细寻找解决方案并取得了不同程度的成功

您可以在 web.xml 文件中为所有 JSP 配置默认字符编码,这样就可以在全局范围内完成

<jsp-config>   
    <jsp-property-group id="defaultUtf8Encoder">
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>     
</jsp-config>

您还可以创建一个过滤器来设置响应字符编码(以及最终的内容类型),如下所示:(下面的示例进行字符编码)

public class CharsetFilter
  implements Filter {

  String encoding = "UTF-8";

  public void destroy() {
    /* Do nothing */
  }

  public void doFilter(ServletRequest request,
         ServletResponse response,
         FilterChain chain) throws IOException, ServletException {

    response.setCharacterEncoding(encoding);
    chain.doFilter(request, response);        
  }

  public void init(FilterConfig config) throws ServletException {       
  }
}

然后在web.xml文件中定义过滤器

<filter>
    <filter-name>
        charsetFilter
    </filter-name>
    <filter-class>
        your.filter.package.CharsetFilter
    </filter-class>        
</filter>                                         

<filter-mapping>
    <filter-name>charsetFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

请注意,我正在将过滤器应用于使用任何网络应用程序资源的 /*。如果您希望过滤器影响每一个 Web 资源,这可能会很方便

希望这能帮您解决问题