写在前面
动作是第三种类型的语法元素, 它们被转换成Java代码来执行操作, 如访问一个Java对象或调用方法。 本节仅讨论所有JSP容器支持的标准动作。 除标准外, 还可以创建自定义标签执行某些操作。动作指令与编译指令不间,编译指令是通知 Servlet 引擎的处理消息,而动作指令只是运行时的脚本动作。编译指令在将JSP 编译成 Servlet 时起作用:处理指令通常可替换成 Java脚本,是 JSP脚本的标准化写法。
下面只是自己根据书上与一些网络资料整理得到的,更加详细的可以参考:JSP 动作元素|菜鸟教程。
JSP的七个动作指令
- jsp:forward: 执行页面转向,将请求的处理转发到下一个页面。
- jsp:param: 用于传递参数,必须与其他支持参数曲标签一起使用。
- jsp:include: 在页面被请求的时候引入一个文件。
- jsp:plugin: 用于下载 JavaBean 或 Applet 到客户端执行。
- jsp:useBean: 寻找或者实例化一个JavaBean。
- jsp:setProperty: 修改 JavaBean 实例的属性值。
- jsp:getProperty: 获取 JavaBean 实例的属性值
JSP动作指令的语法
动作元素只有一种语法,它符合XML标准:
<jsp:action_name attribute="value" />
注意最后面那个左斜杠。
jsp:useBean
useBean将创建一个关联Java对象的脚本变量。 这是早期分离的表示层和业务逻辑的手段。 随着其他技术的发展, 如自定义标签和表达语言, 现在很少使用useBean方式。
示例代码如下:
<html>
<head>
<title>useBean</title>
</head>
<body><jsp:useBean id="today" class="java.util.Date"/>
<%=today%>
</body>
</html>
在Tomcat中, 上述代码会被转换为如下代码:
java.util.Date today = null;
today = (java.util.Date) _jspx_page_context.getAttribute("today",javax.servlet.jsp.PageContext.REQUEST_SCOPE);
if (today == null) {
today = new java.util.Date();
_jspx_page_context.setAttribute("today", today, javax.servlet.jsp.PageContext.REQUEST_SCOPE);
}
jsp:setProperty 和 jsp:getProperty
setProperty动作可对一个Java对象设置属性, 而getProperty则会输出Java对象的一个属性。
下面将定义一个Empolyee类,代码如下:
package app03a;
public class Employee {
private String id;
private String firstName;
private String lastName;
public int getId(){
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
然后将在JSP中通过setProperty 与 getProperty设置和定义之前定义的Empolyee类的firstName属性。
<html>
<head>
<title>getProperty and setProperty</title>
</head>
<body>
<jsp:useBean id="employee" class="app03a.Employee"/>
<jsp:setProperty name="employee" property="firstName"value="Abigail"/>
First Name: <jsp:getProperty name="employee" property="firstName"/>
</body>
</html>
jsp:include
include动作用来动态地引入另一个资源。 包含页面程序与被包含页面程序是彼此独立,互不影响的。可以引入另一个JSP页面, 也可以引入一个Servlet或一个静态的HTML页面。
include指令使用样式如下:
<jsp:include page="相对 URL 地址" flush="true" />
如果定义了一个名为date.jsp的文件,要在另一个名为main.jsp中引入这个JSP文件,两个文件都在服务器的根目录下,那么就可以按照如下方式引用:
<jsp:include page="date.jsp" flush="true" />
理解include指令和include动作非常重要。 对于include指令, 资源引入发生在页面转换时, 即当JSP容器将页面转换为生成的Servlet时。 而对于include动作, 资源引入发生在请求页面时。 因此, 使用include动作是可以传递参数的, 而include指令不支持。
include动作指令用来动态地引入另一个资源。注意这里的“动态”一词的含义。
第二个不同是, include指令对引入的文件扩展名不做特殊要求。 但对于include动作, 若引入的文件需以JSP页面处理, 则其文件扩展名必须是JSP。 若使用.jspf为扩展名, 则该页面被当作静态文件。
jsp:forward
forward将当前页面转向到其他资源。jsp:forward标记只有一个属性page。语法格式如下所示:
<jsp:forward page="相对 URL 地址" />
例如在一个JSP中从当前页面转向到login.jsp页面:
<jsp:forward page="jspf/login.jsp">
<jsp:param name="text" value="Please login"/>
</jsp:forward>
写在最后
JSP的九大对象、七大指令、三大命令,我基本都过了一遍,但是还有很多地方不够完善,没有足够多的示例,没有足够多的实际场景应用的注意事项。