您的位置:首页 > 产品设计 > UI/UE

8 servlet的入门request和response

2016-11-26 15:53 381 查看
request:代表请求,在浏览器的地址栏输入地址,点击回车,这个过程称为一次请求

response:代表响应,服务器端根据的请求,返回数据到浏览器中进行显示,这个过程称为一次响应

1、response的简介
1.1 HttpServletResponse,是一个接口,父接口是ServletResponse,代表响应对象
1.2 http的响应包含三部分组成
第一部分:响应行
(1)状态码
(2)主要的方法
= setStatus(int sc) :设置状态码的方法
== response.setStatus(302) 
第二部分:响应头
(1)是key-value结构,一个key可以有一个value,一个key也可以有多个value
(2)方法
= setHeader(java.lang.String name, java.lang.String value) :设置响应头
== 两个参数:第一个参数是响应名称;第二个参数值
== 针对一个key和一个value情况
= 针对特殊的类型,设置头的方法
= setIntHeader(java.lang.String name, int value) :针对int类型值的方法
= setDateHeader(java.lang.String name, long date) :值long类型,是毫秒数(1970 1 1至今的毫秒数)
= addHeader(java.lang.String name, java.lang.String value) :设置响应头
== 两个参数:第一个参数是响应名称;第二个参数值
== 针对一个key和多个value的情况
= 针对特殊的类型,设置头的方法
= addIntHeader(java.lang.String name, int value) :针对int类型值的方法
= addDateHeader(java.lang.String name, long date) :值long类型,是毫秒数
第三部分:响应体
(1)向页面显示的内容
(2)方法
= getWriter():使用字符流向页面输出内容
= getOutputStream():使用字节流向页面输出内容

2、重定向的案例

在登录页面中,输入用户名和密码,判断输入的用户名和密码是否正确;

如果用户名和密码都正确,登录成功,向页面输出内容;
如果用户名或者密码有一个是错误的,重定向到登录页面。

代码

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//得到输入的用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//根据用户名和密码判断,(用户名admin、密码123456)
if("admin".equals(username) && "123456".equals(password)) {
//向页面输出内容
response.getWriter().write("login success");
} else { //重定向到登录页面
//设置状态码
// response.setStatus(302);
//使用头Location完成重定向
// response.setHeader("Location", "/day08-1/login.html");
//简写方式
response.sendRedirect("/day08-1/login.html");
}
}

3、设置响应体(向页面输出内容)
3.1 使用字节流向页面输出内容
(1)getOutputStream() 
(2)代码
response.getOutputStream().write("输出的内容".getBytes());
(3)如果向页面输出中文,根据不同的浏览器的编码设置会产生乱码问题
* 解决方法:
/*
* 1、设置浏览器的编码
* 2、设置字节数组的编码
* 让浏览器的编码和字节数组的编码一致
* */
//设置浏览器的编码 使用头信息 Content-Type
response.setHeader("Content-Type", "text/html;charset=utf-8");
//设置字节数组的编码
response.getOutputStream().write("字节流中文".getBytes("utf-8"));
3.2 使用字符流向页面输出内容
(1)getWriter() 
(2)代码
response.getWriter().write("response");
(3)如果使用字符流向页面输出中文,一定会有乱码
/*
* 使用字符流向页面输出内容;首先会把内容放到response缓冲区里面,
* response缓冲区默认的编码是 iso8859-1,这个编码不支持中文,一定会有乱码
* 解决方法:
* 1、设置response缓冲区的编码
* 2、设置浏览器的编码
* response缓冲区的编码和浏览器的编码一致
* */
//设置response缓冲区的编码
response.setCharacterEncoding("utf-8");
//设置浏览器的编码
response.setHeader("Content-Type", "text/html;charset=utf-8");
response.getWriter().write("字符流中文");

   3.3使用字符流向页面输出中文乱码问题解决,简写方式
response.setContentType("text/html;charset=utf-8");
3.4 字节流和字符流是互斥的
3.5 使用字符流不能直接向页面输出数字
//根据数字到码表中查询数字对应的字符,把字符输出
response.setCharacterEncoding("utf-8");
response.getWriter().write(111);

4、request对象

4.1 代表请求的对象,HttpServletRequest接口,父接口是ServletRequest

