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中的业务代码继续执行
代码实现
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.day07.web.demo2.controller2; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.annotation.WebServlet; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 import java.io.IOException; 9 import java.io.PrintWriter; 10 11 /** 12 * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html 13 * 疑问咨询wx:851298348 14 */ 15 16 /** 17 * 请求转发(forward): 18 AServlet操作完毕之后,请求转发到BServlet,继续完成余下的功能. 19 语法: 20 request对象.getRequestDispatcher(String path).forward(request,response); 21 22 参数: 23 path:表示目标资源名称(跳转到哪里去) 24 注意:别忘了写forward(request,response). 25 ============================================================================= 26 请求转发的特点: 27 1):浏览器地址栏路径没变,依然是Servlet1的资源名称. 28 2):只发送了一个请求. 29 3):共享同一个请求,在请求中共享数据. 30 4):最终的响应输出由Servlet2来决定. 31 5):只能访问当前应用中的资源,不能跨域跳转. 32 6):可以访问WEB-INF中的资源. 33 7):转发完成之后,Servlet1中的业务代码继续执行 34 35 */ 36 @WebServlet("/a") 37 public class AServlet extends HttpServlet { 38 @Override 39 public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 40 // 从AServlet跳转到BServlet 41 System.out.println("------AServlet----------"); 42 // request对象.getRequestDispatcher(String path).forward(request,response); 43 //请求转发 44 req.setAttribute("name","wuji");//作用范围:仅仅限于当前请求 45 // req.getRequestDispatcher("/b").forward(req,resp); 46 47 req.getRequestDispatcher("/WEB-INF/views/a.jsp").forward(req,resp); 48 System.out.println("------AServlet---已完成转发-------"); 49 //https://www.baidu.com/ 50 //req.getRequestDispatcher("https://www.baidu.com/").forward(req,resp);// 51 PrintWriter writer = resp.getWriter(); 52 writer.print("==========A============"); 53 } 54 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.day07.web.demo2.controller2; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.annotation.WebServlet; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 import java.io.IOException; 9 import java.io.PrintWriter; 10 11 /** 12 * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html 13 * 疑问咨询wx:851298348 14 */ 15 @WebServlet("/b") 16 public class BServlet extends HttpServlet { 17 @Override 18 public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 19 20 System.out.println("------BServlet----------"); 21 String name = (String) req.getAttribute("name"); 22 System.out.println("name="+name); 23 PrintWriter writer = resp.getWriter(); 24 writer.print("==========B============"); 25 } 26 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%-- 2 Created by IntelliJ IDEA. 3 User: lidongping 4 Date: 2018/5/3 5 Time: 17:49 6 To change this template use File | Settings | File Templates. 7 --%> 8 <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> 9 <html> 10 <head> 11 <title>a标题</title> 12 </head> 13 <body> 14 我是AServlet 15 </body> 16 </html>
35.重定向详解(非常重要)
URL重定向(redirect):
AServlet操作完毕之后,重定向到BServlet,继续完成余下的功能.
语法:
response对象.sendRedirect(String path);
参数:path,表示目标资源名称.
------------------------------------------------------------------------
URL重定向的特点:
1):浏览器地址栏路径发送变化,变成Servlet2的资源名称.
2):发送了两个请求.
3):因为是不同的请求,所以不能共享请求中的数据.
4):最终的响应输出由Servlet2来决定.
5):可以跨域访问资源.
6):不可以访问WEB-INF中的资源.
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.day07.web.demo2.controller2; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.annotation.WebServlet; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 import java.io.IOException; 9 import java.io.PrintWriter; 10 11 /** 12 * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html 13 * 疑问咨询wx:851298348 14 */ 15 16 /** 17 * URL重定向(redirect): 18 AServlet操作完毕之后,重定向到BServlet,继续完成余下的功能. 19 语法: 20 response对象.sendRedirect(String path); 21 参数:path,表示目标资源名称. 22 ------------------------------------------------------------------------ 23 URL重定向的特点: 24 1):浏览器地址栏路径发送变化,变成Servlet2的资源名称. 25 2):发送了两个请求. 26 3):因为是不同的请求,所以不能共享请求中的数据. 27 4):最终的响应输出由Servlet2来决定. 28 5):可以跨域访问资源. 29 6):不可以访问WEB-INF中的资源. 30 31 */ 32 @WebServlet("/c") 33 public class CServlet extends HttpServlet { 34 @Override 35 public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 36 System.out.println("------CServlet----------"); 37 //response对象.sendRedirect(String path); 38 req.setAttribute("key","周美玲"); 39 // resp.sendRedirect("/d"); 40 //resp.sendRedirect("https://www.baidu.com/"); 41 resp.sendRedirect("/WEB-INF/views/a.jsp"); 42 43 System.out.println("------CServlet-----已跳转完成-----"); 44 PrintWriter writer = resp.getWriter(); 45 writer.print("------------CServlet----------"); 46 } 47 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.day07.web.demo2.controller2; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.annotation.WebServlet; 5 import javax.servlet.http.HttpServlet; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 import java.io.IOException; 9 import java.io.PrintWriter; 10 11 /** 12 * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html 13 * 疑问咨询wx:851298348 14 */ 15 @WebServlet("/d") 16 public class DServlet extends HttpServlet { 17 @Override 18 public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 19 System.out.println("------DServlet----------"); 20 String key = (String) req.getAttribute("key"); 21 System.out.println("-------------------"+key); 22 PrintWriter writer = resp.getWriter(); 23 writer.print("------------DServlet----------"); 24 25 } 26 }
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中.
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.day07.web.demo2.controller2; 2 3 import javax.servlet.ServletContext; 4 import javax.servlet.ServletException; 5 import javax.servlet.annotation.WebServlet; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import javax.servlet.http.HttpSession; 10 import java.io.IOException; 11 import java.io.PrintWriter; 12 13 /** 14 * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html 15 * 疑问咨询wx:851298348 16 */ 17 @WebServlet("/demoServlet") 18 public class DemoServlet extends HttpServlet { 19 @Override 20 public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 21 PrintWriter writer = resp.getWriter(); 22 //request 请求作用域 HttpServletRequest 23 //取出来 24 Integer num1 = (Integer)req.getAttribute("request"); 25 System.out.println("num1="+num1); 26 27 //放数据 28 if (num1==null || num1==0){ 29 num1=1; 30 req.setAttribute("request",num1); 31 }else { 32 num1=num1+1; 33 req.setAttribute("request",num1); 34 } 35 36 System.out.println("request="+num1);//在控制台输出 37 writer.println("request="+num1);//在页面输出 38 39 //session 作用域 40 //1.获取session对象 41 HttpSession session = req.getSession(); 42 43 //取出来 44 Integer num2 = (Integer)session.getAttribute("session"); 45 46 47 //放数据 48 if (num2==null || num2==0){ 49 num2=1; 50 session.setAttribute("session",num2); 51 }else { 52 num2=num2+1; 53 session.setAttribute("session",num2); 54 } 55 56 System.out.println("session="+num2);//在控制台输出 57 writer.println("session="+num2);//在页面输出 58 59 //ServletContext 作用域 60 //1.获得ServletContext 应用上下文 61 ServletContext servletContext = req.getServletContext(); 62 //取出来 63 Integer num3 = (Integer)servletContext.getAttribute("servletContext"); // key value x=2 64 65 66 //放数据 67 if (num3==null || num3==0){ 68 num3=1; 69 servletContext.setAttribute("servletContext",num3); 70 }else { 71 num3=num3+1; 72 servletContext.setAttribute("servletContext",num3); 73 } 74 75 System.out.println("servletContext="+num3);//在控制台输出 76 writer.println("servletContext="+num3);//在页面输出 77 78 79 80 } 81 }
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);
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.day07.web.demo2.controller2; 2 3 import javax.servlet.ServletContext; 4 import javax.servlet.ServletException; 5 import javax.servlet.annotation.WebServlet; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import java.io.IOException; 10 11 /** 12 * 课程笔记:http://www.cnblogs.com/newAndHui/category/1153640.html 13 * 疑问咨询wx:851298348 14 */ 15 @WebServlet("/servletContextDemoServlet") 16 public class ServletContextDemoServlet extends HttpServlet { 17 @Override 18 public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 19 //获取对象 ServletContext ctx2 = req.getServletContext();:从Tomcat7开始支持 20 ServletContext servletContext = req.getServletContext(); 21 // 1):String getContextPath():获取当前应用的上下文路径. 22 String contextPath = servletContext.getContextPath(); 23 System.out.println("contextPath="+contextPath); 24 // 2):String getRealPath(String path):获取某个资源的路径. 25 String realPath = servletContext.getRealPath("/servletContextDemoServlet"); 26 System.out.println("realPath="+realPath); 27 //全局初始化参数: 28 String name1 = servletContext.getInitParameter("name1"); 29 System.out.println("name1="+name1); 30 31 } 32 }