HttpServletResponse详解

1.     Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象很代表响应的response对象。

2.     requestresponse对象即代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就可以了。要向客户机输出数据,只需要找response对象就可以了。

3.     HttpServletResponse的再说明

a)  getWritergetOutputStream区别

i)                getWriter用于向客户机回送字符数据

ii)               getOutputStream返回的对象,可以回送字符数据,也可以回送字节数据(二进制数据)

       OutputStream os = response.getOutputStream();

     os.write("hello,world".getBytes());

如何选择:

如果我们是回送字符数据,则使用PrintWriter对象,效率高

如果我们是回送字节数据(binary data),则只能使用OutputStream

注意:这两个流不能同时使用

    OutputStream os = response.getOutputStream();

       os.write("hello,world".getBytes());

       PrintWriter out = response.getWriter();

    out.println("abc");

这样会报错

为什么这两个流不可以同时使用?

当浏览器发出一个请求给web服务器,然后web服务器去找到浏览器需要的servlet之后发现有这样的一句话os.write("hello,world".getBytes());之后web服务器会将hello信息封装到response中然后返回给web服务器。web服务器获取到response对象之后。它将response的信息拆解成http响应信息并且返回给浏览器,然后web服务器就会去检测和response对象关联的流是否已经关闭,如果没有关闭则会帮你关闭。从这里可以看出,我们没有主动关闭流程序也没有问题的根本用原因就是web服务器就会帮我们自动关闭。当然我们主动关闭流更好,不关闭也无所谓。所以当与response关联的流关闭之后就不可以再和别的流进行关联了。

4.  HttpServletResponse常见应用

(1)  向客户端输出数据:分别以OutputStreamPrintWriter输出两者不可以同时使用。

(2)  sendRedirect()实现请求重定向(可以带数据给下一个页面)

注意:请求重定向指的是一个web资源收到客户端请求之后,通知客户端去访问另外一个web资源,这称之为请求重定向。

5.  sendRedirect()的使用

需求:当用户登录成功后,把该用户的名字显示在登录成功页面。

解决思路:

(1)  使用java基础static变量

(2)  使用sendRedirect(“welcome?uname=sge”);

i)     只能传送字符串而不能传送对象

ii)    welcome代表需要跳转的那个servleturl

iii)  servlet1url名和变量之间有?号

iv)    如果要传递两个以上的值,它们之间要用&号隔开:比如sendRedirect(“welcome?uname=sgr&pass=ok”)

v)     如果传递的是中文,会出现乱码问题。

代码:

LoginClServlet页面需要做的事情:

response.sendRedirect("/UsersManager/MainFrameuname="+username+"&pwd="+password);

MainFrame(接收数据的servlet中)页面需要做的事情:

String username = request.getParameter("uname");

String password = request.getParameter("pwd");

out.println("<h1>主界面</h1>"+username+" "+password);

(3)  使用session传递【后面说】

session的预热讲解:

代码:

request.getSession().setAttribute("loginuser", user);

这段代码就是首先获取到服务器的session空间然后对session那张表进行赋值。

然后在需要用到session对象的那个页面需要获取到session对象,代码如下:

String username2 = (String)request.getSession().getAttribute("loginuser");

这里需要强制转换一下,因为request.getSession返回的是Object类型的

tomcat里面有一个session(域)空间,它可以传送字符串也可以传送对象

像一张表有名字和值

名字(String               值(Object

loginuser                     sgr

userobj                     对象

6.     中文乱码处理专题

发生中文乱码有三种情况:

(1)     表单提交form

i)            post:针对post提交产生乱码,只需要在接收方使用request.setCharacterEncoding("UTF-8");即可,注意UTF-8是浏览器编码方式。

ii)           get:写一个工具类

       public class MyTools {
iv)      public static StringgetNewString(String str){
v)          String newString = "";
vi)         try {
vii)           newString = new String(str.getBytes("iso-8859-1"),"utf-8");
viii)       } catch (Exception e) {
ix)             e.printStackTrace();
x)              // TODO: handle exception
xi)         }
xii)       return newString;
xiii)    }
xiv)       }


(2)     超链接(默认方式是get提交所以可以使用get处理乱码的方式进行处理)

<a href=”http://www.sohu.com?name=函数”>测试</a>

处理方案就是使用get处理乱码方式一致

(3)     sendRedirect()发生乱码

response.sendRedirect(“servlet地址?username=光荣”);

乱码产生的根本原因:

浏览器(以utf-8格式发送)把请求发送给web服务器(以ISO-8859-1接收产生乱码),然后web服务器根据请求找到对应的servlet

特别说明:如果浏览器是ie6或者一下版本。则我们的第二种和第三种情况会出现乱码。

(当中文是奇数的时候)

解决方法是:

第二种情况:

String info = java.net.URLEncoder.encode(“你好吗.jpg”,”utf-8”);

<a href=”http://www.sohu.com?name=”+info>测试</a>

第三种情况:

response.sendRedirect(“servlet地址?username=”+info);

说明:我们应该尽量使用post方式提交;在服务器端是中文码,在response的时候也要考虑浏览器是否显示正确。我们通过response.setContentType("text/html;charset=UTF-8");来指定浏览器的显示方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值