请求转发:一种在服务器内部的资源跳转方式

使用步骤

1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)参数是转发资源的路径

2.使用Requestispatcher对象进行转发

特点:浏览器地址栏路径不会发生变化,只能转发当前服务器内部资源,转发是一次请求

共享数据

域对象:一个有作用范围的对象,可以在范围内共享数据

request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据

方法:

  1. void setAttribute(String name,Object obj):存储数据
  2. Object getAttiude(Stirng name):通过键获取值
  3. void removeAttribute(String name):通过键移除键值对
package com.Data.HttpServlet;

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("/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 {
//使用request对象的方法setAttribute将数据存储到request域中
request.setAttribute("msg","Hello");
System.out.println("RequestDemo1被访问了。。。。");
//转发到requestDemo2
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestDemo2");
requestDispatcher.forward(request,response);
}
}
package com.Data.HttpServlet;

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("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//访问共享数据,通过键获取值
System.out.println(request.getAttribute("msg"));
System.out.println("RequestDemo2被访问了。。。");
}
}
RequestDemo1被访问了。。。。
Hello
RequestDemo2被访问了。。。

获取ServletContext:

ServletContext getServletContext()

HTTP响应消息

服务器端发送给客户端的数据

五种数据格式

1.响应行

1:组成:协议/版本 响应状态吗 状态码描述

2.响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态,状态码都是3位数字有5种状态码

  1. 1xx :服务器接收客户端消息,但没有接收完成,等待一段时间后,发送1xx多状态码
  2. 2xx :成功 。代表数字:200
  3. 3xx :重定向。代表:302(重定向),304(访问缓存)
  4. 4xx :客户端错误。代表(404)请求路径没有对应的资源,405(请求方式没有对应的doxxx方法)
  5. 5xx : 服务端错误。代表:500(服务器内部出现异常,比如代码有错)

2.响应头

格式:头名称 :值

常见的响应头

Content-Type:服务器告诉客户端本次响应体数据格式以继编码格式

Content-dispostition:服务器告诉客户端以什么格式打开响应体数据

3.响应空行

4响应体:传输的数据

重定向:资源跳转方式

package com.data;

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("/Demo1")
public class ResponseServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo1....");
//完成重定向
//设置状态码为302
//response.setStatus(302);
//设置响应头,头的名称,头的值
//response.setHeader("location","/Demo2");
//重定向可以访问其他站点资源
//response.sendRedirect("https://www.baidu.com");//访问了百度
//重定向
response.sendRedirect("/Demo2");
//设置共享数据
request.setAttribute("msg","hello"); }
}
package com.data;

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("/Demo2")
public class ResponseServlet2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//重定向可以访问其他站点的资源
System.out.println("demo2.....");
//重定向不能访问共享数据
Object o1 = request.getAttribute("msg");
System.out.println(o1);
}
}
输出结果

demo1....
demo2.....
null

重定向的特点:redirect

  1. 地址栏发生变化
  2. 重定向可以访问其它站点服务器的资源
  3. 重定向是两次请求,,不拿使用request对象来共享数据
路径写法

相对路径:通过相对路径不可以确定唯一资源

绝对路径: 通过绝对路径可以确定唯一资源,给客户端浏览器使用需要加虚拟目录,给服务器使用,不需要加虚拟目录

服务器输出字符数据到浏览器

package com.data;

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("/Demo3")
public class ResponseServlet3 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用响应头,告诉浏览器我使用的编码
//浏览器收到响应,就会按照指定字符集解码
response.setContentType("text/html;charset=utf-8");
//response.setHeader("content-type","text/html;charset=utf-8");
//向客户端输出数据,先要获取字符输出流
PrintWriter writer = response.getWriter();
writer.write("<h1>你好,world</h1>");
}
}
服务器输出字节数据到浏览器
package com.data;

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.io.IOException;
import java.io.PrintWriter; @WebServlet("/Demo3")
public class ResponseServlet3 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write("你好,客户端".getBytes("utf-8"));
}
}
验证码
package com.data;

