Servlet如何从浏览器的表单获取中文信息并保存到磁盘的xml文档中不出现乱码

        上一篇讲到了如何通过 java 来使用 dom4j 组件创建本地磁盘上面的xml文档,

        现在我要说一下怎样在 Servlet 的请求处理方法 doXxx() 里面把从浏览器上获取的信息保存到 本地的xml文件中:   

        1)获取浏览器表单中的信息、

        2)创建 xml 文档、

        3)给xml文档添加节点等信息

        4)输出xml文档到本地磁盘

        这四个不用多说了,关键是获取的中文信息保存到 xml 文档中如何不出现 乱码 !

        检查了很多遍, jsp 页面的编码方式和 xml 文档的输出格式编码都是 GBK 这没错啊! 究竟是什么原因导致出现中文乱码呢?

        这就是我这两天一直纠结的问题,实际上很简单就能解决,主要是没想到。

        我们常用 response.setCharacterEncoding(),但是很少用 request.setCharacterEncoding(),没错就是因为没有手动用代码设置request请求对象的编码方式为 GBK ,设置之后才与 jsp 页面和 xml 文档输出格式一致啊!

        下面我就直接贴代码:

      1.index.jsp

        1)<body></body>中的:

        <form name="form1" method="post" action="ChineseXml" target="_blank" onSubmit="return check(this)">
  <table width="500" height="271" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
    <tr>
      <td width="90" height="23">&nbsp;</td>
      <td width="410">&nbsp;</td>
    </tr>
    <tr>
      <td colspan="2" align="center">信息:</td>
    </tr>
    <tr>
      <td height="28" align="center">省名:</td>
      <td><input name="province" type="text" id="province" size="52"></td>
    </tr>
    <tr>
      <td height="157" align="center">市名:</td>
      <td><textarea name="city" cols="50" rows="9" id="city"></textarea></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><input name="Submit" type="submit" class="btn_grey" value="保存">
      &nbsp;
      <input name="Submit2" type="reset" class="btn_grey" value="重置"></td>
    </tr>
  </table>
</form> 


        2)<head></head>中的:

  <script language="javascript">
    function check(form){
      with(form){                                                 //with 语句可以不通过对象名直接引用参数对象中已有的属性
        if(province.value==""){
          alert("省名不能为空!!!!!!!!!!!!!!");
          province.focus();
          return false;
        }else  if(city.value==""){
          alert("市名不能为空!!!!!!!!!!!");
          city.focus();
          return false;
        }
        return true;
      }
    }
  </script>


      2.ChineseXml.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

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

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class ChineseXml extends HttpServlet {
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    request.setCharacterEncoding("GBK");                       //非常重要,请求对象的编码方式设置为与浏览器和输出格式一致的 GBK 编码才能避免乱码

    String fileURL = getServletContext().getRealPath("/xml/ChineseText.xml");        //XML文件的路径
    File file = new File(fileURL);

/***************************获取表单中的信息****************************/

    String province=request.getParameter("province");                        //获取省名
    String city=request.getParameter("city");                    //获取市名

/****************************************************************************/

    Document document = null;
    Element placard = null;
    DateFormat df=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分");    //设置日期格式
    if (!file.exists()) {                     // 判断文件是否存在,如果不存在,则创建该文件
        document = DocumentHelper.createDocument();                    //创建XML文档对象
        placard=DocumentHelper.createElement("placard");            //创建普通节点
        document.setRootElement(placard);                             // 将placard设置为根节点
        placard.addAttribute("version", "2.0");                        //为根节点添加属性version
        Element description = placard.addElement("description");    //添加description子节点
        description.setText("信息栏");
        Element createTime = placard.addElement("createTime");        //添加createTime子节点
        createTime.setText("创建于"+df.format(new Date()));
    } else {
        SAXReader reader = new SAXReader(); // 实现化SAXReader对象
        try {
            document = reader.read(new File(fileURL));//获取XML文件对应的XML文档对象
            placard = document.getRootElement(); // 获取根节点
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
    /********************** 添加信息 **************************/
    String id = String.valueOf(placard.elements("info").size() + 1); // 获取当前信息的id号
    Element info = placard.addElement("info");        //添加info节点
    info.addAttribute("id", id);                    //为info节点设置ID属性
    Element province_info = info.addElement("province");    //添加province节点
    province_info.setText(province);                            //设置province节点的内容
    Element city_item = info.addElement("city");    //添加city节点
    city_item.addCDATA(city);                        //设置city节点的内容为CDATA段
    Element pubDate_item = info.addElement("pubDate");    //添加pubDate节点
    df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        //设置日期格式
    pubDate_item.setText(df.format(new Date()));
    /***************************************************************/
    // 保存文件
    
    // 创建OutputFormat对象
    OutputFormat format = OutputFormat.createPrettyPrint(); // 格式化为缩进方式
    format.setEncoding("GBK");                                 // 设置写入流编码
    try {
        XMLWriter writer = new XMLWriter(new FileOutputStream(fileURL), format);
        writer.write(document);                             // 向流写入数据
        writer.close();                                        //关闭流
    } catch (IOException e) {
        e.printStackTrace();
    }
    request.getRequestDispatcher("xml/ChineseText.xml").forward(request,response);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值