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

举报
yd_273762914 发表于 2020/12/03 00:36:51 2020/12/03
【摘要】   在做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");

 

 


  
  1. <%@page import="java.net.URLDecoder"%>
  2. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  3. <%
  4. String path = request.getContextPath();
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  6. %>
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11. <title>My JSP 'test.jsp' starting page</title>
  12. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  13. <meta http-equiv="pragma" content="no-cache">
  14. <meta http-equiv="cache-control" content="no-cache">
  15. <meta http-equiv="expires" content="0">
  16. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  17. <meta http-equiv="description" content="This is my page">
  18. <!--
  19. <link rel="stylesheet" type="text/css" href="styles.css">
  20. -->
  21. <style type="text/css">
  22. .news {
  23. width: 800px;
  24. margin: 0 auto;
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <%
  30. request.setCharacterEncoding("UTF-8");
  31. response.setContentType("text/html;charset=GBK");
  32. String newsbody = new String(request.getParameter("editorValue").getBytes("iso-8859-1"),"UTF-8");
  33. %>
  34. <div class="news">
  35. <%=newsbody%>
  36. </div>
  37. </body>
  38. </html>

 

 

 

 

 

 

String newsbody = new String(request.getParameter("editorValue").getBytes("iso-8859-1"),"UTF-8");  
 

 

 

给一个编码过滤器参考

 


  
  1. import java.io.IOException;
  2. import java.nio.charset.Charset;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.annotation.WebFilter;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletRequestWrapper;
  12. import org.apache.commons.lang.StringUtils;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. /**
  16. * @description: 编码过滤器, 解决get或post方式的乱码问题
  17. */
  18. @WebFilter(filterName = "encodingFilter", urlPatterns = "/*")
  19. public class EncodingFilter implements Filter {
  20. private static final Logger logger = LoggerFactory.getLogger(EncodingFilter.class);
  21. private String encode = "UTF-8";// 默认编码集
  22. private String containers_encode="ISO8859-1";//web容器编码
  23. @Override
  24. public void destroy() {
  25. logger.info("====过滤器正在销毁====");
  26. }
  27. @Override
  28. public void doFilter(ServletRequest request, ServletResponse response,
  29. FilterChain chain) throws IOException, ServletException {
  30. HttpServletRequest httpRequest = (HttpServletRequest) request;
  31. if (httpRequest.getMethod().equals("POST")) {
  32. logger.debug("post请求,直接设置编码");
  33. // 直接设置编码
  34. request.setCharacterEncoding(encode);
  35. } else {
  36. // 重写HttpServletRequestWrapper进行内部转码
  37. logger.debug("get请求,尝试转码");
  38. request = new Request(httpRequest);
  39. }
  40. // 设置返回客户端编码
  41. response.setCharacterEncoding(encode);
  42. chain.doFilter(request, response);// 交替权利给下一个过滤器或servlet服务
  43. }
  44. class Request extends HttpServletRequestWrapper {
  45. /* 构造函数 */
  46. public Request(HttpServletRequest request) {
  47. super(request);
  48. }
  49. private HttpServletRequest getHttpServletRequest() {
  50. return (HttpServletRequest) super.getRequest();
  51. }
  52. /**
  53. * 转换由表单读取的数据的内码
  54. *
  55. * @param str
  56. * @return
  57. */
  58. private String changeEncode(String str) {
  59. if (needEncoding(str)) {
  60. try {
  61. byte[] bytes = str.getBytes(containers_encode);
  62. logger.debug("数据:{} 转码结果:{}", str,
  63. new String(bytes, encode));
  64. return new String(bytes, encode);
  65. } catch (Exception e) {
  66. e.printStackTrace();
  67. }
  68. return null;
  69. }
  70. return str;
  71. }
  72. /* 判断字符串是否需要转码 */
  73. private boolean needEncoding(String str) {
  74. /* 如果为汉字,则不需要转码 */
  75. return Charset.forName(containers_encode).newEncoder().canEncode(str);
  76. }
  77. @Override
  78. /* 单个参数 */
  79. public String getParameter(String arg) {
  80. String value = getHttpServletRequest().getParameter(arg);
  81. if (value != null) {
  82. return changeEncode(getHttpServletRequest().getParameter(arg));
  83. }
  84. return getHttpServletRequest().getParameter(arg);
  85. }
  86. @Override
  87. /* 多个参数 */
  88. public String[] getParameterValues(String arg) {
  89. String values[] = getHttpServletRequest().getParameterValues(arg);
  90. if (values != null) {
  91. for (int i = 0; i < values.length; i++) {
  92. values[i] = changeEncode(values[i]);
  93. }
  94. }
  95. return values;
  96. }
  97. }
  98. @Override
  99. public void init(FilterConfig config) throws ServletException {
  100. logger.debug("====编码过滤器启动====");
  101. /* 读取配置参数的编码集 */
  102. String encoding = config.getInitParameter("encode");
  103. if (StringUtils.isNotBlank(encoding)) {
  104. this.encode = encoding;
  105. }
  106. }
  107. }

 



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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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