笔记内容的发布主要是怕哪天自己的电脑挂了 之前总结的笔记会丢,所以在这个网站晒出来作为备份,笔记的内容也是自己对此技术的粗浅理解,仅供自己观看,并不能保证全部理解都是正确,还需网友观看时自行鉴别 谢谢
`
Response对象
Response 响应消息
:服务器端发送给客户端的数据
- 功能:设置响应消息
-
设置响应行:格式:HTTP/1.1 200 ok
-
设置状态码:setStatus(int sc)
-
设置响应头:setHeader(String name, String value)
-
设置响应体:
-
使用步骤:
1.获取输出流 然后使用输出流,将数据输出到客户端浏览器
字符输出流:PrintWriter getWriter()
由于这个方法获取的流默认编码的ISO-8859-1
所以要在获取流之前设置response.setContentType("text/html;charset=utf-8");
字节输出流:ServletOutputStream
response.getOutputStream()
//1 设置状态码为302
response.setStatus(302);
//2 设置响应头location
response.setHeader("location","/responseDemo2");
简单的重定向方法:
访问Demo1时 自动重定向到Demo2
response.sendRedirect("重新定向的访问路径");
redirect 重定向特点:
1 重定向地址栏发生变化
2 重定向可以访问自身服务器以外的其他网站
3 重定向是两次请求 不能使用request对象来共享数据
forward 转发的特点:
1 转发地址栏不会改变
2 转发只能访问当前服务器下的资源
3 转发是一次请求 可以使用request对象来共享数据
***************************添加的笔记********************************
重定向的特点:redirect
转发的特点:forward
相同点:转发和重定向都可以实现资源跳转
不同点: 转发是一次请求一次相应
重定向是两次请求两次相应
转发浏览器地址栏不会发生变化
重定向浏览器地址栏会发生变化
转发可以使用request域对象
重定向不可以使用request域对象
转发只能在服务器内部跳转
重定向可以跳转到任意资源
转发不能写工程名
重定向必须要写工程名
路径写法:
相对路径:无法确定路径是否是唯一资源的一种路径。就是找到当前资源和目标资源的相对位置关系。
如:./index.html
不以 / 开头,是以 . 开头的路径
./
: 当前目录
../
:后退一级目录
绝对路径:通过绝对路径可以确定唯一的资源。
如: localhost/day15/responseDemo2
/day15/responseDemo2
以/
开头的路径
问:如何判断定义的路径是给谁使用?
答:判断请求将来从哪儿发出去
1 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)建议使用动态获取 方法在下方。
一般<a>
和<form>
重定向 都是需要加虚拟目录的
2 给服务器使用:内部请求 不需要加虚拟目录
******************************添加笔记*********************************
HTML页面中路径
如果引用的是CSS js 图片 静态资源建议使用相对路径
如果引用的是servlet 建议使用绝对路径
jsp页面中不管引用的是什么资源 都建议使用绝对路径
sevrlet中写路径不管是什么资源 都建议写绝对路径 除了转发不能写工程名
绝对路径:
服务器路径:服务器内部调转不需要加工程名,列子:请求转发
客户端路径:从客户端发出来的请求内容都需要加工程名。
什么时候使用转发 什么时候用重定向呢?
答:在进行资源跳转之前 看有没有使用request域对象,如果用了就必须转发 如果没用request域对象两个都可以用,建议用重定向
绝对路径:/工程名称/资源路径(资源名称)
获取动态虚拟目录的方法:
//动态获取虚拟目录
String contextPath = request.getContextPath();
//把获取的动态虚拟目录在重定向里进行拼接
response.sendRedirect(contextPath +"/拼接的最后路径");
服务器输出字符数据到浏览器
@WebServlet("/responseDemo2")
public class ResponseDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过响应头 告诉浏览器用utf-8来解析我给你发的东西
//简化版本字符输出流中文乱码解决代码:
response.setContentType("text/html;charset=utf-8");
// 1 获取字符输出流
PrintWriter pw = response.getWriter();
//2 获取字符输出流数据
pw.write("Hello response");
}
因为response是由TomCat实现的 而TomCat是由外国人用拉丁编码写的 所以输出中文就会报错
需要用 response.setContentType("text/html;charset=utf-8");
通过这句Cintent-type 来告诉响应头 浏览器用这个来解析后台传过来的文字
2 服务器输出字节数据到浏览器
Servlet("/responseDemo2")
public class ResponseDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//简化版本字符输出流中文乱码解决代码:
response.setContentType("text/html;charset=utf-8");
//1 获取字节输出流
ServletOutputStream sos = response.getOutputStream();
//2 输出数据
sos.write("你好".getBytes("utf-8"));
}
3 验证码
BufferedImage
是Image
的一个子类,Image
和BufferedImage
的主要作用就是将一副图片加载到内存中。BufferedImage
生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便的操作这个图片,通常用来做图片修改操作如大小变换、图片变灰、设置图片透明或不透明等。
能看懂就行
@WebServlet("/checkcodeServlet")
public class CheckcodeServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 声明图片的长宽高
// 宽100xp 高50xp
int width = 100;
int height = 50;
//1 创建对象,验证码图片对象
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//2 美化图片 获取画笔对象
Graphics g = image.getGraphics();
//设置画笔颜色
g.setColor(Color.DARK_GRAY);
//填充一个矩形也就是背景色
g.fillRect(0, 0, width, height);
//画边框
g.setColor(Color.red);
g.drawRect(0, 0, width - 1, height - 1);
//随机数生成
String str = "abcdABCD1234";
//生成随机角标
Random ran = new Random();
//获取字符
for (int i = 0; i <= 4; i++) {
int index = ran.nextInt(str.length());
char ch = str.charAt(index);
g.drawString(ch + "", width / 5 * i, height / 2);
}
//画干扰线
g.setColor(Color.GREEN);
//随机生成坐标点
int x1 = ran.nextInt(width);
int x2 = ran.nextInt(width);
int x3 = ran.nextInt(width);
int x4 = ran.nextInt(width);
g.drawLine(1, 1, 30, 20);
//3 将图片输出到页面展示
ImageIO.write(image, "JPG", response.getOutputStream());
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
ServletContext对象:
概念:代表整个web应用,可以和程序的容器(服务器)来通信
功能:
1获取MIME类型(MIME是互联网通信过程中一种文件数据类型)
格式:大类型/小类型 比如之前响应头常见的text/html就是典型的MIME类型
2域对象共享数据
3获取文件真实(服务器)路径
**获取文件真实路径/读取文件流:它俩是相等的 一模一样。
//方法1 :通过request对象获取
ServletContext context1 = request.getServletContext();
//方法2:HttpServlet获取
ServletContext context2 = this.getServletContext();
1 获取MIME类型(MIME是互联网通信过程中一种文件数据类型)
@WebServlet("/servlet")
public class Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1 获取HttpServlet对象
ServletContext context = this.getServletContext();
//2 定义一个文件名
String filename ="a.jpg";
//3 获取MIME类型
String mimeType = context.getMimeType(filename);
System.out.println(mimeType);
}
-------------------------------------
//结果是:image/jpeg
2域对象共享数据 String getMimeType(String file)
ServletContext
对象范围:所有用户所有请求的数据 谨慎使用
.setAttribute(String name,Object value);
.getAttribute(String name);
.removeAttribute(String name);
3获取文件真实(服务器)路径
方法: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);