1. Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象很代表响应的response对象。
2. request和response对象即代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就可以了。要向客户机输出数据,只需要找response对象就可以了。
3. HttpServletResponse的再说明
a) getWriter与getOutputStream区别
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) 向客户端输出数据:分别以OutputStream和PrintWriter输出两者不可以同时使用。
(2) sendRedirect()实现请求重定向(可以带数据给下一个页面)
注意:请求重定向指的是一个web资源收到客户端请求之后,通知客户端去访问另外一个web资源,这称之为请求重定向。
5. sendRedirect()的使用
需求:当用户登录成功后,把该用户的名字显示在登录成功页面。
解决思路:
(1) 使用java基础static变量
(2) 使用sendRedirect(“welcome?uname=sge”);
i) 只能传送字符串而不能传送对象
ii) welcome代表需要跳转的那个servlet的url
iii) servlet1的url名和变量之间有?号
iv) 如果要传递两个以上的值,它们之间要用&号隔开:比如sendRedirect(“welcome?uname=sgr&pass=ok”)
v) 如果传递的是中文,会出现乱码问题。
代码:
在LoginClServlet页面需要做的事情:
response.sendRedirect("/UsersManager/MainFrame?uname="+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");来指定浏览器的显示方式。