版面调整调查!
返回列表 回复 发帖

JSP+STRUTS+MSSQL的中文问题终于搞定了!!

这问题困扰了我两天了~~~做了很多测试,在网上找了很多资料,终于还是比较圆满的解决了~~~

问题的出现:
不做任何字符处理,JSP页面发送中文参数给STRUTS进行业务处理,STRUTS将参数写入到数据库(MSSQL)~此时再从数据库将刚写入的东西返回到JSP页面~~这时问题出现了……不论是写入数据库的东西,还是从数据库里读出来的东西全是乱码~~ @_@

测试的过程:
不经过数据库,直接从JSP页面读取参数后回显,仍然是乱码@_@。。
测试各种字符集,包括utf-8,iso-8859-1,gb2312,gbk,所得到的东西也全部是乱码@_@~@_@~@_@
开始从网上找资料,发现问题是出在tomcat对中文字符的没有很好的处理~网上介绍了好多种方法,其中一个也是我解决中文乱码问题的方法~~

解决方法:
自己实现一个filter放到开发包里面,然后在WEB.XML里注册,同时将数据库的访问字符格式设置成filter里定义好的格式(通用utf-8)~~就可以解决了~~~其中自己实现filter的话在TOMCAT里有现成的文章~搜索下SetCharacterEncodingFilter,就可以找到了,具体内容见下面:

[qutoe]
package cola;  
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.FilterChain;
import java.io.IOException;
public class SetCharacterEncodingFilter implements Filter {
  protected FilterConfig filterConfig;
  protected String encodingName;
  protected boolean enable;
  public SetCharacterEncodingFilter() {
    this.encodingName = "utf-8";
    this.enable = false;
  }
  public void init(FilterConfig filterConfig) throws ServletException {
    this.filterConfig = filterConfig;
    loadConfigParams();
  }
  private void loadConfigParams()
{
    //encoding
    this.encodingName = this.filterConfig.getInitParameter("encoding");
    //filter enable flag...
    String strIgnoreFlag = this.filterConfig.getInitParameter("enable");
    if (strIgnoreFlag.equalsIgnoreCase("true"))
{
      this.enable = true;
    }
else
{
      this.enable = false;
    }
  }
  public void doFilter(ServletRequest request, ServletResponse response,
                       FilterChain chain) throws IOException, ServletException
{
    if(this.enable)  
{
      request.setCharacterEncoding(this.encodingName);
    }
    chain.doFilter(request, response);
  }
  public void destroy()
{
  }
} [/quote]

然后,在web.xml里注册,如下:
<!--filter-class元素对应过滤类的包路径,这里我放在cola包下-->
<!--filter-mapping的name与filter的name属性相同,serlvet-name这个属性重要!它指定为servlet-mapping的name,这里我是用的struts,所以设置成action,即处理所有.do结尾的action-->
<filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>cola.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</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>Set Character Encoding</filter-name>
    <servlet-name>action</servlet-name>
至此,JSP中文乱码问题可以告一段落了,相信以后应该不会碰到同样的问题了~~~
懒得去写几百年没写过的BLOG~~所以借个地方发东西~~~

闲看庭前花开花落

      
           漫随天外云卷云舒
      
import java.io.*;
import java.net.*;

public class FileClient{
        private String fileName;
        private String host;

        public FileClient(String host,String fileName){
                this.fileName = fileName;
                this.host = host;
        }

        public void receive(){
                try{
                        Socket s = new Socket(host,1111);
                        BufferedInputStream in = new BufferedInputStream(s.getInputStream());
                        RandomAccessFile out = new RandomAccessFile(fileName,"rw");
                        byte[] buf = new byte[1024];
                        int i;
                        while ((i=in.read(buf))!=-1){
                                out.write(buf,0,i);
                        }
                        out.close();
                        in.close();
                        s.close();

                }
                catch(Exception e){
                        e.printStackTrace();
                }

        }

        public static void main(String[] args){
                long beginTime = System.currentTimeMillis();
                FileClient fc = new FileClient("localhost","D:\\TEXT222.exe");
                fc.receive();
                long endTime = System.currentTimeMillis();
                System.out.println("Cost time " + (endTime-beginTime)/1000 + "seconds");
        }
}



import java.io.*;
import java.net.*;

public class FileServer{
        private String fileName;

        public FileServer(String fileName){
                this.fileName = fileName;
        }

        public void server(){
                try        {
                        ServerSocket ss = new ServerSocket(1111);
                        Socket s = ss.accept();
                        BufferedOutputStream out = new BufferedOutputStream(s.getOutputStream());
                        RandomAccessFile raf = new RandomAccessFile(fileName,"r");
                        byte[] buf = new byte[1024];
                        int i;
                        while((i=raf.read(buf))!=-1){
                                out.write(buf,0,i);
                        }
                        out.flush();
                        out.close();
                        raf.close();
                        ss.close();
                }
                catch (Exception e)
                {
                        e.printStackTrace();
                }
        }

        public static void main(String[] args){
                FileServer fs = new FileServer("D:\\test.exe");
                fs.server();
        }
}

闲看庭前花开花落

      
           漫随天外云卷云舒
      
返回列表