JSP动作(include、forward)、动态联编与静态联编应用场景

在JSP中大量使用Java代码块,表达式块,会使JSP代码页面看起来杂乱无事,所以一般情况下,尽量少的使用Java代码块和表达式块,尽量多的使用EL表达式、JSTL标签、JSP动作

一、定义JSP动作

使用系统定义好的标签代替Java代码


二、语法格式




三、JSP常用的动作(forward、include)

  • forward:转发动作
  • include:包含动作

1、forward和include异同

  • 这两个动作的完成,底层使用的是RequestDispatcher的forward()和include()方法实现的
  • 这两种请求转发的本质区别是:标准输出流的开启时间不同

    • forward():标准输出流是在目标资源中开启的标准输出流
    • include():标准输出流是在当前发出包含动作的页面中开启
  • 所以forward()动作的发起页面中是无法向标准输出流中写入数据的

  • 所以include()动作的发起页面及目标页面中均可向标准输出流中写入数据
  • 这两种动作都具有page属性,用于指定要转向的页面
include工作原理

JSP动作(include、forward)、动态联编与静态联编应用场景_第1张图片

forward工作原理

JSP动作(include、forward)、动态联编与静态联编应用场景_第2张图片

2、forward与include关于标准输出流打开时间例子

include动作

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




include动作test


    这是index.jsp页面
test

other.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




include动作test


    这是other.jsp


客户浏览器显示结果

JSP动作(include、forward)、动态联编与静态联编应用场景_第3张图片

说明标准输出流是在当前发出包含动作的页面中开启


forward动作

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




forward动作test


    这是index.jsp页面
test

other.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




forward动作test


    这是other.jsp


客户浏览器显示结果

JSP动作(include、forward)、动态联编与静态联编应用场景_第4张图片

说明标准输出流是在目标资源中开启的标准输出流


二、动态联编

打开Tomcat的work目录的相关子目录,可以看到有两个.java文件,index_jsp.java与other_jsp.java,也就是说include动作的包含是在运行期完成的。而非在编译期。这个include动作实在程序运行过程中有index_jsp.java文件中的_jspservice()方法通过JspRuntimeLibrary类的include()方法调用了other_jsp文件中的_jspservice()方法。在运行期所执行的这种包含,称为动态联编

JSP动作(include、forward)、动态联编与静态联编应用场景_第5张图片

静态联编与动态联编的应用场景

在静态联编和动态联编均可使用时,一般使用静态联编因为在程序运行时只存在一个Servlet,对资源的消耗较少,且不存在调用问题,执行效率较高。

  • 若在两个文件间需要共享同一个变量——————只能使用静态联编
  • 若在两个文件间存在同名变量,且不能混淆——————只能使用动态联编(意思是两个页面的同名变量互不影响,在哪页输出就是用哪页的变量)

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




include动作test


    
    <% 
        String name="index页面的name";
    %>

    <%
        out.println(name);
    %>


other.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




include动作test


    <%
        String name="other页面的name";
    %>


浏览器显示结果

JSP动作(include、forward)、动态联编与静态联编应用场景_第6张图片

代表两个页面的name变量互不干扰

你可能感兴趣的:(●,Java基础)