JSP系列之页面跳转编码设置

举报
yd_273762914 发表于 2020/12/03 00:36:51 2020/12/03
5.2k+ 0 0
【摘要】   在做JSP系统时经常遇到的就是编码问题 而这个服务器可以是Tomcat、Weblogic,Tomcat服务器默认的编码为iso-8859-1,Weblogic默认的编码为UTF-8,所以程序运行时要注意编码设置 现在我们以一个jsp页面的代码,解释这些编码设置pageEncoding="UTF-8"说的是页面的编码,比如标题栏<title>还有其它内容等等 <me...

在做JSP系统时经常遇到的就是编码问题

而这个服务器可以是Tomcat、Weblogic,Tomcat服务器默认的编码为iso-8859-1,Weblogic默认的编码为UTF-8,所以程序运行时要注意编码设置

现在我们以一个jsp页面的代码,解释这些编码设置pageEncoding="UTF-8"说的是页面的编码,比如标题栏<title>还有其它内容等等

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">这代码说的是上下文编码,若我们设置charset="UTF-8",那我们在点击这个页面跳到的那个Servlet或者jsp页面就要用"request.setCharacterEncoding("UTF-8");"和"String newsbody = new String(request.getParameter("editorValue").getBytes("iso-8859-1"),"UTF-8");"意思是设置接收到的字符串编码为UTF-8,响应的编码设置,可以用response.setContentType("text/html;charset=UTF-8");


      <%@page import="java.net.URLDecoder"%>
      <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
      <%
      String path = request.getContextPath();
      String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
      %>
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
      <html>
       <head>
      <base href="<%=basePath%>">
      <title>My JSP 'test.jsp' starting page</title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     	<meta http-equiv="pragma" content="no-cache">
     	<meta http-equiv="cache-control" content="no-cache">
     	<meta http-equiv="expires" content="0">
     	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
     	<meta http-equiv="description" content="This is my page">
     	<!--
       <link rel="stylesheet" type="text/css" href="styles.css">
       -->
     	<style type="text/css">
     		.news {
      width: 800px;
      margin: 0 auto;
      		}
      </style>
       </head>
       <body>
      <%
       request.setCharacterEncoding("UTF-8");
       response.setContentType("text/html;charset=GBK");
       String newsbody = new String(request.getParameter("editorValue").getBytes("iso-8859-1"),"UTF-8");
       %>
      <div class="news">
      <%=newsbody%>
      </div>
       </body>
      </html>
  
 
String newsbody = new String(request.getParameter("editorValue").getBytes("iso-8859-1"),"UTF-8");  
 

给一个编码过滤器参考


      import java.io.IOException;
      import java.nio.charset.Charset;
      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.annotation.WebFilter;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletRequestWrapper;
      import org.apache.commons.lang.StringUtils;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      /**
       * @description: 编码过滤器, 解决get或post方式的乱码问题
       */
      @WebFilter(filterName = "encodingFilter", urlPatterns = "/*")
      public class EncodingFilter implements Filter {
     	private static final Logger logger = LoggerFactory.getLogger(EncodingFilter.class);
     	private String encode = "UTF-8";// 默认编码集
       private String containers_encode="ISO8859-1";//web容器编码
       @Override
       public void destroy() {
       logger.info("====过滤器正在销毁====");
       }
       @Override
       public void doFilter(ServletRequest request, ServletResponse response,
       FilterChain chain) throws IOException, ServletException {
       HttpServletRequest httpRequest = (HttpServletRequest) request;
       if (httpRequest.getMethod().equals("POST")) {
       logger.debug("post请求,直接设置编码");
       // 直接设置编码
       request.setCharacterEncoding(encode);
       } else {
       // 重写HttpServletRequestWrapper进行内部转码
       logger.debug("get请求,尝试转码");
       request = new Request(httpRequest);
       }
       // 设置返回客户端编码
       response.setCharacterEncoding(encode);
       chain.doFilter(request, response);// 交替权利给下一个过滤器或servlet服务
       }
       class Request extends HttpServletRequestWrapper {
       /* 构造函数 */
       public Request(HttpServletRequest request) {
       super(request);
       }
       private HttpServletRequest getHttpServletRequest() {
       return (HttpServletRequest) super.getRequest();
       }
       /**
       * 转换由表单读取的数据的内码
       *
       * @param str
       * @return
       */
       private String changeEncode(String str) {
       if (needEncoding(str)) {
       try {
       byte[] bytes = str.getBytes(containers_encode);
       logger.debug("数据:{} 转码结果:{}", str,
       new String(bytes, encode));
       return new String(bytes, encode);
       } catch (Exception e) {
       e.printStackTrace();
       }
       return null;
       }
       return str;
       }
       /* 判断字符串是否需要转码 */
       private boolean needEncoding(String str) {
       /* 如果为汉字,则不需要转码 */
       return Charset.forName(containers_encode).newEncoder().canEncode(str);
       }
       @Override
       /* 单个参数 */
       public String getParameter(String arg) {
       String value = getHttpServletRequest().getParameter(arg);
       if (value != null) {
       return changeEncode(getHttpServletRequest().getParameter(arg));
       }
       return getHttpServletRequest().getParameter(arg);
       }
       @Override
       /* 多个参数 */
       public String[] getParameterValues(String arg) {
       String values[] = getHttpServletRequest().getParameterValues(arg);
       if (values != null) {
       for (int i = 0; i < values.length; i++) {
       values[i] = changeEncode(values[i]);
       }
       }
       return values;
       }
       }
       @Override
       public void init(FilterConfig config) throws ServletException {
       logger.debug("====编码过滤器启动====");
       /* 读取配置参数的编码集 */
       String encoding = config.getInitParameter("encode");
       if (StringUtils.isNotBlank(encoding)) {
       this.encode = encoding;
       }
       }
      }
  
 



文章来源: smilenicky.blog.csdn.net,作者:smileNicky,版权归原作者所有,如需转载,请联系作者。

原文链接:smilenicky.blog.csdn.net/article/details/51108324

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。