04_web基础(六)之请求转发与重定向
1.交互方式
Web组件之间跳转: 从AServlet 跳转到 BServlet.
三种类型:
1:请求转发(forward)
2:URL重定向(redirect)
3:请求包含(include)
34.请求转发详讲(非常重要)
请求转发(forward):
AServlet操作完毕之后,请求转发到BServlet,继续完成余下的功能.
语法:
request对象.getRequestDispatcher(String path).forward(request,response);
参数:
path:表示目标资源名称(跳转到哪里去)
注意:别忘了写forward(request,response).
=============================================================================
请求转发的特点:
1):浏览器地址栏路径没变,依然是Servlet1的资源名称.
2):只发送了一个请求.
3):共享同一个请求,在请求中共享数据.
4):最终的响应输出由Servlet2来决定.
5):只能访问当前应用中的资源,不能跨域跳转.
6):可以访问WEB-INF中的资源.
7):转发完成之后,Servlet1中的业务代码继续执行
代码实现
package com.day07.web.demo2.controller2; 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; /**
* 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
* 疑问咨询wx:851298348
*/ /**
* 请求转发(forward):
AServlet操作完毕之后,请求转发到BServlet,继续完成余下的功能.
语法:
request对象.getRequestDispatcher(String path).forward(request,response); 参数:
path:表示目标资源名称(跳转到哪里去)
注意:别忘了写forward(request,response).
=============================================================================
请求转发的特点:
1):浏览器地址栏路径没变,依然是Servlet1的资源名称.
2):只发送了一个请求.
3):共享同一个请求,在请求中共享数据.
4):最终的响应输出由Servlet2来决定.
5):只能访问当前应用中的资源,不能跨域跳转.
6):可以访问WEB-INF中的资源.
7):转发完成之后,Servlet1中的业务代码继续执行 */
@WebServlet("/a")
public class AServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 从AServlet跳转到BServlet
System.out.println("------AServlet----------");
// request对象.getRequestDispatcher(String path).forward(request,response);
//请求转发
req.setAttribute("name","wuji");//作用范围:仅仅限于当前请求
// req.getRequestDispatcher("/b").forward(req,resp); req.getRequestDispatcher("/WEB-INF/views/a.jsp").forward(req,resp);
System.out.println("------AServlet---已完成转发-------");
//https://www.baidu.com/
//req.getRequestDispatcher("https://www.baidu.com/").forward(req,resp);//
PrintWriter writer = resp.getWriter();
writer.print("==========A============");
}
}
AServlet
package com.day07.web.demo2.controller2; 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; /**
* 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
* 疑问咨询wx:851298348
*/
@WebServlet("/b")
public class BServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("------BServlet----------");
String name = (String) req.getAttribute("name");
System.out.println("name="+name);
PrintWriter writer = resp.getWriter();
writer.print("==========B============");
}
}
BServlet
<%--
Created by IntelliJ IDEA.
User: lidongping
Date: 2018/5/3
Time: 17:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>a标题</title>
</head>
<body>
我是AServlet
</body>
</html>
a.jsp
35.重定向详解(非常重要)
URL重定向(redirect):
AServlet操作完毕之后,重定向到BServlet,继续完成余下的功能.
语法:
response对象.sendRedirect(String path);
参数:path,表示目标资源名称.
------------------------------------------------------------------------
URL重定向的特点:
1):浏览器地址栏路径发送变化,变成Servlet2的资源名称.
2):发送了两个请求.
3):因为是不同的请求,所以不能共享请求中的数据.
4):最终的响应输出由Servlet2来决定.
5):可以跨域访问资源.
6):不可以访问WEB-INF中的资源.
代码:
package com.day07.web.demo2.controller2; 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; /**
* 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
* 疑问咨询wx:851298348
*/ /**
* URL重定向(redirect):
AServlet操作完毕之后,重定向到BServlet,继续完成余下的功能.
语法:
response对象.sendRedirect(String path);
参数:path,表示目标资源名称.
------------------------------------------------------------------------
URL重定向的特点:
1):浏览器地址栏路径发送变化,变成Servlet2的资源名称.
2):发送了两个请求.
3):因为是不同的请求,所以不能共享请求中的数据.
4):最终的响应输出由Servlet2来决定.
5):可以跨域访问资源.
6):不可以访问WEB-INF中的资源. */
@WebServlet("/c")
public class CServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("------CServlet----------");
//response对象.sendRedirect(String path);
req.setAttribute("key","周美玲");
// resp.sendRedirect("/d");
//resp.sendRedirect("https://www.baidu.com/");
resp.sendRedirect("/WEB-INF/views/a.jsp"); System.out.println("------CServlet-----已跳转完成-----");
PrintWriter writer = resp.getWriter();
writer.print("------------CServlet----------");
}
}
CServlet
package com.day07.web.demo2.controller2; 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; /**
* 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
* 疑问咨询wx:851298348
*/
@WebServlet("/d")
public class DServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("------DServlet----------");
String key = (String) req.getAttribute("key");
System.out.println("-------------------"+key);
PrintWriter writer = resp.getWriter();
writer.print("------------DServlet----------"); }
}
DServlet
36.生产生如何选择请求转发还是重定向
请求转发和URL重定向的选择?
1:若需要共享请求中的数据,只能使用请求转发.
2:若需要访问WEB-INF中的资源,只能使用请求转发.
3:若需要跨域访问,只能使用URL重定向.
4:其他时候,任选.
37.四大作用域(非常重要)
Web组件(Servlet/JSP)的数据共享得需要作用域对象.
作用域对象存在的意义:在多个Web组件之间共享和传递数据.
四大作用域对象:
名称 类型 描述
----------------------------------------------------------------------------------------------------------------
request HttpServletRequest 表示当前请求范围. 只是共享同一个请求中的数据,若是不同的请求之间,是不能共享的,每次请求都是新的请求对象.
pageContext(page) PageContext 表示当前JSP页面的范围(讲jsp的时候说).
session HttpSession 表示当前会话范围. 只要浏览器不关闭,session就是同一个对象.就可以共享该会话中的数据.
application ServletContext 表示当前应用范围. Tomcat开始启动,application对象就创建好了,Tomcat关闭application对象销毁.
在整个Web的生命周期中(Tomcat启动--Tomcat关闭),有且只有一个application对象.
-----------------------------------------------------------------------------------------------------------------
设置共享信息:
域对象.setAttribute(String name,Object value);
获取共享信息:
Object value = 域对象.getAttribute(String name);
修改共享信息:
重新设置一个同名的属性.
删除共享信息:
域对象.removeAttribue(String name);
注意:往哪一个作用域对象中存储数据,就只能从哪一个作用域中获取数据.
基本: 一般的组件之间的数据共享,存放在request中,此时只能使用请求转发.
登陆信息存放在Session中.
代码:
package com.day07.web.demo2.controller2; 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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter; /**
* 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
* 疑问咨询wx:851298348
*/
@WebServlet("/demoServlet")
public class DemoServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
//request 请求作用域 HttpServletRequest
//取出来
Integer num1 = (Integer)req.getAttribute("request");
System.out.println("num1="+num1); //放数据
if (num1==null || num1==0){
num1=1;
req.setAttribute("request",num1);
}else {
num1=num1+1;
req.setAttribute("request",num1);
} System.out.println("request="+num1);//在控制台输出
writer.println("request="+num1);//在页面输出 //session 作用域
//1.获取session对象
HttpSession session = req.getSession(); //取出来
Integer num2 = (Integer)session.getAttribute("session"); //放数据
if (num2==null || num2==0){
num2=1;
session.setAttribute("session",num2);
}else {
num2=num2+1;
session.setAttribute("session",num2);
} System.out.println("session="+num2);//在控制台输出
writer.println("session="+num2);//在页面输出 //ServletContext 作用域
//1.获得ServletContext 应用上下文
ServletContext servletContext = req.getServletContext();
//取出来
Integer num3 = (Integer)servletContext.getAttribute("servletContext"); // key value x=2 //放数据
if (num3==null || num3==0){
num3=1;
servletContext.setAttribute("servletContext",num3);
}else {
num3=num3+1;
servletContext.setAttribute("servletContext",num3);
} System.out.println("servletContext="+num3);//在控制台输出
writer.println("servletContext="+num3);//在页面输出 }
}
DemoServlet
38.ServletContext的API学习
ServletContext接口,表示的应用,Tomcat启动的时候创建一个对象,Tomcat关闭对象销毁,在整个Web的生命周期中,只有一个对象,表示的就是当前应用.
===========================================================================
如何获取该对象:
1):若在Servlet中:
ServletContext ctx = super.getServletContext();
GenericServlet实现了Servlet和ServletConfig接口,而getServletContext方法就在ServletConfig接口中.
2):通过请求对象获取:
ServletContext ctx2 = req.getServletContext();:从Tomcat7开始支持
ServletContext ctx3 = req.getSession().getServletContext();//遥远以前
==============================================================================
常用方法:
1):String getContextPath():获取当前应用的上下文路径.
2):String getRealPath(String path):获取某个资源的路径.
3):全局初始化参数:
先看传统的Servlet的初始化参数:

