java结丹期(13)----javaweb(responserequestservletcontext)
Request
1. request对象和response对象的原理
1. request和response对象是由服务器创建的。我们来使用它们
2. request对象是来获取请求消息,response对象是来设置响应消息
2. request对象继承体系结构:
ServletRequest -- 接口
| 继承
HttpServletRequest -- 接口
| 实现
org.apache.catalina.connector.RequestFacade 类(tomcat)
3. request功能:
1. 获取请求消息数据
1. 获取请求行数据
* GET /day14/demo1?name=zhangsan HTTP/1.1
* 方法:
1. 获取请求方式 :GET
* String getMethod()
2. (*)获取虚拟目录:/day14
* String getContextPath()
3. 获取Servlet路径: /demo1
* String getServletPath()
4. 获取get方式请求参数:name=zhangsan
* String getQueryString()
5. (*)获取请求URI:/day14/demo1
* String getRequestURI(): /day14/demo1
* StringBuffer getRequestURL() :http://localhost/day14/demo1
* URL:统一资源定位符 : http://localhost/day14/demo1
* URI:统一资源标识符 : /day14/demo1
6. 获取协议及版本:HTTP/1.1
* String getProtocol()
7. 获取客户机的IP地址:
* String getRemoteAddr()
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 演示Request对象获取请求行数据*/@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*1. 获取请求方式 :GET* String getMethod()2. (*)获取虚拟目录:/day14* String getContextPath()3. 获取Servlet路径: /requestDemo1* String getServletPath()4. 获取get方式请求参数:name=zhangsan* String getQueryString()5. (*)获取请求URI:/day14/demo1* String getRequestURI(): /day14/requestDemo1* StringBuffer getRequestURL() :http://localhost/day14/requestDemo16. 获取协议及版本:HTTP/1.1* String getProtocol()7. 获取客户机的IP地址:* String getRemoteAddr()*///1. 获取请求方式 :GETString method = request.getMethod();System.out.println(method);//2.(*)获取虚拟目录:/day14String contextPath = request.getContextPath();System.out.println(contextPath);//3. 获取Servlet路径: /demo1String servletPath = request.getServletPath();System.out.println(servletPath);//4. 获取get方式请求参数:name=zhangsanString queryString = request.getQueryString();System.out.println(queryString);//5.(*)获取请求URI:/day14/demo1String requestURI = request.getRequestURI();StringBuffer requestURL = request.getRequestURL();System.out.println(requestURI);System.out.println(requestURL);//6. 获取协议及版本:HTTP/1.1String protocol = request.getProtocol();System.out.println(protocol);//7. 获取客户机的IP地址:String remoteAddr = request.getRemoteAddr();System.out.println(remoteAddr);}
}
2. 获取请求头数据
* 方法:
* (*)String getHeader(String name):通过请求头的名称获取请求头的值
* Enumeration<String> getHeaderNames():获取所有的请求头名称
3. 获取请求体数据:
* 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
* 步骤:
1. 获取流对象
* BufferedReader getReader():获取字符输入流,只能操作字符数据
* ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
* 在文件上传知识点后讲解
2. 再从流对象中拿数据
2. 其他功能:
1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
1. String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
3. Enumeration<String> getParameterNames():获取所有请求的参数名称
4. Map<String,String[]> getParameterMap():获取所有参数的map集合
* 中文乱码问题:
* get方式:tomcat 8 已经将get方式乱码问题解决了
* post方式:会乱码
* 解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
2. 请求转发:一种在服务器内部的资源跳转方式
1. 步骤:
1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
2. 特点:
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中。
3. 转发是一次请求
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/requestDemo8")
public class RequestDemo8 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo8888被访问了。。。");//转发到demo9资源
/*RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo9");requestDispatcher.forward(request,response);*///存储数据到request域中request.setAttribute("msg","hello");request.getRequestDispatcher("/requestDemo9").forward(request,response);//request.getRequestDispatcher("http://www.baidu.com").forward(request,response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}
3. 共享数据:
* 域对象:一个有作用范围的对象,可以在范围内共享数据
* request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
* 方法:
1. void setAttribute(String name,Object obj):存储数据
2. Object getAttitude(String name):通过键获取值
3. void removeAttribute(String name):通过键移除键值对
4. 获取ServletContext:
* ServletContext getServletContext()
Response对象
* 功能:设置响应消息
1. 设置响应行
1. 格式:HTTP/1.1 200 ok
2. 设置状态码:setStatus(int sc)
2. 设置响应头:setHeader(String name, String value)
3. 设置响应体:
* 使用步骤:
1. 获取输出流
* 字符输出流:PrintWriter getWriter()
* 字节输出流:ServletOutputStream getOutputStream()
2. 使用输出流,将数据输出到客户端浏览器
* 案例:
1. 完成重定向
* 重定向:资源跳转的方式
* 代码实现:
//1. 设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/day15/responseDemo2");
//简单的重定向方法
response.sendRedirect("/day15/responseDemo2");
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 重定向*/@WebServlet("/responseDemo1")
public class ResponseDemo1 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("demo1........");//访问/responseDemo1,会自动跳转到/responseDemo2资源/* //1. 设置状态码为302response.setStatus(302);//2.设置响应头locationresponse.setHeader("location","/day15/responseDemo2");*/request.setAttribute("msg","response");//动态获取虚拟目录String contextPath = request.getContextPath();//简单的重定向方法response.sendRedirect(contextPath+"/responseDemo2");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}
* forward 和 redirect 区别
* 重定向的特点:redirect
1. 地址栏发生变化
2. 重定向可以访问其他站点(服务器)的资源(关键)
3. 重定向是两次请求。不能使用request对象来共享数据(关键)
* 转发的特点:forward
1. 转发地址栏路径不变
2. 转发只能访问当前服务器下的资源(关键)
3. 转发是一次请求,可以使用request对象来共享数据(关键)
* 路径写法:
1. 路径分类
1. 相对路径:通过相对路径不可以确定唯一资源
* 如:./index.html
* 不以/开头,以.开头路径
* 规则:找到当前资源和目标资源之间的相对位置关系
* ./:当前目录
* ../:后退一级目录
2. 绝对路径:通过绝对路径可以确定唯一资源
* 如:http://localhost/day15/responseDemo2 /day15/responseDemo2
* 以/开头的路径
* 规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出
* 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
* 建议虚拟目录动态获取:request.getContextPath()
* <a> , <form> 重定向...
* 给服务器使用:不需要加虚拟目录
* 转发路径
2. 服务器输出字符数据到浏览器
* 步骤:
1. 获取字符输出流
2. 输出数据
* 注意:
* 乱码问题:
1. PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
2. 设置该流的默认编码
3. 告诉浏览器响应体使用的编码
//简单的形式,设置编码,是在获取流之前设置
response.setContentType("text/html;charset=utf-8");
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/responseDemo4")
public class ResponseDemo4 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取流对象之前,设置流的默认编码:ISO-8859-1 设置为:GBK// response.setCharacterEncoding("utf-8");//告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码解码//response.setHeader("content-type","text/html;charset=utf-8");//简单的形式,设置编码response.setContentType("text/html;charset=utf-8");//1.获取字符输出流PrintWriter pw = response.getWriter();//2.输出数据//pw.write("<h1>hello response</h1>");pw.write("你好啊啊啊 response");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}
3. 服务器输出字节数据到浏览器
* 步骤:
1. 获取字节输出流
2. 输出数据
4. 验证码
1. 本质:图片
2. 目的:防止恶意表单注册
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {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);String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789";//生成随机角标Random ran = new Random();for (int i = 1; i <= 4; i++) {int index = ran.nextInt(str.length());//获取字符char ch = str.charAt(index);//随机字符//2.3写验证码g.drawString(ch+"",width/5*i,height/2);}//2.4画干扰线g.setColor(Color.GREEN);//随机生成坐标点for (int i = 0; i < 10; 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.将图片输出到页面展示ImageIO.write(image,"jpg",response.getOutputStream());}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}
ServletContext对象:
1. 概念:代表整个web应用,可以和程序的容器(服务器)来通信
2. 获取:
1. 通过request对象获取
request.getServletContext();
2. 通过HttpServlet获取
this.getServletContext();
3. 功能:
1. 获取MIME类型:
* MIME类型:在互联网通信过程中定义的一种文件数据类型
* 格式: 大类型/小类型 text/html image/jpeg
* 获取:String getMimeType(String file)
2. 域对象:共享数据
1. setAttribute(String name,Object value)
2. getAttribute(String name)
3. removeAttribute(String name)
* ServletContext对象范围:所有用户所有请求的数据
3. 获取文件的真实(服务器)路径
1. 方法:String getRealPath(String path)
String b = context.getRealPath("/b.txt");//web目录下资源访问System.out.println(b);String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问System.out.println(c);String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问System.out.println(a);
java结丹期(13)----javaweb(responserequestservletcontext)相关推荐
- java结丹期(16)----javaweb(maven(2))
idea开发maven项目(电脑上一定要安装maven,并配置好环境变量才可开始下面的操作) 1.idea的maven配置 打开File→Settings配置maven 依据图片指示,选择本地mave ...
- java结丹期(15)----javaweb(maven(1))
1.maven的基本概念 Maven的正确发音是[ˈmevən](妹瘟),而不是"马瘟"以及其他什么瘟.Maven在美国是一个口语化的词语,代表专家.内行的意思. 一个对Maven ...
- java结丹期(14)----javaweb(cookiesession)
Cookie: 1. 概念:客户端会话技术,将数据保存到客户端 2. 快速入门: * 使用步骤: 1. 创建Cookie对象,绑定数据 * new Cookie(String ...
- java结丹期(12)----javaweb(servletHTTPweb相关基本概念)
web相关概念回顾 1. 软件架构 1. C/S:客户端/服务器端 2. B/S:浏览器/服务器端 2. 资源分类 1. 静态资源:所有用户访问后,得到的结果都是一样的,称为静 ...
- java结丹期(11)----javaweb(jstljsp)
JSP(JavaServer Pages): 1. 概念: * Java Server Pages: java服务器端页面 * 可以理解为:一个特殊的页面,其中既可以指定定义h ...
- 接口测试(筑基期>>>结丹期)
• 初识HTTP • HTTP的工作原理 • 请求行.状态行和消息报头 • 缓存和认证 • Fiddler的基本介绍 HTTP 的原理 HTTP 1.0 1.连接过程是短暂的 2.每次连接只处理一个请 ...
- java毕业设计防疫期社区人员信息动态管理系统Mybatis+系统+数据库+调试部署
java毕业设计防疫期社区人员信息动态管理系统Mybatis+系统+数据库+调试部署 java毕业设计防疫期社区人员信息动态管理系统Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B ...
- uestWrapper.getSession(HttpServletRequestWrapper.java:241) ~[tomcat-embed-core-9.0.13.jar:9.0.13]
报错信息如下: uestWrapper.getSession(HttpServletRequestWrapper.java:241) ~[tomcat-embed-core-9.0.13.jar:9. ...
- 直面Java第45期
转载自 直面Java第45期
最新文章
- redis如何实现分布式锁?
- php tongjiapi 使用_Kayako REST API使用详解一
- 游戏数仓分析(一)数据准备阶段
- 继承的CSS类在Chrome开发者工具里的显示
- 区块链的安全和智能合约
- 贴片铝电容识别及型号_电容器选型及其应用规范
- 拼多多关联公司申请“碰多多”、“碰碰多”商标
- Redis Cluster部署、管理和测试
- 快速的APK厂商快速和免费的Andr​​oid应用程序生成器无需编码技巧
- 常用的jar包下载网站(自用)
- Chrome插件使用IE tab
- android制作镜像,android镜像制作方法
- html 竖排导航条,html 导航栏
- 网络原理考点之ADSL组网技术
- 对短信验证码发送次数的限制
- 事业单位计算机类岗位考试试题,国家机关(事业单位)计算机岗位考试试题
- 林燕妮: 一见杨过误终生
- 使用node加密excel文件
- 超硬核Python避坑学习方案奉上!入门到就业一篇就搞定!
- 大厂地震,疯狂裁员大换血,面试冲击大厂Android移动开发工程师就在此时
热门文章
- 什么是脱离文档流?什么是文档流?
- win7映射网络驱动器消失了_网络资源共享;共享权限控制
- 服务器log文件清理,服务器日志切割清理工具(LogCutter)
- 数据中心UPS电源节能降耗的四大原则
- 骄阳似火 细数史上数据中心火灾 如何才能重蹈覆辙?
- sae mysql django_Django中MySQL读写分离技术
- python android自动化元素定位_linux下Appium+Python移动应用自动化测试实战---3.手把手教你定位元素编写测试用例...
- DayDayUp:哈哈,你上榜了嘛?界面新闻发布2020年中国最富1000人榜,总财富增加28%
- 成功解决pypmml.base.PmmlError: (‘MalformedInputException‘, ‘Input length = 1‘)
- ML之Hash_EditDistance:基于输入图片哈希化(均值哈希+差值哈希)即8*8个元素的单向vector利用编辑距离算法进行判别