[Java拾遗四]JavaWeb基础之Servlet_Request&&Response
今天来回顾下之前学过Servle的Resquest以及Response的知识.
1,Request和Response技术:
rr的作用:
request是请求,封装用户的请求信息.若想获取请求信息,找request就行了
response是响应,封装服务器的响应信息,若想往页面写东西,找response就可以了
rr的体系结构:
request
在servlet中有一个service(ServletRequest,ServletResponse) 抽象方法
在HttpServlet中实现了service(ServletRequest,ServletResponse)
并且重载了service(HttpServletRequest,HttpServletResponse)
request的实现类 org.apache.catalina.connector.RequestFacade
response的实现类 org.apache.catalina.connector.ResponseFacade
request的体系
ServletRequest(接口)
|
|
HttpServletRequest(接口)
|
|
RequestFacade(类 tomcat)
response的体系
ServletResponse(接口)
|
|
HttpServletResponse(接口)
|
|
ResponseFacade(类 tomcat)
2,Response
(1)作用:响应
http响应的格式:
响应行 响应头 响应体
(2)简单介绍api
操作响应行:
响应行的格式:
协议/版本 状态码 状态码说明
HTTP/1.1 200 OK
常用的方法:
setStatus(int)
sendError(int)
sendError(int,msg)
操作响应头:
响应头的格式:
key:name
key:name1,name2 --多个值的时候用逗号隔开
常用的方法:
setHeader(string,string)
setIntHeader(string,int)
addHeader(string,string)
setDateHeader(string,long)
操作响应体:
响应题就是展示的内容
getOutputStream()
getWriter()
(3)详解api
a, 状态码:
1xx:正在请求中
2xx:完成请求响应
200:成功完成
3xx:还需浏览器进一步操作
302:还需跳转
304:浏览器去读缓存
4xx:用户请求错误
404:路径不存在
5xx:服务器错误:
500:服务器错误
常用方法:
对于非错误的状态码
setStatus(int):例如 setStatus(304)
对于的错误的状态码
sendError(int)
sendError(int,msg):返回错误的信息
b,操作响应头:
响应头的格式:
key:name
key:name1,name2 --多个值的时候用逗号隔开
常用方法:
setHeader(String key,String name):给响应设置指定的头信息
addHeader(String key,String name1):若存在则追加,反之则设置
setIntHeader(String key,int value):给响应设置指定的头信息(int类型的)
addIntHeader(String key,int value):若存在则追加,反之则设置
setDateHeader(String key,Long long):给相应头设置毫秒值的
案例:
重定向:
302:还需要跳转
需要用到location
代码实现:
setStatus(302);
setHeader("location","跳转的路径");
开发中时使用
sendRedirect(跳转的路径);
刷新:
response.setHeader("refresh","3;url=跳转的路径");
重定向和刷新最后的效果是一样的,同样是发送了两次请求
代码案例:
使用location跳转:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setStatus(302);
//设置跳转路径
response.setHeader("location","/dayaugmentum10/loca2");
}
使用refresh跳转:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("refresh", "3;url=/augmentum/1.html");
}
c,操作响应体:
常用的方法:
ServletOutputStream getOutputStream():字节流
PrintWriter getWriter():字符流
通过流对象.println(任意内容);
字符乱码的处理
设置响应信息的编码格式
response.setCharacterEncoding("utf-8"):
设置响应信息的编码格式并且通知浏览器用什么编码打开
response.setHeader("content-type","text/html;charset=utf-8");
开发中使用
response.setContentType("text/html;charset=utf-8"); ☆
在页面添加
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
注意事项(针对流)
字节流和字符流是互斥的.
tomcat会帮我们关闭流
验证码:
作用:防止恶意暴力破解密码
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 使用java图形界面技术绘制一张图片 int charNum = 4;
int width = 30 * 4;
int height = 30; // 1. 创建一张内存图片
BufferedImage bufferedImage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB); // 2.获得绘图对象
Graphics graphics = bufferedImage.getGraphics(); // 3、绘制背景颜色
graphics.setColor(Color.YELLOW);
graphics.fillRect(0, 0, width, height); // 4、绘制图片边框
graphics.setColor(Color.BLUE);
graphics.drawRect(0, 0, width - 1, height - 1); // 5、输出验证码内容
graphics.setColor(Color.RED);
graphics.setFont(new Font("宋体", Font.BOLD, 20)); // 随机输出4个字符
Graphics2D graphics2d = (Graphics2D) graphics;
String s = "ABCDEFGHIGKLMNOPQRSTUVWXYZ01234567890";
Random random = new Random(); String msg="";
int x = 5;
for (int i = 0; i < 4; i++) {
int index = random.nextInt(26);
String content = String.valueOf(s.charAt(index));
msg+=content;
double theta = random.nextInt(45) * Math.PI / 180;
graphics2d.rotate(theta, x, 18);
graphics2d.drawString(content, x, 18);
graphics2d.rotate(-theta, x, 18);
x += 30;
} // 6、绘制干扰线
graphics.setColor(Color.GRAY);
for (int i = 0; i < 5; i++) {
int x1 = random.nextInt(width);
int x2 = random.nextInt(width); int y1 = random.nextInt(height);
int y2 = random.nextInt(height);
graphics.drawLine(x1, y1, x2, y2);
} // 释放资源
graphics.dispose(); // 图片输出 ImageIO
ImageIO.write(bufferedImage, "jpg", response.getOutputStream()); }
验证码模版
3,Request
请求.若想获取请求信息,找我就可以了
请求的格式:
请求行 请求头 请求体
(1)api简介
a,请求行
格式:请求方式 资源路径 协议/版本
例如:GET /augmentum/1.html HTTP/1.1
常用方法:
getMethod()
getRequestURI()
getProtocol()
getQueryString()
b, 请求头
格式:
key:name1[,name2]
常用方法:
String getHeader(key)
Enumeration getHeaders(key)
Enumeration getHeaderNames();
getIntHeaders(key)
c, 请求体
只有post才有请求体,存放就是post请求的参数
例如 username=tom&password=123&hobby=eat&hobby=sleep
常用方法:
String getParameter(key)
Enumeration getParameterNames()
Map<String,String[]> getParameterMap();
String[] getParameterValues(key);
(2)api详解
a,请求行:
常用方法:
getMethod():获取请求的方式
getRequestURI():获取的从项目名开始到请求参数参数之前(?)
getProtocol():获取协议和版本
getQueryString():以字符串的形式获取请求参数
结果:
GET
/augmentum/row
HTTP/1.1
login=tom&password=123
GET /augmentum/form.html HTTP/1.
常见的请求方式:post和get
区别:
1.get请求的参数会出现在地址栏上,post不会,post相对安全
2.get请求参数的大小有限制,post理论上没有.
3.只有post有请求体.
获取用户信息:
getRemoteAddr():获取用户ip
getRequestURL():获取请求路径(带协议的路径 URL)
getContextPath():获取项目名
结果:
192.168.40.1xx
http://192.168.40.97/augmentum/row
/augmentum
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*//获取请求方式
String method = request.getMethod();
System.out.println(method);
//获取请求资源路径
String uri = request.getRequestURI();
System.out.println(uri);
//获取协议版本
String pro = request.getProtocol();
System.out.println(pro);
//获取get请求的请求参数
String s = request.getQueryString();
System.out.println(s);*/ //获取用户ip
String addr = request.getRemoteAddr();
System.out.println(addr);
//获取请求路径
String url = request.getRequestURL().toString();
System.out.println(url);
//获取项目名
String contextPath = request.getContextPath();
System.out.println(contextPath);
}
b,请求头:
格式:
key:name1[,name2]
常用方法:
String getHeader(key):获取指定的头信息
int getIntHeader(key):
long getDateHeader(key):
Enumeration getHeaders(key):以Enumeration形式获取指定头的信息
Enumeration getHeaderNames();返回所有的请求头的名称
防盗链
使用的 referer请求头
String referer = request.getHeader("referer");
if (referer==null) {
System.out.println("地址栏来的 可以访问");
}else if(referer.startsWith("http://localhost/augmentum")){
System.out.println("站内访问");
}else{
System.out.println("站外访问");
}
}
c,请求体:
只有post请求才有,用来存放请求参数.
get请求和post通用的方法:
获取用户参数:
String getParameter(key):获取指定的参数信息
String[] getParameterValues(key):以string[]的格式返回指定的参数信息
Map<String,String[]> getParameterMap();以map的形式返回所有的参数
Enumeration getParameterNames();以Enumeration形式返回所有的参数名称
例如:
姓名:tom
爱好:[drink, sleep]
----------------------
username:[tom]
password:[1234]
hobby:[drink, sleep]
----------------------
username:[tom]
password:[1234]
hobby:[drink, sleep]
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取姓名
String username = request.getParameter("username");
System.out.println("姓名:"+username);
//获取爱好
String[] hobby=request.getParameterValues("hobby");
System.out.println("爱好:"+Arrays.toString(hobby));
//获取所有
System.out.println("----------------------");
Map<String,String[]> map=request.getParameterMap();
for (String name : map.keySet()) {
System.out.println(name+":"+Arrays.toString(map.get(name)));
}
System.out.println("----------------------");
//获取所有的参数名称
Enumeration<String> params = request.getParameterNames();
while(params.hasMoreElements()){ String name = params.nextElement();
System.out.println(name+":"+Arrays.toString(request.getParameterValues(name)));
}
}
d,域对象:
request:
一次请求中,响应之前.
请求串,请求链
request.getRequestDispatcher("转发路径").forward(request,response)
服务器内部跳转
客户端的路径: /工程名/编写的路径
服务器的内部路径: /编写的路径
常用方法:
xxxAttribute()
setAttribute(String,Object);
Object getAttribute(String)
removeAttribute()
请求转发与重定向的区别
1.请求转发是服务器内部跳转,地址栏不会发生改变
重定向地址栏会发生改变。
2.请求转发,只有一次请求,一次响应.
重定向,有两次请求,两次响应。
3.请求转发存在request域,可以共享数据.
重定向不存在request域。
4.请求转发只能在服务器的内部跳转,简单说,只能访问本站内资源。
重定向可以访问站外资源,也可以访问站内资源.
5.请求转发是由request 发起的 . request.getRequestDispatcher().forward()
重定向是由response 发起的 response.sendRedirect();
6.请求转发与重定向时路径写法不一样.
重定向要跳转的路径是从浏览器在次发起的,是浏览器端路径,写法: /工程名/资源
请求转发是服务器内部跳转,这时它与浏览器无关 写法:/资源
可用如下图来表示:
请求的中文乱码:
浏览器地址栏使用utf-8编码
tomcat7使用的iso8859-1编码
参数使用utf-8编码,tomcat使用iso-8859-1进行解码出现了乱码.
解决的思路:
把接受的参数先iso-8859-1编码,然后使用utf-8进行解码
对于post请求和get请求可以通过
new String(name.getBytes("iso8859-1"),"utf-8");
对于post请求还可以使用
request.setCharacterEncoding("utf-8");
乱码解决过程
String s="赵四";
String s1=URLEncoder.encode(s,"utf-8");
String s2=URLDecoder.decode(s1, "iso8859-1");
System.out.println(s2);
//先使用iso8859-1编码
String s3 = URLEncoder.encode(s2, "iso8859-1");
//使用utf-8解码
String s4 = URLDecoder.decode(s3, "utf-8");
System.out.println(s4);
[Java拾遗四]JavaWeb基础之Servlet_Request&&Response的更多相关文章
- [Java拾遗三]JavaWeb基础之Servlet
Servlet 1,servlet介绍 servlet是一项动态web资源开发技术. 运行在服务器端. 作用:处理业务逻辑,生成动态的内容,返回给浏览器 ...
- [Java面试三]JavaWeb基础知识总结.
1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...
- JavaWeb基础:Servlet Response
ServletResponse简介 ServletResponse代表浏览器输出,它提供所有HttpResponse的设置接口,可以设置HttpResponse的响应状态,响应头和响应内容. 生命周期 ...
- JavaWeb基础: 学习大纲
JavaWeb基础: Web应用和Web服务器 JavaWeb基础: Tomcat JavaWeb基础:HTTP协议和基于Restful的架构 JavaWeb基础: Web工程配置文件 JavaWeb ...
- 超详细的Java面试题总结(四 )之JavaWeb基础知识总结
系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...
- 关于java基础、多线程、JavaWeb基础、数据库、SSM、Springboot技术汇总
作者 : Stanley 罗昊 本人自行总结,纯手打,有疑问请在评论区留言 [转载请注明出处和署名,谢谢!] 一.java基础 1.多态有哪些体现形式? 重写.重载 2. Overriding的是什么 ...
- 《Thinking In Java第四版》拾遗
<Thinking In Java第四版>拾遗 转自我的github(http://katsurakkkk.github.io/2016/05/Thinking-In-Java%E7%AC ...
- Java基础:Java的四种引用
在Java基础:java虚拟机(JVM)中,我们提到了Java的四种引用.包括:强引用,软引用,弱引用,虚引用.这篇博客将详细的讲解一下这四种引用. 1. 强引用 2. 软引用 3. 弱引用 4. 虚 ...
- JavaWeb基础知识总结
JavaWeb基础知识总结. 1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供 ...
随机推荐
- 第三章 springboot + jedisCluster
如果使用的是redis2.x,在项目中使用客户端分片(Shard)机制.(具体使用方式:第九章 企业项目开发--分布式缓存Redis(1) 第十章 企业项目开发--分布式缓存Redis(2)) 如果 ...
- instr函数
在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置. 语法如下:instr( string1, string2 [, start_position [, nth_appe ...
- 問題排查:.NETSystem.Runtime.Remoting.RemotingException: TCP 信道协议冲突: 应为报头。
這個錯誤訊息是在一個 Web Serveice 的偵錯階段發生的 目前還未找到原因,環境如下: 作業系統:Windows 10 x64 企業版 (簡中) 開發工具:Visual Studio 2013 ...
- C#键盘钩子 鼠标钩子
最新对C#模拟键盘按键,鼠标操作产生了兴趣.特从网上收集了一些常用的API用来调用键盘,鼠标操作. class Win32API { #region DLL导入 /// <summary> ...
- WKWebView与Js (OC版)
OC如何给JS注入对象及JS如何给IOS发送数据 JS调用alert.confirm.prompt时,不采用JS原生提示,而是使用iOS原生来实现 如何监听web内容加载进度.是否加载完成 如何处理去 ...
- 虚拟机VMware新增硬盘无法识别问题
添加硬盘前的硬盘信息 在虚拟机中新增硬盘 添加后发现使用fdisk -l信息不变,新增的硬盘并没有识别,试过重启虚拟机硬盘就会识别出来.如果不想重启则按照如下方法: 先查看/proc/scsi/scs ...
- Apache-Commons包作用说明
Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.项目地址http://commons.apache.org/ Commons BeanUtils 提供 ...
- LeetCode OJ--Minimum Window Substring ***
https://oj.leetcode.com/problems/minimum-window-substring/ 模拟题 这道题细节比较多.从左到右扫一遍模拟着做 class Solution { ...
- 解决VMware下安装Ubuntu15不支持1920X1080分辨率的问题
解决步骤如下: flashmx@ubuntu:~$ cvt # 192.07M9) hsync: 67.16 kHz; pclk: 173.00 MHz Modeline -hsync +vsync ...
- 斯坦福第十七课:大规模机器学习(Large Scale Machine Learning)
17.1 大型数据集的学习 17.2 随机梯度下降法 17.3 微型批量梯度下降 17.4 随机梯度下降收敛 17.5 在线学习 17.6 映射化简和数据并行 17.1 大型数据集的学习