(二十八)请求转发与重定向


请求转发和重定向

作用: 用于web组件的跳转,从A组件调到另一个组件


请求转发forward

由服务器端进行页面跳转,称为转发 .服务器只发出了一次请求

方法

request.getRequestDispatcher("/需要跳转的地址").forward(req,resp);

1.在请求转发中,地址栏中的参数可以共享
2.请求转发中,最后显示在浏览器上的内容为最后一个资源的内容
3.在请求转发中,不能访问站外(跨域)资源. 跨域:ip,端口,协议 任意一个改变都叫跨域
4.在请求转发中,地址栏不发生改变(对于浏览器来说 只发送 只有一次请求)
5.在请求转发中,可以访问WEB-INF下面的资源
@WebServlet("/forward/one")
public class OneServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("OneServlet.service");
          //接收参数
        String name = req.getParameter("name");
        System.out.println("OneServletName = " + name);
        //请求转发
        req.getRequestDispatcher("/forward/two").forward(req,resp);
       // req.getRequestDispatcher("index.jsp").forward(req,resp);

        //req.getRequestDispatcher("http://baidu.com").forward(req,resp);
        return;


    }
}

@WebServlet("/forward/two")
public class TwoServlet extends HttpServlet {

   /* @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("TwoServlet.service");
        String name = req.getParameter("name");
        System.out.println("TwoServletName = " + name);

        resp.getOutputStream().write("我是twoServlet".getBytes());

    }*/
}

使用request.getRequestDispatcher("/需要跳转的地址").forward(req,resp),可以与JSP交互,如果jsp文件是在WEB-INF目录下,则跳转地址为 : /WEB-INF/xxx.jsp


重定向redirect

由客户端进行的页面跳转,称为重定向。服务器发出多次请求

1.在重定向中,地址栏中的参数不能共享
2.在重定向中,最后显示在浏览器上的内容为最后一个资源的内容
3.在重定向中,能访问站外资源(跨域访问)
4.在重定向中,地址栏发生改变(表示有多次请求)
5.在重定向中,不可以访问WEB-INF下面的资源


转发与重定向的区别

  • 地址栏: 转发地址栏不会发生改变,还是上一个地址. 重定向会变化,新地址

​ 在请求转发中,地址栏中的参数可以共享,在重定向中,地址栏中的参数不能共享

  • 跳转位置:转发在服务端进行跳转 ,重定向在浏览器跳转
  • 跨域访问: 在请求转发中,不能访问站外(跨域)资源 ,重定向中可以


三大作用域

用于Servlet之间数据共享的服务器内存区域,作用域结构是一个Map<String,Object>

作用域类型作用范围
请求域HttpServletRequest只在同一次请求起作用
会话域HttpSession同一会话起作用,浏览器第一次访问知道浏览器关闭称为一次会话
上下文域ServletContext服务器启动知道服务器关闭整个过程都起作用

从上到下,有限期变长

请求域:只有在请求转发中才能用


作用域方法

域对象

这里的req只是我举例的一个参数

  • request域:req.setAttribute("键",Object数据(可以传入集合对象))
  • session域:req.getSession().setAttribute(“键”,Object数据)
  • 上下文域:req.getServletContext().setAttribute(“键”,object)

获取值

Object getAttribute(“键”) :从中得到一个值


EL表达式

概念: EL(Expression Language) :表达式语言

简单来说就是让JSP代码更加简化,这里只是简单了解一下即可

语法: ${变量名或者表达式}

@WebServlet("/el")
public class ELServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("name","小罗");

        req.getRequestDispatcher("/WEB-INF/el.jsp").forward(req,resp);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
名字:${name}

</body>
</html>
  • 获取对象中的属性 对象.属性 或者对象[‘属性名称’]
El算术表达式

+,- , * , 除: /或者(div) , 取余%或者mod

比较表达式

在这里插入图片描述

逻辑表达式

&& 或者and
||
! 或者not

三元运算符
${逻辑判断?:}
判空表达式(注意)

判空,判断内容是否为空,不是对象是否为空

在这里插入图片描述

从EL作用域取值

页面域对象名:pageContext,是JSp其中一个内置对象名

pageContext对象

pageContext.findAttribute("msg") 先去request 域寻找key为msg对应的value值,如果找不到,则去session中寻找,如果没有就去servletContext中寻找,如果找不到则返回空字符串""


JSTL标签库

主要还是为了简化JSP

常用的标签库
  • 核心标签库 url:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>,用于页面逻辑控制 ,例如 if,forEach 前缀为 :c
  • 格式化标签库:<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>,用于执行格式化操作,如格式化日志字符串 前缀:fmt

使用前,需要导包 在:\apache-tomcat-8.5.46\webapps\examples\WEB-INF\lib下

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%--test 里面放入之歌判断表达式--%>
<c:if test="${age>=18}">
    成年人,可以蹦迪
</c:if>

<%--choose--%>
<c:choose>
    <c:when test="">

    </c:when>
    <c:otherwise>

    </c:otherwise>
</c:choose>

<%--foreach标签--
  相当于 for(String x :list){
     x
  }
%>


<%--foreach--%>
<%--
items :共享在域对象中的key
varStatus 对象属性 用来标记序号的
     index属性 是索引 count 是序号
--%>
    
<c:forEach items="${list}" var="x" varStatus="vs">
    ${x}---${vs.count}-----${vs.index} <br/>
</c:forEach>

<%-- value 表示给谁格式化
      pattern 格式化的样式
 --%>
<fmt:formatDate value="${birthday}" pattern="yyyy-MM-dd"/>

</body>
</html>
@WebServlet("/jstl")
public class JSTLServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("age","18");
        req.setAttribute("list", Arrays.asList("a","b","c","d"));
        req.setAttribute("birthday",new Date());
        req.getRequestDispatcher("/WEB-INF/jstl.jsp").forward(req,resp);
    }
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值