转发和重定向之间的区别所引起中文乱码问题

原创 2007年09月17日 16:28:00


首先我想说一下我要实现的东西,其实是相当简单,在一个JSP页面通过FORM表单查询ID号的数据信息,将ID号提交给一个Servlet,然后由servlet返回到当前的JSP

页面.具体的代码如下:

//JSP表单页面代码如下
<%@ page language="java" import="java.util.*,database.*" contentType="text/html;charset=gb2312"  %>
<%
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>

   
    <title>My JSP 'dtudata.jsp' starting page</title>
   
 <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="dtu,dtu,dtu">
 <meta http-equiv="description" content="This is my dtudata.jsp">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->

  </head>
 
  <body>
 
  <form  method="get" action="DTUServlet" >
   <table>
   <tr><td><input type="text" name="id"/></td><td><input type="submit" value="提交"/></td></tr>
   </table>
   </form>

   <%
 
  if(request.getParameter("ID")!=null){
    String data=request.getParameter("ID");
    out.println("<center><p style=color:#3300FF;font-size:18px>ID"+data+"无查询结果,请确认输入的Modem编号</p></center>");

   }else{
   out.println("");
}

   %>
 
   
      <%
 if(session.getAttribute("modemdata")!=null){
   response.setContentType("text/html");
   out.println(" <table align=left><tr align=center><td width=80 align=center>模板ID</td><td  width=100>接收数据长度</td><td  width=180>接收数

据时间</td><td >接收的数据</td></tr>");
   ArrayList al=(ArrayList)session.getAttribute("modemdata");
   for(int i=0;i<al.size();i++){
   ModemDataBean md=new ModemDataBean();
   md=(ModemDataBean)al.get(i);
   out.println("<tr><td align=center width=80>"+md.getID()+"</td>");
   out.println("<td  width=100 align=center>"+md.getlength()+"</td>");
   out.println("<td  width=180>"+md.getReceiveTime()+"</td>");
   out.println("<td>"+md.getData()+"</td></tr>");
   }
  }

    %>
  </body>
</html>

 

//=======servlet页面代码如下
package servletPackage;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import database.DataDeal;

public class DTUServlet extends HttpServlet {

 /**
  * Constructor of the object.
  */
 public DTUServlet() {
  super();
 }

 /**
  * Destruction of the servlet. <br>
  */
 public void destroy() {
  super.destroy(); // Just puts "destroy" string in log
  // Put your code here
 }

 /**
  * The doGet method of the servlet. <br>
  *
  * This method is called when a form has its tag value method equals to get.
  *
  * @param request the request send by the client to the server
  * @param response the response send by the server to the client
  * @throws ServletException if an error occurred
  * @throws IOException if an error occurred
  */
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  response.setContentType("text/html");
  PrintWriter out = response.getWriter();
 
    String id=request.getParameter("id");
  
  System.out.println("id========="+id);
  ArrayList al=DataDeal.getDTUIDData(id);
  System.out.println("arraylist=========="+al);
  if(al.size()!=0){
  HttpSession hs=request.getSession();
  hs.setAttribute("modemdata",al);
  //request.getRequestDispatcher("dtudata.jsp").forward(request,response);
  response.sendRedirect("dtudata.jsp");
  }else{
   
   response.sendRedirect("dtudata.jsp?ID="+id);
  }
  
 }

 /**
  * The doPost method of the servlet. <br>
  *
  * This method is called when a form has its tag value method equals to post.
  *
  * @param request the request send by the client to the server
  * @param response the response send by the server to the client
  * @throws ServletException if an error occurred
  * @throws IOException if an error occurred
  */
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  response.setContentType("text/html");
  PrintWriter out = response.getWriter();
  out
    .println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">");
  out.println("<HTML>");
  out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
  out.println("  <BODY>");
  out.print("    This is ");
  out.print(this.getClass());
  out.println(", using the POST method");
  out.println("  </BODY>");
  out.println("</HTML>");
  out.flush();
  out.close();
 }

 /**
  * Initialization of the servlet. <br>
  *
  * @throws ServletException if an error occure
  */
 public void init() throws ServletException {
  // Put your code here
 }

}


//===CONN
package database;

import java.io.File;
import java.sql.*;
import java.util.logging.*;

