04_web基础(六)之请求转发与重定向

时间:2022-08-31 11:00:20

  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的初始化参数:
  04_web基础(六)之请求转发与重定向
      因为配置在当前ServletPage中,所以只能被ServletPage使用,其他Servlet无法使用.
      而在开发中,多个Web组件(Servlet/Filter)可以拥有共同的初始化参数,此时只能配置N次,不利于维护.
      解决方案:使用全局的初始化参数,Web组件都可以共用,配置问web.xml文件中.
  04_web基础(六)之请求转发与重定向
       注意:获取全局的初始化参数,就再也不能使用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基础(六)之请求转发与重定向的更多相关文章

  1. spring mvc 请求转发和重定向&lpar;转&rpar;

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  2. spring mvc 请求转发和重定向

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  3. Spring MVC 3&period;0 请求转发和重定向

    首先看一下如何获得request对象.session对象: 普通的Controller类,示例代码如下: @Controller @RequestMapping(value = "user& ...

  4. HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向

    上篇文章我们讲了servlet的基本原理,这章将讲一下剩余的部分. HttpServletRequest 接口 该接口是 ServletRequest 接口的子接口,封装了 HTTP 请求的相关信息, ...

  5. ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段

      ServletRequest 基本概念 JavaWeb中的 "Request"对象  实际为   HttpServletRequest  或者  ServletRequest, ...

  6. web之请求转发与重定向

    请求转发: 重定向:

  7. JSP中的请求转发与重定向

    在说请求转发和重定向之前,得了解下JSP九大内置对象中的response和request response:将服务器端数据发送到客户端,可通过在客户端浏览器中显示,用户浏览页面的重定向以及在客户端创建 ...

  8. servlet请求转发与重定向的差别------用生活实例来形象说明两者的差别

    1,请求重定向:client行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保留,地址栏的URL地址会改变. 2,请求转发:server行为,req ...

  9. Servlet(五):请求转发和重定向

    请求转发: 问题: 服务器在接收到浏览器的请求后,仅仅使用一个 Servlet进行请求处理,会造成不同的Servlet逻辑代码 冗余,Servlet的职责不明确. 解决: 使用请求转发. 特点: 一次 ...

随机推荐

  1. Android工作学习第5天之TabHost实现菜单栏底部显示

    TabHost是一个装载选项卡窗口的容器,实现分模块显示的效果.像新浪微博客户端.微信客户端都是使用tabehost组件来开发的. TabHost的组成: |---TabWidget:实现标签栏,可供 ...

  2. struts2&colon; config-browser-plugin 与 convention-plugin 学习

    struts2被很多新手诟病的一个地方在于“配置过于复杂”,相信不少初学者因为这个直接改投Spring-MVC了.convention-plugin. config-browser-plugin这二个 ...

  3. Linux&lowbar;linux中profile、bashrc、bash&lowbar;profile之间的区别和联系&lpar;转&rpar;

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置. 英文描述为: # /etc/p ...

  4. 给Jquery动态添加的元素添加事件2

    $('div').on('click', 'button', function(e){console.log($(e.target).is(':button'))}); $('<button&g ...

  5. 彻底弄懂LSH之simHash算法

    马克·吐温曾经说过,所谓经典小说,就是指很多人希望读过,但很少人真正花时间去读的小说.这种说法同样适用于“经典”的计算机书籍. 最近一直在看LSH,不过由于matlab基础比较差,一直没搞懂.最近看的 ...

  6. 如何升级nodejs版本

    直接下载最新版安装即可,例如我本地的nodejs版本为: y@y:untitled$ node -v v0.10.33 当前node官网最新版本为:Current Version: v0.12.2 下 ...

  7. &lbrack;国嵌攻略&rsqb;&lbrack;158&rsqb;&lbrack;SPI裸机驱动设计&rsqb;

    SPI控制器工作流程 SPI控制器提供2个SPI接口.每个SPI接口有两个通道,分别为TX通道和RX通道.CPU要写数据到FIFO中,先写数据到SPI_TX_DATA寄存器中,这样此寄存器中的内容就会 ...

  8. e&period;preventDefault&lpar;&rpar;和e&period;stopPropagation&lpar;&rpar;以及return false的作用和区别

    前段时间开发中,遇到一个父元素和子元素都有事件时,发现会出现事件冒泡现象,虽然知道ev.stopPropagation()和ev.preventDefault()其中一个是阻止事件冒泡和阻止默认行为, ...

  9. 数据库导出excel,前后端分离

    主要参考了这篇博文:https://www.cnblogs.com/jerehedu/p/4343509.html  2.3和2.4 采用xssf,依赖:compile group: 'org.apa ...

  10. CentOS 7 上安装vim(默认未安装)

    今天使用CentOS 7,发现未安装vim,所以重新安装 执行命令: yum -y install vim* 然后就可以使用了