import javax.imageio.ImageIO;
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.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random; @WebServlet("/Demo4")
public class CheckCodeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int width = 100;
int height = 50;
//创建对象,该对象可以在内存中生成图片
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//美化图片
//填充背景色
Graphics g = image.getGraphics();
g.setColor(Color.PINK);
g.fillRect(0,0,width,height);
//画边框
g.setColor(Color.BLUE);
g.drawRect(0,0,width-1,height-1);
String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; // 写验证码
Random ran = new Random();
for(int i = 1;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);
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);
} //将图片输出到页面上
ImageIO.write(image,"jpg",resp.getOutputStream()); } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
// 分析:
// 点击超链接或者图片,需要换一张,
// 给图片和超链接绑定单击事件
window.onload=function () {
//获取图片对象
var img=document.getElementById("change");
//绑定单击事件
img.onclick=function () {
var date =new Date().getTime();
img.src="/day14/Demo4"+date;
}
}
</script>
</head>
<body>
<img id="checkCode" src="/day14/Demo4" />
<a id="change" href="">看不清?换一张</a>
</body>
</html>
ServletContext对象:

1.概念:代表整个web应用,可以和程序的容器来通信

获取方式:

1.request.getServletContext();

2.this.getServletContext();

功能:获取MIME类型(在互联网通信过程种定义的一种文件数据类型,不如text/html,image/jpeg)

package com.data;

import javax.servlet.ServletContext;
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("/Demo5")
public class ServletDemo5 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取MIME类型
ServletContext context=this.getServletContext();
//定义文件名称
String filename = "a.jpg";
//获取MIME类型
String mimeType = context.getMimeType(filename);
System.out.println(mimeType);
}
} //image/jpeg

功能:域对象,共享数据

域对象的方法

setArrtibute(String name,Object value)

getAttribute(String name)

removeAttribute(String name)

功能:获取文件服务器路径

文件在项目目录下,可以直接文件名获取路径
在WEB-INF目录下,需要加上WEB-INF才可以获取
src目录下的所有文件将来都存放在/WEB-INF/classes目录下
package com.data;

import javax.servlet.ServletContext;
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("/Demo5")
public class ServletDemo5 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取web目录下的资源访问
ServletContext context = this.getServletContext();
String realPath = context.getRealPath("/b.txt");//b.txt在项目目录下,可以直接文件名获取路径
System.out.println(realPath);
//获取WEB-INF目录下的资源访问
String realPath1 = context.getRealPath("/WEB-INF/c.txt");//c.txt在WEB-INF目录下,需要加上WEB-INF才可以获取到路径
System.out.println(realPath1);
//获取src目录下的资源能路径
String realPath2 = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的所有文件将来都存放在/WEB-INF/classes目录下
System.out.println(realPath2);
}
}

