JSP动作

JSP动作

JSP中有七大动作,下面着重学习forward转发动作和include包含动作,了解bean动作

forward转发动作

等同于Java代码

request.getRequestDispatcher("index2.jsp").forward(request,response);

<%--index.jsp--%>
<%
    // 向request范围中存数据
    request.setAttribute("username","admin");
%>
<%--forward转发动作,将请求转发到index2.jsp--%>



<%--index2.jsp--%>
<%--从request范围中取数据--%>
<%=request.getAttribute("username")%>

include包含动作

include包含是动态包含,动态联编

使用include包含动作可以将其他jsp等资源包含展示在一个jsp

了解include动作

  1. a.jsp包含b.jsp,底层分别生成两个Java源文件,两个class字节码文件
  2. 编译阶段并没有包含,编译阶段是两个独立的class字节码文件,生成两个Servlet
  3. 使用include动作属于运行阶段包含,实际上是在运行阶段a中的service()方法调用了b中的service()方法,达到了包含效果
  4. a.jsp包含b.jsp,若两个jsp文件中有重名变量,只能使用动态包含,因为两个Java源文件是相互独立的,其余都可以使用静态包含
  5. include动作完成动态包含,被成为动态联编

包含原理

如下代码,index.jsp文件中使用include动作包含了index2.jsp文件

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

    
    	
    

index.jsp和index2.jsp两个文件翻译为Java源文件是各自独立的index.java和index2.java;

在index.java的service()方法中有这么一行代码,说明是index的service()方法在包含的位置调用了index2,执行了index2的service()方法;

所以两个jsp翻译后的Java文件是相互独立的,所以变量是不能通用的;

public void service(HttpServletRequest request, HttpServletResponse response) {
     
		//.......
      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "index2.jsp", out, false);
		//......

include指令与include动作区别

include指令<%@include file="index2.jsp"%>
include动作

  1. 无论是include指令还是include动作,都可以将其他页面包含进来
  2. include指令是静态联编,如果a.jsp包含b.jsp,那么在翻译期就会将b翻译进来,最后翻译形成一个Java源文件,所以a.jsp和b.jsp中的变量等是可以共用的
  3. include动作是动态联编,如果a.jsp包含b.jsp,那么在翻译期,会生成两个相互独立的Java源文件, 只是在执行a的service()方法的时候,在包含b的位置调用了b而已,所以两个jsp中的变量是不通用的

所以如果两个JSP中有同名的变量,需要使用include动作(动态联编);如果需要共享变量,可以使用include指令(静态联编);多数情况下都是使用include指令(静态联编)

bean

通过动作的方式,创建对象,以及往对象中设置值和取值

共有三个动作:useBean、setProperty、getProperty

  				<%--创建对象--%>
 	<%--调用set方法--%>
  		<%--调用get方法--%>

你可能感兴趣的:(#,JSP,java,jsp,servlet,javaee)