(一)请求对象和响应对象的原理:
request 和response 对象都是由服务器创建,管理,销毁.
由我们来使用.
继承体系结构:
ServletRequest(接口)<--------继承<-------HttpServletRequest(接口)<--------实现 org.apache.catalina.connector.RequestFacade@6049a827
ServletResponse(接口)<---------继承--- HttpServletResponse(接口)<-------------实现------org.apache.catalina.connector.ResponseFacade@3bec9d4
(二·)response:设置响应消息
设置响应行: HTTP/1.1 200 ok
setStatus(int code);设置响应状态码
重定向 302
特点:1.两次请求,两次响应
2.地址栏发生变化
3.不仅可以访问内部资源,也可访问外部资源
代码:
// 设置状态码 302 重定向
response.setStatus(302);
// 设置响应头 location
response.setHeader("location","http://127.0.0.1:8080/MyServlet/index.jsp");
// 以上两步可以合成一个简便方法
response.sendRedirect("http://www.baidu.com");
设置响应头: 例如:content-type:text/html;charset=utf-8
setHeader(String headName,String headValue); 设置响应头的名称和值
setDateHeader(String name,long date); 设置日期头
setIntHeader(String name,int count); 设置数字头
设置响应体:响应体响应的是数据 得通过流的方式
获取输出流写出数据
**PrintWriter getWriter();发送字符数据的对象
// 为了防止乱码,我们设置一下服务器对字符流的编码 默认服务器用的是ISO-8859-1
// 所以在获取流之前告诉服务器用什么编码
response.setCharacterEncoding("utf-8");
//告诉浏览器我们用的是什么编码 ,好让浏览器用响应的编码去解码
response.setHeader("content-type","text/html;charset=utf-8");
//以上两个方法可以合二为一
response.setContentType("text/html;charset=utf-8");//作用:设置字符打印输出流的编码,并告诉浏览器用相应的编码去解码
**ServletOutputStream getOutputStream(); 发送字节数据的对象
// 获取字节流 用流向浏览器写出一张图片
ServletOutputStream sos = response.getOutputStream();
// 获取图片的真实路径
String realPath = this.getServletContext().getRealPath("/302.png");
// 获取输入流读取图片
FileInputStream fis = new FileInputStream(new File(realPath));
byte[] by = new byte[1024];
int len = 0;
while ((len = fis.read(by)) != -1) {
sos.write(by, 0, len);
}
:验证码案例
int width = 100;
int height = 50;
//1.创建图片
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//2.修饰图片
//2.1设置背景色
Graphics g = image.getGraphics();//获取画笔
g.setColor(Color.PINK);//设置颜色
g.fillRect(0, 0, width, height);//填充背景色
//2.2画边框
g.setColor(Color.BLUE);
g.drawRect(0, 0, width - 1, height - 1);
//2.3写入验证码
g.setColor(Color.RED);
/*
g.drawString("A", width/5 * 1, height/2);
g.drawString("C", width/5 * 2, height/2);
g.drawString("I", width/5 * 3, height/2);
g.drawString("D", width/5 * 4, height/2);
*/
String msg = "asajdjhsjfjhsflgAAFGHHJHJYYJ0123456789";
Random ran = new Random();
for (int i = 1; i <= 4; i++) {
int index = ran.nextInt(msg.length());//获取msg的随机角标
g.drawString(String.valueOf(msg.charAt(index)), width/5 * i, height/2);
}
//2.4画干扰线
g.setColor(Color.GREEN);
//g.drawLine(0, 0, width, height);
for (int i = 0; i < 5; i++) {
int x1 = ran.nextInt(width);
int x2 = ran.nextInt(width);
int y1 = ran.nextInt(height);
int y2 = ran.nextInt(height);
g.drawLine(x1, y1, x2, y2);
}
//3.将图片数据写入response输出流中
ImageIO.write(image, "jpg", response.getOutputStream());
(三)request 对象
获取请求消息
1.获取请求行: GET /MyServlet/index.jsp?name=zhangsan&age=23 HTTP/1.1
request.getMethod();//获取请求方式
request.getContextPath();//获取项目名称
request.getRequestURI();//获取URI
request.getRequestURL();//获取URL
request.getRemoteAddr();//获取IP地址
request.getQueryString();//获取请求参数
request.getProtocol();//获取协议版本
2.获取请求头:
request.getHeader("user-agent");//获取请求头的值
request.getDateHeader(name);//获取日期头
request.getIntHeader(name)//获取数字头
3.获取请求体: 请求体:专门用于封装Post请求的 请求参数
获取字符数据: getReader(); 返回一个高效的字符流 我们通过一次读取一行的 方法来获取请求参数数据 然后 拆分字符串获取我们想要的数据
获取字节数据:getInputStream(); 后期上传文件时讲解
4. 通用的方式来获取 请求参数
request.getParameter(name); 通过请求参数的名称来获取值
request.getParameterValues("hobby"); 通过请求参数的名称,来获取值的数组 一般用于复选框
request.getParameterMap(); 获取所有参数的map集合
request.getParameterNames(); 获取所有参数的名称 枚举 不常用 了解
5. 处理中文乱码问题
//通用处理方式:处理get post 请求提交中文数据乱码问题
String username = request.getParameter("username");
byte[] bytes = username.getBytes("ISO-8859-1");//将字符串还原成字节 相当于解码
username=new String(bytes,"utf-8");//将字节重新编码
post 请求特有的方式 处理中文乱码
request.setCharacterEncoding("utf-8");
6.请求转发:
转发的特点:
1.一次请求一次响应
2.地址栏不发生变化
3.只能访问内部站点资源
代码:
request.getRequestDispatcher("/myservlet2").forward(request, response);
7.域对象: 请求域的范围中共享数据
在一次请求的多个资源之间共享数据
request.setAttribute("name","zhangsan");
request.getAttribute("name");
request.removeAttribute("name");
什么时候使用重定向?什么时候使用转发?
1.如果需要在请求的多个资源中共享数据,则使用转发
2.如一次性的数据存入请求域中
8.路径的书写:
建议以/开头
服务器内部跳转路径 不需要加项目名称 request.getRequestDispatcher("/myservlet2").forward(request, response);
页面上的路径和重定向 需要加上 项目名称
<img src="/MyServlet/mydemo4" id="img1"></img>
一般来说我们写相对路径
(四)request中的get请求
request.getAttribute() //获得setAtrribute的数据
request.getAttributeNames() //返回所有可用属性名的枚举
request.getAuthType() //返回用于保护servlet的验证方法名称
request.getCharacterEncoding() //返回字符编码方式
request.getClass() //返回一个类
request.getContentLength() //返回请求体的长度(以字节数)
request.getContentType() //得到请求体的MIME类型
request.getContextPath() //获取当前系统的路径 获得应用名称
request.getCookies() //返回此次请求发送的Cookie对象
request.getDateHeader() //用于将指定头信息的部分转换成方便转换为时间类型的长整数型
request.getHeader() //获取客户端的浏览器类型。
request.getHeaderNames() //返回请求头包含的所有头名称的枚举。
request.getHeaders() //获取一个name的多个值序列,返回请求给出的指定类型的所有HTTP头标的名称的枚举值
request.getInputStream() //得到请求体中一行的二进制流
request.getIntHeader() //以int的形式返回指定请求头的值。
request.getLocalAddr() //接收请求的接口的 InternetProtocol (IP) 地址
request.getLocale() //基于 Accept-Language 头,返回客户端将用来接受内容的首选 Locale 客户端语言环境
request.getLocales() //所有的语言环境
request.getLocalName() //接收请求的 Internet Protocol(IP) 接口的主机名
request.getLocalPort() //接收请求的接口的 InternetProtocol (IP) 端口号
request.getMethod() //请求方式
request.getParameter() //获得表单提交的数据
request.getParameterMap() //返回类型是String[]
request.getParameterNames() //将发送请求页面中form表单里所有具有name属性的表单对象获取(包括button).返回一个Enumeration类型的枚举
request.getParameterValues() //将获取所有form表单中name属性为"name"的值.该方法返回一个数组.遍历数组就可得到value值
request.getPathInfo() //返回与客户端发出此请求时发送的URL相关联的额外路径信息。
request.getPathTranslated() //映射到服务器实际路径之后的路径信息
request.getProtocol() //返回请求用的协议类型及版本号获取客户端向服务器端传送数据所依据的协议名称。
request.getQueryString() //字符串形式的附加到URL后面的查询字符串,数据仍旧是URL编码的
request.getReader() //返回解码过了的请求体
request.getRealPath() //返回一虚拟路径的真实路径
request.getRemoteAddr() //返回发送此请求的客户端IP地址
request.getRemoteHost() //返回发送此请求的客户端主机名 获取客户端的名字
request.getRemotePort() //发送请求的客户主机端口
request.getRemoteUser() //返回包含在请求RUL中路径后面的查询字符串。如果没有查询字符串返回null
request.getRequestDispatcher() //请求转发,获取请求过来的地址,与该地址共享一个Request
request.getRequestedSessionId() //返回客户端制定的回话ID
request.getRequestURI() //请求的资源
request.getRequestURL() //获取URL,包含域名,不包含请求内容
request.getScheme() // 返回请求用的计划名, 返回当前链接使用的协议 如:http.https及ftp等
request.getServerName() //返回接受请求的服务器主机名获取服务器的名字。
request.getServerPort() //返回服务器接受此请求所用的端口号
request.getServletPath() //返回请求调用servlet的URL部分
request.getSession() //返回与此请求关联的当前HttpSession,如果没有当前会话并且参数为true,则返回一个新会话
request.getUserPrincipal() // 返回包含当前已经过验证的用户的名称的java.security.Principal对象。如果用户没有经过验证,则该方法返回null