public class Conn {
 private static Connection conn;
 
 public static Connection getDBConn(){
  
  try {
   Class.forName("com.mysql.jdbc.Driver");
   conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/kydata?

user=root&password=123456&useUnicode=true&characterEncoding=GBK");
   
  } catch (Exception e) {
   Logger logger=Logger.getLogger(Conn.class.getName());
   logger.fine("===数据库异常===="+e);
   
  }
  return conn;
  
 }

}


//===数据库处理
package database;

import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.logging.Logger;

import test.ServerTest;

import ky.ModemData;

public class DataDeal{ 
 //写入数据
 public static  void insertData(ModemData md) {  
  PreparedStatement ps = null;
  Connection conn=null;
  
  try {
   
   conn=Conn.getDBConn();
   SimpleDateFormat newk = new SimpleDateFormat ("yyyy.MM.dd hh:mm:ss");
          String time=newk.format(md.ReceiveTime);
   String sql="insert into dtu(dtu_modemid,dtu_length,dtu_time,dtu_data) values('"+md.ID+"',"+md.length+",'"+time.trim()

+"','"+ServerTest.ByteToHexString(md.Data).trim()+"')";
   ps=conn.prepareStatement(sql);
   ps.executeUpdate();
  
  } catch (Exception e) {
   Logger logger=Logger.getLogger(DataDeal.class.getName());
   logger.fine("数据库添加数据失败"+e);
   e.printStackTrace();
  
  }finally{
    if(ps!=null){
     try {
      ps.close();
      
     } catch (Exception e) {
      Logger logger=Logger.getLogger(DataDeal.class.getName());
      logger.fine("数据库链接关闭失败"+e);
     }
     ps=null;
    }if(conn!=null){
     try {
      conn.close();
     } catch (Exception e) {
      Logger logger=Logger.getLogger(DataDeal.class.getName());
      logger.fine("数据库链接关闭失败"+e);
     }
     conn=null;
    }
    
  }
 }
 
 
 //读取数据
 public static ArrayList getDTUIDData(String id){
  
  PreparedStatement ps = null;
  Connection conn=null;
  ResultSet rs=null;
  ArrayList al=new ArrayList();;
  try {
   
   conn=Conn.getDBConn();
   String sql="select dtu_modemid,dtu_length,dtu_time,dtu_data from dtu where dtu_modemid="+id; 
   ps=conn.prepareStatement(sql);
   rs=ps.executeQuery();
   
   while(rs.next()){
    ModemDataBean md=new ModemDataBean(); 
    md.setID(rs.getString(1));
    md.setlength(rs.getInt(2));
    md.setReceiveTime(rs.getString(3));
    md.setData(rs.getString(4));
    al.add(md);
   }
   
  } catch (Exception e) {
   Logger logger=Logger.getLogger(DataDeal.class.getName());
   logger.fine("数据库查询数据失败"+e);
   
  }finally{
   if(rs!=null){
    try {
     rs.close();
     
    } catch (Exception e) {
     Logger logger=Logger.getLogger(DataDeal.class.getName());
     logger.fine("数据库链接关闭失败"+e);
    }
     rs=null;
    }
   if(ps!=null){
    try {
     ps.close();
     
    } catch (Exception e) {
     Logger logger=Logger.getLogger(DataDeal.class.getName());
     logger.fine("数据库链接关闭失败"+e);
    }
     ps=null;
   }if(conn!=null){
    try {
     conn.close();
    } catch (Exception e) {
     Logger logger=Logger.getLogger(DataDeal.class.getName());
     logger.fine("数据库链接关闭失败"+e);
       }
    conn=null;
   }
   
     }
  
   return al;

 }
}

刚开始的时候 我在Servlet使用的是转发request.getRequestDispatcher("dtudata.jsp").forward(request,response); 提交之前dtudata.jsp页面中的提交按钮

文显示正常,但把ArrayList传递到dtudata.jsp页面时,提交按钮和从数据库读取的数据也都是乱码,刚开始以为是读取数据库时发生乱码,就修改了链接

conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/kydata?user=root&password=123456&useUnicode=true&characterEncoding=GBK");用来处

理中文乱码问题,可是显示时还是一样乱码.而且提交按钮也是乱码,这下我肯定不是数据库的问题了,接下来 我就分析了转发和跳转的区别,查阅了一些资料也没有

