1.请求和响应的概述
什么请求:在浏览器地址栏输入地址,点击回车请求服务器,这个过程就是一个请求过程
什么响应:服务器根据浏览器发送的请求,返回数据到浏览器在网页上进行显示,这个过程就称之为响应。
1.1HttpServletResponse对象:
HttpSServletResponse是一个接口,它的父接口是ServletResponse,在开发中通常使用HttpServletResponse
相应信息分为三部分:响应行、响应头、响应正文(响应体)
1.发送状态码的相关方法:
》》》设置状态吗
setStatus(int sc):参数就是状态码
常见的状态码:200 响应成功
302 重定向
404 请求资源找不到
500 服务器代码出异常
》》》错误信息方法:
sendError(int sc):参数状态码
setStatus(int sc,String sm):第一个参数表示状态码,第二个参数 就状态码的描述。
比如:
response.sendError(404,“chapter04项目的请求资源不存在”);
1.2发送响应消息头相关的方法:
响应消息头的数据格式:key-value形式,有的是一个key,一个value,有的是一个key,多个value
》》》1.设置响应消息头:
*一个key,一个value
setHeader(String key,String value);
比如:setHeader(“aa”,“AA”);
如果:setHeader(“aa”,“AA”);
setHeader(“aa”,“BB”);
最终的结果:aa这个头对应的值就是BB
*一个key,对应多个value
addHeader(String key,String value);
比如:setHeader(“aa”,“AA”);
如果:setHeader(“aa”,“AA”);
setHeader(“aa”,“BB”);
最终的结果:aa这个头对应的值就是AA和BB
比如:
//与响应消息头相关的方法
//在用户名和密码输入错错误的情况下,重新回到登录页面让用户重新输入
//1.设置状态码
response.setStatus(302);
//2.设置响应头,完成重定向到登录页面
response.setHeader("Location", "/chapter04/login.html");
》》》2.设置相应数据的长度:setContentLength(int) 方法
》》》3.设置处理乱码的方法:
*setCharacterEncoding(String a);参数就是一个 码表格式,比如:“utf-8”
*setContentType(String a); 参数代表响应数据的类型和码表格式,比如:“text/html;charset=utf-8”
1.3发送响应体相关的方法
第一个方法:getOutputStream(),通过response向浏览器返回图片、视频等二进制数据的文件,当然也可以向浏览器返回文本数据。
比如:
ServletOutputStream out=response.getOutputStream();
String value=“itcast”;
out.write(value.getBytes());
第二个方法:getWriter(),通常response向浏览器返回文本数据,不能向浏览器返回图片、视频等二进制文件。
比如:
//字符流向浏览器输出数据
PrintWriter pw=response.getWriter();
String value=“itcast—”;
//pw.print(value);
pw.write(write);
1.4 解决中文输出的乱码问题
第一种方式:字节流向浏览器输出中文,会不会乱码:可能会。
出现乱码原因:服务器端的编码格式和浏览器的编码格式不一致引起。
比如:
//1.处理字节流的中文乱码问题
String date=“中国”
ServletOutStream out= response.getOutputStream();
//2.处理乱码:服务器端的编码和浏览器端的编码保持一致。
//3.让浏览器端的编码也是utf-8
response.setHeader(“Content-type”,“text/html;charset=utf-8”);(可以简写为response.setContentType(“text/html;charset=utf-8”);)
//4.让服务器端的中文编码格式是utf-8
out.write(date.getBytes(“utf-8”));
处理字节流的中文乱码问题:
》》》第一种: response.setHeader(“Content-type”,“text/html;charset=utf-8”);
》》》第二种: response.setContentType(“text/html;charset=utf-8”);
第二种方式:字符流向浏览器输出中文,会不会出现乱码:肯定会
乱码的形式:??,这个问号就表示中文的编码格式是采用iso-8859-1编码的,这种编码格式不支持中文。
处理原则:让浏览器和服务器的编码保持一致:
//1.处理字符流的中文乱码问题
//2.处理服务器的编码,让这个编码支持中文
response.setCharacterEncoding(“utf-8”);
//3.处理浏览器端的编码
response.setHeader(“Content-type”,“text/html;charset=utf-8”);
(2、3可简写为response.setContentType(“text/html;charset=utf-8/GB18030”);)
String date=“中国”;
//4.获取字符流
PrintWriter pw=response.getWriter();
pw.print(date)
处理字符流的中文乱码问题:
》》》第一种方式:
response.setCharacterEncoding(“utf-8”);
response.setHeader(“Content-type”,“text/html;charset=utf-8”);
》》》第二种方式:
response.setContentType(“text/html;charset=utf-8/GB18030”);
结论:在处理字符流和字节流输出中文乱码时,都采用 response.setContentType(“text/html;charset=utf-8/GB18030”);
1.5 实现网页的定时跳转并刷新
定时跳转:从一个注册页面跳转到登录页面,输入之前注册的用户名和密码。
//1.定时跳转:需要用到Refresh响应头
response.setHeader(“Refresh”,“5;URL=/chapter04/login.html”);
定时刷新:在当前页面的地址不发生变化,但是当前页面自己定时刷新,页面数据会发生变化。
response.setHeader(“Refresh”,“5”);
response.getWriter().print(new Date());
1.6 实现重定向
实现重定向的相关方法:
》》》第一种方式:302和Location配合使用,实现重定向
response.sendStatus(302);
response.setHeader(“Location”, “/chapter04/login.html”);
》》》第二种方式:sendRedirect("/chapter04/login.html")
重定向通过登录案例来完成:
需求分析:在登录页面输入用户名和密码,在LoginServlet里面判断用户名和密码是否正确,如果输入错误,会重新定向到登录界面,如果正确,跳转到欢迎页面。
获取登录页面提交的用户名和密码:request.getParameter()方法。
重定向的特点:
1.浏览器地址栏发生变化
2.发送了两次请求,都是由浏览器发送的请求
重定向的路径:由于是浏览器发送得到请求,所以路径必须要带项目名称,比如:/chapter04/welcom.html;
3.HttpServletRequeat它是一个接口,它的父接口ServletRequest,在开发中,常用的是带协议的请求对象。
请求消息:请求行,请求头,请求参数。
1.获取请求行消息的相关方法:
常用的请求方法:
》》》1.获取请求的提交方式:getMethod();
》》》2.获取请求的协议:getProtocol();
》》》3.获取项目名称:getContextPath();
》》》4.获取servlet路径:getServletPath();
》》》5.获取请求路径:getRequstURI(),getRequstURL();
URI对应的值是:/项目名称/servlet路径
URL对应的值是:http://localhost:8080/URI
2.获取请求消息头相关方法
》》》1.根据消息头,获取值: String value=getHeader(消息头的名称);
》》》2.获取所有的消息头:Enumeration<> er=getHeaderNames();
3.获取请求参数相关的方法:
》》》1.根据name属性值,获取用户输入的值:String value=getParameter(name属性对应的值);
》》》2.根据name属性值,获取用户选择的值:String[] value=getParameterValues(name属性对应的值);
》》》3.没有参数,获取所有值:Map<String,String[]> map =getPrameterMap();
4.解决请求参数的中文乱码问题:
中文乱码处理分两种情况:
第一种情况:处理get方式提交的中文乱码
使用的String的构造方法解决的中文乱码:new String(字节数组,编码格式)
代码:String newvalue= newString(value.getBytes(iOS8859-1),“utf-8”);
第二种情况:处理post请求的中文乱码问题:
post提交,会把参数首先提交到request对象的缓冲区中,缓冲区默认的编码是ISO8859-1,不支持中文。
处理方法:吧request缓冲区的编码设置成支持中文的码表格式。
代码: request.SetCharacterEncoding(“utf-8”);
5.通过Requset对象传递数据
什么是域对象:在一定的范围内,可以存值和取值;
》》》存值:setAttribute(String key,object obj);
》》》取值:object obj=getArrtribute(String key);
》》》移除:removeAttribute(String key);
1.7RequestDispatcher接口
在开发中访问到一个web资源后,需要服务器跳转到另一个资源去处理请求,可以通过sendRedirect重定向方法来实现,也可以RequestDispatcher转发对象的forward方法来实现。
得到转发对象:RequestDispatcher forwordobj =request.getRequsetDispatcher(“另一个资源的路径”)
常用方法:
》》》1.实现请求转发: forwordobj.forword (request,response0);
》》》2.实现请求包含: forwordobj.include(request,response0);
1.请求转发:
特点:发送了一次请求,想应一次,和request域对象配合使用,可以实现值传递
转发路径:转发动作是在服务器内部实现的,所以转发路径不要携带项目名称
请求重定向:
特点:发送了两次请求,响应了两次,不能和request域对象配合使用
重定向路径:重定向动作在浏览器端执行的,所以路径需要携带项目名称。
2.请求包含:
特点:发送一次请求,请求包含是由服务器完成。
请求包含 路径:在服务器内部完成的,路径不需要携带项目名称