java学习笔记—HttpServletResponse(22)

1  乱码处理

GET请求使用直接通过地址栏回车或超链接的单击以及form表单中method的get数据提交过来的请求,该请求和传递用户参数的方式是http://www.jnb.com?name=jack&age=36 因此可见get方式的请求参数有限(小于1K)。而且传递的数据直接在地址栏可见。如: 百度的搜索关键字。

1.1      编写一个提交get数据的一个注册表单

 <form action="/day07/regist" method="get">
       <table align="center" border="1">
         <tr>
           <td>用户:</td>
           <td><input type="text" name="uname"/></td>
         </tr>
         <tr>
           <td>地址:</td>
           <td><input type="text" name="address"/></td>
         </tr>
         <tr align="center">
           <td colspan="2">
               <input type="submit" value="注册"/>
               <input type="reset" value="重置"/>
           </td>
         </tr>
       </table>
    </form>

2 编写一个RegistServlet处理用户的Get请求数据

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        // 处理响应数据的格式和编码
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        // 获取字符输出流对象
        PrintWriter out = response.getWriter();
        // 获取请求参数
        String name = request.getParameter("uname");
        String address = request.getParameter("address");
        // 输出数据
        out.println("name="+name);
        out.println("<br/>");
        out.println("address="+address);
    }

运行结果发现输入中文提交后显示结果为乱码:

3    分析乱码的原因

4 使用代码解决乱码问题

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        // 处理响应数据的格式和编码
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        // 获取字符输出流对象
        PrintWriter out = response.getWriter();
        // 获取请求参数
        String name = request.getParameter("uname");
        String address = request.getParameter("address");
        // 获取ISO8859-1的原始数据
        byte [] bs = name.getBytes("ISO8859-1");
        name = new String(bs,"UTF-8");
        bs = address.getBytes("ISO8859-1");
        address = new String(bs,"UTF-8");
        // 输出数据
        out.println("name="+name);
        out.println("<br/>");
        out.println("address="+address);
    }

如果使用以上的代码解决GET乱码每一个请求参数都需要重新的解码太繁琐,因此可以直接使用服务器通知浏览器以指定的方式进行编码字符数据。

5 使用URIEnoding方式解决GET乱码问题

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               URIEncoding="utf-8"/>

URIEncoding主要指定的是%E5%8D%A1%E5%8D%A1的数据的解码方式,如果没有指定那么默认是ISO8859-1,如果指定那么采用指定的码表进行解码。因此服务器端就没有必要使用两个中编码方式进行转码了。

注意:在实际的生产环境中我们代码的乱码问题不可能以来服务器帮助我们解决,因此推荐使用第一个转码方式。后期可以直接实现一个乱码的过滤器实现处理乱码的问题。

  1. POST请求

POST请求主要是以form表单的method=”post”发送的请求。该请求的数据在HTTP协议的请求体中。可以传递任意大小的数据。因此比较适合上传文件。

修改以上的注册页面提交方式为post,那么在doPost()直接获取数据并输出同样出现乱码。

使用代码解决乱码

public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        // 处理响应数据的格式和编码
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        // 处理post请求参数乱码
        request.setCharacterEncoding("utf-8");
        // 获取字符输出流对象
        PrintWriter out = response.getWriter();
        // 获取请求参数
        String name = request.getParameter("uname");
        String address = request.getParameter("address");
        // 输出数据
        out.println("name="+name);
        out.println("<br/>");
        out.println("address="+address);
}

总结:以后在实际的开发中避免不了给页面输出中文数据以及中文的参数。那么以后在处理用户请求的doGet和doPost方法中我们应直接编写如下三句:

response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
时间: 2024-08-11 06:45:25

java学习笔记—HttpServletResponse(22)的相关文章

java学习笔记—HttpServletResponse(21)

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 获取字节流对象 ServletOutputStream out = response.getOutputStream(); // 获取字符流对象 PrintWriter writer = response.getWriter(); out.write("image&

java学习笔记—HttpServletResponse(23)

获取客户端信息 1 编写ClientServlet.java public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { response.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8"); response.se

java学习笔记9.22(泛型)

泛型代码与虚拟机: 自动提供原始类型,擦除类型变量,替换为限定类型(无则用object) 当调用泛型方法时,编译器对返回的object进行强制类型转换 泛型类擦除造成原本在泛型类子类中覆盖的方法变成了重载.(参数类型变成了object)导致子类出现了同一方法名两种参数的方法,调用时本来只希望调用子类的方法(多态),结果有可能调用了泛型超类中的参数为objec的方法.编译器自动在子类中加入桥方法: public void setSecond(object a){setSecond((Date) a

JAVA之GUI编程概述学习笔记(22)

      下列内容为本人看毕向东老师java视频教程学习笔记! JAVA GUI图形用户界面编程: Windows 操作系统提供两种操作方式:                                 1.GUI                2.CLI; GUI:Grahi User Interface ,图形用户界面.                       特点:用图形的方式,来显示计算机操作的界面,这样更方便更直观. CLI: Command line User Interf

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

【Java学习笔记之二十六】深入理解Java匿名内部类

在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始化匿名内部类.匿名内部类使用的形参为何要为final. 一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部类我们必须要继承一个父类或者

Java学习笔记之继承

一.继承的基础 在Java术语中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass). 举例说明: 1 class Box 2 { 3 public double width; 4 public double height; 5 public double depth; 6 7 //重载构造方法 8 public Box(Box ob) 9 { 10 width = ob.width; 11 height = ob.height; 12 depth = ob.dep

Java学习笔记之接口

一.接口的概念与定义 首先考虑一个简单的接口的定义: public interface Output { int MAX_LINE = 40; void out(); void getData(String msg); } 定义接口使用关键字interface 修饰符interface前面的public可以省略,如果省略,则采用默认访问控制,即只有在相同包结构的代码才可以访问此接口 接口不可以有构造方法(区别于类中的构造方法) 接口里面的所有成员,包括常量.方法等都是public访问权限,所以在

java学习笔记13--比较器(Comparable、Comparator)

java学习笔记13--比较器(Comparable.Comparator) 分类: JAVA 2013-05-20 23:20 3296人阅读 评论(0) 收藏 举报 Comparable接口的作用 之前Arrays类中存在sort()方法,此方法可以直接对对象数组进行排序. Comparable接口 可以直接使用java.util.Arrays类进行数组的排序操作,但对象所在的类必须实现Comparable接口,用于指定排序接口. Comparable接口的定义如下: public  int