在JSP中大量使用Java代码块,表达式块,会使JSP代码页面看起来杂乱无事,所以一般情况下,尽量少的使用Java代码块和表达式块,尽量多的使用EL表达式、JSTL标签、JSP动作
一、定义JSP动作
使用系统定义好的标签代替Java代码
二、语法格式
<jsp: 动作名称 属性名=属性值....></jsp: 动作名称>
或
<jsp: 动作名称 属性名=属性值../>
三、JSP常用的动作(forward、include)
- forward:转发动作
- include:包含动作
1、forward和include异同
- 这两个动作的完成,底层使用的是RequestDispatcher的forward()和include()方法实现的
这两种请求转发的本质区别是:标准输出流的开启时间不同
- forward():标准输出流是在目标资源中开启的标准输出流
- include():标准输出流是在当前发出包含动作的页面中开启
所以forward()动作的发起页面中是无法向标准输出流中写入数据的
- 所以include()动作的发起页面及目标页面中均可向标准输出流中写入数据
- 这两种动作都具有page属性,用于指定要转向的页面
include工作原理
forward工作原理
2、forward与include关于标准输出流打开时间例子
include动作
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>include动作test</title>
</head>
<body>
这是index.jsp页面<br>
<jsp:include page="other.jsp"></jsp:include>
test
</body>
</html>
other.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>include动作test</title>
</head>
<body>
这是other.jsp
</body>
</html>
客户浏览器显示结果
说明标准输出流是在当前发出包含动作的页面中开启
forward动作
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>forward动作test</title>
</head>
<body>
这是index.jsp页面<br>
<jsp:forward page="other.jsp"></jsp:forward>
test
</body>
</html>
other.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>forward动作test</title>
</head>
<body>
这是other.jsp
</body>
</html>
客户浏览器显示结果
说明标准输出流是在目标资源中开启的标准输出流
二、动态联编
打开Tomcat的work目录的相关子目录,可以看到有两个.java文件,index_jsp.java与other_jsp.java,也就是说include动作的包含是在运行期完成的。而非在编译期。这个include动作实在程序运行过程中有index_jsp.java文件中的_jspservice()方法通过JspRuntimeLibrary类的include()方法调用了other_jsp文件中的_jspservice()方法。在运行期所执行的这种包含,称为动态联编
静态联编与动态联编的应用场景
在静态联编和动态联编均可使用时,一般使用静态联编因为在程序运行时只存在一个Servlet,对资源的消耗较少,且不存在调用问题,执行效率较高。
- 若在两个文件间需要共享同一个变量——————只能使用静态联编
- 若在两个文件间存在同名变量,且不能混淆——————只能使用动态联编(意思是两个页面的同名变量互不影响,在哪页输出就是用哪页的变量)
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>include动作test</title>
</head>
<body>
<jsp:include page="/other.jsp"></jsp:include>
<%
String name="index页面的name";
%>
<%
out.println(name);
%>
</body>
</html>
other.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>include动作test</title>
</head>
<body>
<%
String name="other页面的name";
%>
</body>
</html>
浏览器显示结果
代表两个页面的name变量互不干扰