4.2 获取请求行的信息
(1)getMethod() :得到http请求方式
(2)getRequestURI() :得到请求地址(不包含ip+端口号)
(3)getProtocol() :得到http的版本

4.3获取请求头的信息
(1)getHeader(java.lang.String name) :根据名称得到请求头的值
= 头信息 User-Agent:获取当前请求的浏览器的类型
= String agent = request.getHeader("User-Agent");

4.4获取客户机的信息
(1)getContextPath() :请求项目的名称(常用)
(2)getRequestURL() :客户端发送的请求的路径(常用)
(3)getRemoteAddr() :获取当前客户端的ip地址

4.5 获取表单提交的数据
(1)String getParameter(java.lang.String name) :参数是表单输入项name属性的值,根据名称得到输入的值

(2)String[] getParameterValues(java.lang.String name) :参数是表单输入项name的值,针对复选框的情况

(3)Map<java.lang.String,java.lang.String[]> getParameterMap() :
= 返回的是map集合,key是表单输入项name属性的值,value是输入的值

(4)Enumeration<java.lang.String> getParameterNames()

4.6获取表单提交的中文数据乱码问题的解决

(1)post提交方式解决方法

使用post提交数据时候,会把数据放到request缓冲区里面,
request缓冲区默认的编码 iso8859-1,不支持中文
= 解决方法:
设置request缓冲区的编码
= 代码:
request.setCharacterEncoding("utf-8")

(2)get提交中文乱码解决
= 有三种方式
第一种:修改tomcat的配置文件
==     <Connector port="80" protocol="HTTP/1.1"

               
connectionTimeout="20000"

               redirectPort="8443" URIEncoding="utf-8"/>
第二种:把数据先编码,再进行解码
第三种:使用string构造进行编码
new String("");
= 代码:
username = new String(username.getBytes("iso8859-1"),"utf-8");

4.7 request是域对象
(1)域对象:在一定的范围内,可以存值和取值
(2)servletContext域对象:范围是整个web项目,存值 setAttribute方法 和取值 getAttribute方法
(3)request也是一个域对象:范围是一次请求,存值和取值
= 向request域里面存值的方法:setAttribute(java.lang.String name, java.lang.Object o)
= 从request域里面取值的方法:getAttribute(java.lang.String name) 
(4)request域对象范围是一次请求,经常和转发一起使用
= 代码 request.getRequestDispatcher("转发的路径 不带项目名称").forward(..);
(5)举例演示request域对象
= 创建servlet1,在servlet1里面向request域里面设置一个值,最后转发到servlet2里面
== //向request域里面设置一个值
request.setAttribute("msg", "itcast100");
//转发到servlet2
request.getRequestDispatcher("/servlet2").forward(request, response);
= 创建servlet2,在servlet2里面获取通过servlet1向request域里面设置的那个值
== //获取通过servlet1向request里面设置的值
response.getWriter().write(""+request.getAttribute("msg"));

4.8重定向和转发的区别
(1)重定向
= 重定向请求两次,请求的地址带项目名称
= 302+Location实现重定向的操作
= response.sendRedirect("路径 带项目名称");
(2)转发
= 转发请求一次,路径不需要带项目名称(在服务器内部进行操作)
= request.getRequestDispatcher("转发的路径 不带项目名称").forward(request, response);
(3)重定向:从一个网站到另外的一个网站
    转发:请求的过程中需要携带数据操作

5、转发的案例
5.1 使用request域对象+转发实现登录功能
5.2 知识的引入
(1)jsp:sun公司用于动态网站的技术,jsp就是servelt,最终会编译成servlet
(2)el表达式:用于获取域对象里面的值  ${名称}
9.3 代码的实现
1、创建页面,写表单,表单里面写两个输入项,提交到servlet里面
2、创建servlet,在servlet获取表单数据,判断(用户名 admin,密码 123456)是否正确
3、如果都正确,向页面输出success
4、如果有一个错误的,转发到登录页面,同时携带错误信息到页面中显示
9.4 代码
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取表单提交的用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//判断 用户名 admin,密码 123456
if("admin".equals(username) && "123456".equals(password)) {
//登录成功
response.getWriter().write("login success");
} else { //登录失败
//转发到登录页面,同时向页面传递错误的信息
//把错误信息存到request域里面
request.setAttribute("msg", "用户名或者密码错误");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  servlet