动作标识应该在哪里使用?
在JSP的请求处理阶段按在页面出现的
顺序
来执行动作标识的时候。
JSP动作元素是用
XML语法
写成的,所以必须符合XML标准。它的作用是可以动态地插入文件、重用JavaBean组件、将用户重定向到另外的页面、为Java插件生成相应的HTML代码等。也用于一些特殊用处,譬如,
操作JavaBean
、包含其他文件或执行请求转发等。开发中比较
常用
的动作标识来介绍:
#怎么用呢?
使用格式:
<jsp:action_name attribute="value" />
如下的
标准动作标识
,这些基本上就是预定义的
函数
,只是前面多了JSP作为前缀;
语法 | 描述 |
---|---|
jsp:include | 在页面被请求的时候引入一个文件。 |
jsp:useBean | 寻找或者实例化一个JavaBean。 |
jsp:setProperty | 设置JavaBean的属性。 |
jsp:getProperty | 输出某个JavaBean的属性。 |
jsp:forward | 把请求转到一个新的页面。 |
jsp:plugin | 根据浏览器类型为Java插件生成OBJECT或EMBED标记。 |
jsp:element | 定义动态XML元素 |
jsp:attribute | 设置动态定义的XML元素属性。 |
jsp:body | 设置动态定义的XML元素内容。 |
jsp:text | 在JSP页面和文档中使用写入文本的模板 |
jsp:include
作用是用来
包含其它JSP页面
的。你可能会说include指令,它们是否相同呢?了下节会解释它们两者有什么区别,并且它所包含的文件可以是
动态文件,也可以是静态的文件
;
include指令是在编译级别完成的包含,
把当前JSP和被包含的JSP
合并成一个JSP,然后再编译成一个Servlet。
该标签是在运行时完成的包含,即当前JSP和被包含的JSP都会
各自生成
Servlet,然后在执行当前JSP的Servlet时完成
包含另一个
JSP的Servlet。它与RequestDispatcher的
include()方法
是相同的!
参数说明:
用法如下:
<jsp:include page=”url” flush=”flase|true” />
\\ 或者
<jsp:include page="url" flush="false|true" >
子动作标识<jsp:param>
</jsp:include>
参数说明:
-
page:用于指定被包含文件的
相对路径
。如:指定属性值为top.jsp,则表示包含的是与当前JSP文件相同文件夹中的
top.jsp文件
包含在
当前JSP页面
中。 -
flush:可选属性,用于设置
是否刷新缓冲区
。默认值是false,如果设置为true,在当前页面输出
使用了缓冲区
的情况时,则先刷新缓冲区,然后再执行包含工作。 -
< jsp:param >子动作标识:
用于向被包含的动态页面中
传递参数
。
那我们:
下面程序所示:
date.jsp文件:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <p> 今天的日期是: <%= (new java.util.Date()).toLocaleString()%> </p>
main.jsp文件:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>码工是小希(https://github.com/Datalong)</title> </head>
include 动作实例
“` 现将上面两个文件放在服务器的**根目录**,访问main.jsp文件。显示为:
>include 动作实例
今天的日期是: 2021-5-13 13:08:17
小结:
jsp:include动作标识是对包含的动态文件和静态文件的处理方式是
有所不同
的。
如果被包含的是静态文件,则页面执行后,在使用该标识的位置会输出这个文件的内容。如果包含的是一个动态文件,那么JSP编译器将编译并
执行
这个文件。jsp:include动作标识会识别出
文件类型
,而并不是通过文件的名称来判断改文件是静态的还是动态的:
include指令
文件包含指令是JSP的另外一种
指令标识
,写的目的就是和
include动作标识
做一下区分。通过该指令可以在一个JSP页面中去包含
另一个JSP页面
。不过该指令是静态包含,也就是说被包含文件里的所有内容被
原样
包含到该JSP页面中,即使被包含页面中有JSP代码,在包含时也是不会被编译执行的,使用include这个指令,最终会生成一个文件,所以在被包含和包含的文件中,都不能有
相同名称的变量
,所以去包含另外一个页面
只能静态包含
。
在JSP页面中包含文件的方法有两种:
include指令
:<%@ include file=””%>
include动作
:<jsp:include page=”” />
区分:
<%@ include file=””%>又叫静态包含,使用时要注意以下几点:
1、被包含文件里不能再使用这种标签,否则会与包含页面中的
标签重复
;
2、被包含文件的路径不能写成
动态
的,譬如:<%@ include file=”<%=xxx%>”%>;
3、被包含文件的路径中
不能携带参数
,如:<%@ include file=”navi.jsp?flag=1″%>。
处理方式不同:
- include指令在编译时候,就把jsp的代码原封不动就拼到这个页面来了。运行时把jsp的代码,当作本页代码来运行。
-
<jsp:include page=”” />又叫
动态包含
运行访问这个页面,把jsp页面的结果拿出来。也就是说,直接
新写
一个完整的jsp或html即可,就像html以前已经过时的框架那种写法;
请求转发标识jsp:forward
通过它可以将请求转发到其他的Web资源,例如,另一个
JSP页面,HTML页面,Servlet
等。执行请求转发后,当前页面就不再被执行,而是去执行该标识
指定的目标页面
。
**
-
用法:
<jsp:forward page=”url” />
参数:
page:用于指定
请求转发
的目标页面。该属性值可以是一个
指定文件路径的字符串
,也可以是表示文件路径的JSP表达式。但是请求
被转向的目标文件
必须是内部的资源。
传递参数标识jsp:param
JSP的动作标识jsp:param可以作为其他标识的子标识,用于为
其他标识传递参数
: 用法:
<jsp:param name=”参数名” value=”7” />
参数
name:用于指定
参数名称
value:用于设置
对应的参数值
<jsp:forward >
请求转发标识,通过jsp:forward动作标识可以将请求转发到
其他的Web资源
,例如,另一个JSP页面,HTML页面,Servlet等。执行
请求转发
后,当前页面将不再被执行,而是去执行该标识
指定
的目标页面。
基本语法:
<jsp:forward page="url"/>
参数说明:
page:用于指定请求转发的目标页面。该属性值可以是一个
指定文件路径的字符串
,也可以是表示
文件路径的JSP表达式
。但是请求
被转向
的目标文件必须是内部的资源。
< jsp:param> 设置参数的子动作标识,子动作标识是指作为
其他标识
的子标识。用来向动态的目标文件中
传递参数
。等价于文件名后面加“?参数名=参数值”。
基本语法:
< jsp:param name="参数名” value="参数值"/>
参数说明:
name:用于指定
参数名称
value:用于设置
对应的参数值
操作JavaBean的动作标识
1、创建JavaBean实例的动作表识 < jsp:useBean >
不存在Body的语法格式:
<jsp:useBean id="实例名" scope="范围" class="完整的类名" beanName="完整类名" type="数据类型"/>
<jsp:setProperty name="JavaBean实例名" property="属性名" param="请求参数"/>
···多个子动作标识····
存在Body的语法格式:
<jsp:useBean id=”实例名“ scope="范围" class="完整类名" beanName="完整类名" type="数据类型" >
<jsp:setProperty name="JavaBean实例名" property="属性名" param="请求参数"/>
···多个子动作标识····
</jsp:useBean>
语法区别:
在页面用< jsp:useBean >标识创建个
JavaBean实例
时,如果该JavaBean是第一次被
实例化
,那么对于第二种语法格式,被指的内容会被
执行
;若已经存在指定的JavaBean实例时,则标识体内的内容就
不再被执行
。而对于第一种语法格式,无论在指定的范围内是否已经存在一个
指定的JavaBean实例
,其中< jsp:useBean >
标识
后面的< jsp:setProperty >
子标识
都会被执行!
2、读取JavaBean属性值的动作标识<jsp:getProperty >
<jsp: name="实例名" property="属性名">
3、设置JavaBean属性的动作标识 < jsp:setProperty >
<jsp:setProperty name="" property="" vaule=""/param="">
class = beanName +type
//value 与 param 不可同时使用;
实战练习
实现留言板
<%@ page contentType="text/html;charset=gb2312" %>
<HTML><body bgcolor=cyan>
<form action="example3_18_pane.jsp" method="post" name="form">
输入名字:<input type="text" name="peopleName">
<br>留言标题:<input type="text" name="title">
<br>留言:<br> <textArea name="messages" rows="10" cols=36
wrap="physical"></textArea>
<br><input type="submit" value="提交" name="submit">
</form>
<a href="example3_18_show.jsp">查看留言板</a>
</body></HTML>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*" %>
<HTML><body>
<%! Vector v=new Vector();
int i=0;
ServletContext application;
synchronized void leaveWord(String s) { //留言方法
application=getServletContext();;
i++;
v.add("No."+i+","+s);
application.setAttribute("Mess",v);
}
%>
<% String name=request.getParameter("peopleName");
String title=request.getParameter("title");
String messages=request.getParameter("messages");
if(name==null)
name="guest"+(int)(Math.random()*10000);
if(title==null)
title="无标题";
if(messages==null)
messages="无信息";
String s=name+"#"+title+"#"+messages;
leaveWord(s);
out.print("您的信息已经提交!");
%>
<a href="example3_18_input.jsp" >返回留言页面
</body></HTML>
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.util.*" %>
<%! public String handleStr(String s) {
try { byte [] bb= s.getBytes("iso-8859-1");
s = new String(bb);
}
catch(Exception exp){}
return s;
}
%>
<HTML><body>
<% Vector v=(Vector)application.getAttribute("Mess");
for(int i=0;i<v.size();i++) {
String message=(String)v.elementAt(i);
String []a =message.split("#");
out.print("留言人:"+handleStr(a[0])+","+"<br>");
out.print("标题:"+handleStr(a[1])+"<br>");
out.print("留言内容:<br>"+handleStr(a[2]));
out.print("<br>--------------<br>");
}
%>
</body></HTML>
运行结果: