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

原文地址:https://www.cnblogs.com/andy-wcl/p/3372040.html