笔记-JavaWeb学习之旅11的更多相关文章

  1. 笔记-JavaWeb学习之旅5

    CP30的演示 package cn.itcast.datasourcejdbc; import com.mchange.v2.c3p0.ComboPooledDataSource; import j ...

  2. 笔记-JavaWeb学习之旅13

    验证码案列 昨天晚上出现的500错误原因在于验证码没有获取到,获取验证码是应该获取的是共享域中的验证码,而我把获取值得键给写成了jsp中的键,而不是内存生成图片中,然后把图片上传到共享域中的键.这两个 ...

  3. 笔记-JavaWeb学习之旅7

    JavaScript基础 概念:一门客户端脚本语言,运行在客户端浏览器中,每一个浏览器都有JavaScript的解析引擎,是一个脚本语言,不需要编译,直接就可以被浏览器解析执行. JavaScript ...

  4. 笔记-JavaWeb学习之旅19

    Redis:redis是一款高性能的NOSQL系列的非关系型数据库 NOSQL: Not Only SQL ,意即"不仅仅是SQL",是一项全新的数据库理念,泛指非关系型数据库 r ...

  5. 笔记-JavaWeb学习之旅18

    AJAX:ASynchronous JavaScript And XML 异步的JavaScript 和XML 异步和同步:客户端和服务器端相互通信的基础上 同步:客户端操作后必须等待服务器端的响应, ...

  6. 笔记-JavaWeb学习之旅17

    1.过滤选择器 首元素选择器:first 获得选择的元素中的第一个元素 尾元素选择器:last获得选择元素中的最后一个元素 非元素选择器:not(selector) 不包括指定内容的元素 偶数选择器: ...

  7. 笔记-JavaWeb学习之旅16

    增强对象的功能 动态代理:在内存中形成代理类 实现步骤: 代理对象和真实对象实现相同的接口 代理对象 = Proxy.newProxyInstance(); 使用代理对象调用真实对象的方法 增强方法 ...

  8. 笔记-JavaWeb学习之旅15

    Filter:过滤器 概念:当访问服务器的资源是,过滤器可以将请求拦截下来,完成一些特殊的功能 快速入门: 步骤: 定义一个类,实现接口Filter 复写方法 配置拦截路径 package com.d ...

  9. 笔记-JavaWeb学习之旅14

    JSTL:JavaServer Pages Tag Library JSP标准标签库 if标签 <%@ page import="java.util.ArrayList" % ...

随机推荐

  1. FIL代币是什么?

    自从比特币价格暴涨.区块链技术火了以后,出现了币圈,币圈中有各种各样的代币,本文就和大家介绍其中的FIL代币相关内容,希望能帮助大家一点一点的了解币圈.        IPFS与Filecoin的关系 ...

  2. 【Effective C++】设计与声明

    条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. 2,“促进正使用”的办法包括接口的一致性,以及与内置类型的行为兼容. ...

  3. window cmd 自动补全

    1. 用命令里输入regedit注册表 WIN+R 快捷输入 regedit regedit2. 键值改为9(十进制) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Co ...

  4. 自动化测试框架selenium+java+TestNG——配置篇

    最近来总结下自动化测试 selenium的一些常用框架测试搭配,由简入繁,最简单的就是selenium+java+TestNG了,因为我用的是java,就只是总结下java了. TestNG在线安装: ...

  5. js Date 函数方法及日期计算

    js Date 函数方法 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份 ...

  6. Swift下表和方法

    本文将同时阐述Swift的方法和下标,因为根据我的理解,从某种程度上讲,下标的本质也是方法. 方法 众所周知,在支持面向对象的语言里,方法一般分为两种:实例方法和类方法(在有的语言中,「类方法」被称为 ...

  7. AQS与重入锁ReetrantLock原理

    一.AQS原理 AQS(AbstractQueuedSynchronizer)队列同步器是用来构建锁.同步组件的基础框架. AQS内部通过一个volatile int类型的成员变量state控制同步状 ...

  8. HDU 1394 树状数组+离散化求逆序数

    对于求逆序数问题,学会去利用树状数组进行转换求解方式,是很必要的. 一般来说我们求解逆序数,是在给定一串序列里,用循环的方式找到每一个数之前有多少个比它大的数,算法的时间复杂度为o(n2). 那么我们 ...

  9. C#视频取帧图

    由于项目里页面有许多视频资料需要展示给用户查看,因此需要做一个视频列表,原设计是列表显示视频第一帧图,但实际上很多视频第一帧是纯黑底色. 于是想到用js利用canvas截图,最后发现由于浏览器跨域限制 ...

  10. HTML5/jQuery雷达动画图表 图表配置十分简单

    1.HTML5/jQuery雷达动画图表 图表配置十分简单 之前我们介绍过不少形形色色的HTML5图表了,像这款HTML5折线图表Aristochart是一款很不错的折线图表,这款HTML5 Canv ...