• servlet乱码问题


    servlet乱码问题  

    出现乱码无非与页面的编码格式,servlet的编码格式,数据库编码格式和是用doGet方法还是doPost方法有关。

    页面出现乱码:
        修改<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>中的编码格式。
        
        在servlet中出现乱码, 解决办法:确保页面,servlet,数据库的编码格式一致,servlet的编码格式最好用过滤器转换,可减少代码冗余。
        确保页面,servlet编码格式一致具体如下:

    页面:

    <%@ page language="java" contentType="text/html; charset=utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    <style>
    body,input,textarea {
        font-size: 12px;
    }

    textarea {
         400px;
        height: 50px;
    }
    </style>
    </head>
    <body>
    <pre>
    <b>您输入了</b>:
    ${ param.text }

    </pre>
    <!--<form action="" method="post">-->
    <form action="${ param.request.requestURL }" method="post">
        <textarea name="text">${ param.text }</textarea> <br />
        <textarea name="text2">222222</textarea> <br />
        <input type="submit">
    </form>

    </body>
    </html>



    过滤器:

    package com.wcl.servlet.filter;

    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 CharacterEncodingFilter implements Filter {

        private String characterEncoding;
        private boolean enabled;
        
        @Override
        public void init(FilterConfig config) throws ServletException {
            // TODO Auto-generated method stub
            characterEncoding = config.getInitParameter("characterEncoding");
            enabled = "true".equalsIgnoreCase(characterEncoding.trim());
        }
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
            characterEncoding = null;
        }

        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            // TODO Auto-generated method stub
            
            if(enabled || characterEncoding != null){
                request.setCharacterEncoding(characterEncoding);
                response.setCharacterEncoding(characterEncoding);
                
            }
            
            chain.doFilter(request, response);
        }



    }



    在web.xml 中配置

    <!--encoding过滤器-->
        <filter>
            <filter-name>characterEncodingFilter</filter-name>
            <filter-class>com.wcl.servlet.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>characterEncoding</param-name>
                <param-value>utf-8</param-value>
            </init-param>
            <init-param>
                <param-name>enable</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>characterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
        

    这样就实现了页面和servlet的编码格式一致。数据库的格式可在数据库的配置文件中设置,详细请大家上网查阅。

    如果大家用的是doPost方法那么乱码问题到这里已经解决了。

    而用doGet方法请看下面内容:

    在做servlet的时候遇到这样一个问题:用doPost获得的参数只要加上“request.setCharacterEncoding("utf-8")”这样一行,则显示中文不会乱码,
    但是用doGet获得的参数加上“request.setCharacterEncoding("utf-8")”这一行后却依然乱码,解决方法如下:
        在你的Tomcat服务器根目录下找到conf/server.xml文件,在文件中找到这样一行,将其中的URIEncoding=""双引号内改为utf-8,即红色字体处。
        如下:
            <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/>

    struts框架出现的问题同样可以如此解决。

    ---------------

      1. response.sendRedirect("add_news.do?msg=中文");//用这个方法时,用request.getParameter("msg");可能就是乱码。 
      1. String msg = "中文";  
      2. response.sendRedirect("add_news.do?msg="+java.net.URLEncoder.encode(msg));//用这个方法时,用request.getParameter("msg");可能就OK了。






    -------------------------------------------------------------${param.text}的问题

    param不是JSP的内置对象, 是EL中的

    ${param.name}等价于request.getParameter("name"),{param[name]}也是一样的

    ${params.name}等价于request.getParameterValues("name")



    ${id} 意思是取出某一范围中名称为id的变量。
    它的取值范围Page,Request,Session,Application。
    ${param.id} 与输入有关,相对于 request.getParameter("id")。意思是获得输入的参数id。
    因为a.jsp提交到b.jsp过程中,id不属于Page,Request,Session,Application任何范围中的一个,所以取不到。
    而id是a.jsp传给b.jsp的一个参数,所以${param.id}取到值。
    Request的范围是指一个jsp页面发送请求到另一个jsp页面之间。
    在a.jsp里<%request.setAttribute("key","Test")%>
    当a.jsp转向b.jsp时,b.jsp可以得到a.jsp的变量key的值,而别的jsp页面是得不到值的。
    这里面的关键是a.jsp要转向b.jsp,在a.jsp加上<jsp:forward page="b.jsp"/>表示要转向b.jsp.否则b.jsp得不到a.jsp设置的key的值。




    两个jsp页面之间如何传递一个对象?比如一个List或者HashMap?
    答:
    用request.setAttribute("name",Object),request.getAttribute("name");
    或者session.setAttribute("name",Object),session.getAttribute("name");

    注意问题:

        如果用request,要注意request的范围仅限于同一个request对象;如果使用了form的"action"或者response.sendRedirect("xxx.jsp")等转发,
        则不再是同一个request对象,即用request.getAttribute("name")将取不到值。
        换成request.getRequestDispatcher("xxx.jsp").forward(request,response);
        才能共享request中数据

        如果用session,程序太慢,存在效率问题。






    http://www.blogjava.net/flysky19/articles/93421.html

  • 相关阅读:
    windows下Redis安装及使用
    DQL、DML、DDL、DCL的概念与区别
    成长路上破局思维:工具化时间管理
    git push 本地分支与远程分支关联
    vue elementUI table表格列动态渲染的案例
    flutter 页面频繁刷新节省页面性能的组件RepaintBoundary
    elementUI Table表格表头自定义
    vue 项目添加echarts图表
    flutter 高斯实现模糊
    flutter 监听软键盘的弹出和关闭
  • 原文地址:https://www.cnblogs.com/andy-wcl/p/3372040.html
Copyright © 2020-2023  润新知