发现什么关于这二者之间有关中文乱码的问题.求人不如求己,我试着将request.getRequestDispatcher("dtudata.jsp").forward(request,response);修改为:

response.sendRedirect("dtudata.jsp");竟然成功了 !乱码现象解决了,问题是解决了,但是其原理我还是不是很理解,希望能得到各位的指点. 

SpringMVC重定向中文乱码解决方案

场景描述: SpringMVC的Controller在重定向时,需要传递中文参数。网上搜索一番,经本人测试终于解决。 RedirectView和ModelAndView的原理都是拼接url,如果直...
  • u011938428
  • u011938428
  • 2016年01月18日 18:33
  • 3818

JSP中请求转发和重定向区别和中文乱码问题解决方法

1.请求的转发和重定向:  1).本质区别:请求的转发只发出了一次请求,而重定向则发出了两次请求。  具体:    ①请求转发:地址栏是初次发出请求的地址      请求的重定向:地址栏不再是初次发送...
  • gg12365gg
  • gg12365gg
  • 2015年11月15日 15:13
  • 2928

url请求中的中文乱码处理

form有2中方法把数据提交给服务器,get和post,分别说下吧。  (一)get提交    1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。   ...
  • zhengyang7754
  • zhengyang7754
  • 2015年08月03日 21:57
  • 9445

cmd chcp命令切换字符格式 cmd重定向输出到文件出现中文乱码的处理方法

cmd chcp命令切换字符格式 在cmd运行批处理重定位输出到文本,然后进行解析的时候发现中文是乱码,于是查找了一些关于cmd的字符格式的一些内容。 发现chcp可以切换字符格式,我这里使用chcp...
  • thanklife
  • thanklife
  • 2017年08月15日 10:06
  • 393

springMVC重定向时参数传递及中文参数乱码问题

sprinMVC重定向时,若需要带参数,如果直接用return "redirect:/items?g="+group的话,一者跳转时参数可见不安全,二者,中文参数可能会乱码,此时可在当前方法入参中加入...
  • u013708358
  • u013708358
  • 2017年12月04日 19:12
  • 111

struts2中重定向中文参数乱码梳理

在项目中刚好有一个地方需要在服务器端处理一个请求后,重定向到另一个Action,这样浏览器的url才会变成另一个url,用户重新刷新时,才不会弹出一个对话框问你是不是要重新提交form。于是就自然而然...
  • zhujiaxing666666
  • zhujiaxing666666
  • 2013年01月13日 20:59
  • 1397

top重定向写入文件乱码问题

今天和帮一个同事解决文件读取错误的问题,纠结了一天。 同事用 top -n 1  > top.txt 命令C语言写的文件读取,文件打开、读取都没有问题,在终端显示也现实正常。但是编译成cgi后通过网...
  • PrinceCat2012
  • PrinceCat2012
  • 2013年08月02日 15:37
  • 2605

HttpServletResponse response(中文乱码、文件下载、定时刷新、控制缓存、重定向、注意事项)

可以在html中用来模拟响应头信息,比如 三秒后,跳转到Home/Index页面 1、向浏览器输出中文乱码 A、乱码原因: 加密方式 和 解密方式 不同造成。 B、浏览器默认解密,一般是gb2...
  • ful1021
  • ful1021
  • 2015年04月23日 15:00
  • 1045

iOS 关于webview 加载路径乱码

今天工作时候,要到个小问题。后台给了我一个url,我需要用webview展示出来。问题展现我就直接上图了。 第一张:我把url在浏览器中打开一下(到时候显示手机也是这种效果就对了) 结果我在webv...
  • iOS_blackFatterMan
  • iOS_blackFatterMan
  • 2016年09月12日 12:46
  • 848

关于struts2中传入中文参数然后显示到页面出现乱码

struts2传入中午出现乱码的情况 今天写了一个struts2出现了中文乱码,实现的动能是这样的 , 设计一个表单,其中type代表的是数字,type1输入的是中文,其中表单中action是一个st...
  • qq_19641001
  • qq_19641001
  • 2016年03月25日 22:22
  • 2725
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:转发和重定向之间的区别所引起中文乱码问题
举报原因:
原因补充:

(最多只允许输入30个字)