因为配置在当前ServletPage中,所以只能被ServletPage使用,其他Servlet无法使用.
而在开发中,多个Web组件(Servlet/Filter)可以拥有共同的初始化参数,此时只能配置N次,不利于维护.
解决方案:使用全局的初始化参数,Web组件都可以共用,配置问web.xml文件中.

注意:获取全局的初始化参数,就再也不能使用ServletConfig对象.getInitParameter来获取了.
只能使用,ServletContext对象.getInitParameter(String paramName);
面试题:
说说以下的区别:
request.getParameter(String name)://获取用户输入的参数信息
request.getAtribute(String name): //获取程序员自己设置的共享信息
===========================================================
ServletConfig对象.getInitParameter(String name);
ServletContext对象.getInitParameter(String name);
代码:
package com.day07.web.demo2.controller2; 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; /**
* 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html
* 疑问咨询wx:851298348
*/
@WebServlet("/servletContextDemoServlet")
public class ServletContextDemoServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取对象 ServletContext ctx2 = req.getServletContext();:从Tomcat7开始支持
ServletContext servletContext = req.getServletContext();
// 1):String getContextPath():获取当前应用的上下文路径.
String contextPath = servletContext.getContextPath();
System.out.println("contextPath="+contextPath);
// 2):String getRealPath(String path):获取某个资源的路径.
String realPath = servletContext.getRealPath("/servletContextDemoServlet");
System.out.println("realPath="+realPath);
//全局初始化参数:
String name1 = servletContext.getInitParameter("name1");
System.out.println("name1="+name1); }
}
ServletContextDemoServlet
04_web基础(六)之请求转发与重定向的更多相关文章
- spring mvc 请求转发和重定向(转)
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- spring mvc 请求转发和重定向
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- Spring MVC 3.0 请求转发和重定向
首先看一下如何获得request对象.session对象: 普通的Controller类,示例代码如下: @Controller @RequestMapping(value = "user& ...
- HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向
上篇文章我们讲了servlet的基本原理,这章将讲一下剩余的部分. HttpServletRequest 接口 该接口是 ServletRequest 接口的子接口,封装了 HTTP 请求的相关信息, ...
- ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
ServletRequest 基本概念 JavaWeb中的 "Request"对象 实际为 HttpServletRequest 或者 ServletRequest, ...
- web之请求转发与重定向
请求转发: 重定向:
- JSP中的请求转发与重定向
在说请求转发和重定向之前,得了解下JSP九大内置对象中的response和request response:将服务器端数据发送到客户端,可通过在客户端浏览器中显示,用户浏览页面的重定向以及在客户端创建 ...
- servlet请求转发与重定向的差别------用生活实例来形象说明两者的差别
1,请求重定向:client行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保留,地址栏的URL地址会改变. 2,请求转发:server行为,req ...
- Servlet(五):请求转发和重定向
请求转发: 问题: 服务器在接收到浏览器的请求后,仅仅使用一个 Servlet进行请求处理,会造成不同的Servlet逻辑代码 冗余,Servlet的职责不明确. 解决: 使用请求转发. 特点: 一次 ...
随机推荐
- Java基本知识进阶
1.static 2.代码块 3.继承 4.抽象类 5.接口 6.多态 7.包 8.权限修饰符 9.内部类 10.字节码 11.包装类 12.装箱&拆箱 13.正则表达式 14.异常 15.反 ...
- java 怎样向一个已存在的文件中添加内容
如果想向某个文件最后添加内容,可使用FileWriter fw = new FileWriter("log.txt",true);在创建FileWriter时加个true就可以了. ...
- 查询oracle约束所关联的表
ORA-02292: 违反完整约束条件 (ADMIN.FK_PROJECTP_RELATIONS_OFFICIAL) - 已找到子记录 遇到这样的错误,熟悉的话可能从约束名称看出是那张表的约束,因为名 ...
- gentoo AR9285 BCM57780 安装驱动
首先使用启动光盘启动, 然后 mount /dev/sda4 /mnt/gentoo 挂载硬盘 lspci -v 1>/mnt/gentoo/root/lspci_v.txt 输出信息到文件. ...
- mongodb对数据的增删改查
数据类型 下表为MongoDB中常用的几种数据类型: Object ID:文档ID String:字符串,最常用,必须是有效的UTF-8 Boolean:存储一个布尔值,true或false Inte ...
- 关于 version control
1.什么是 version control 版本控制(Vevision control)是维护工程蓝图的标准作法,能追踪工程蓝图从诞生一直到定案的过程.此外,版本控制也是一种软体工程技巧,借此能在软体 ...
- STM32F103C8开发板原理图和管脚图
- MiniDao支持ID自增主键策略,使用讲解
用法示例: /** * 插入数据(ID采用自增策略,并返回自增ID) * @param employee */ @IdAutoGenerator(generator="native" ...
- day14-函数
1.定义函数 一个函数就是封闭一个功能def 函数名(): 函数代码注意:函数名不要用默认的关键字.否则会将默认关键字函数覆盖掉. 命名规则与变量相同,使用字母.数字.下划线组成,不能以数字开关 2. ...
- RocketMQ服务搭建_1
rocketmq是阿里研发,并贡献给Apache的一款分布式消息中间件. RcoketMQ 是一款低延迟.高可靠.可伸缩.易于使用的消息中间件. ACE环境:(Adapted communicatio ...