动作标识应该在哪里使用?
在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>
运行结果: