动作 Action
动作Action被编译成某个操作的Java代码。
例如访问某个Java对象,或者调用某个方法。action会影响输出的结果,同时也会使用,创建或者修改对象。
action依赖与JSP Page所接收到的request对象的具体细节。
标准动作 Standard Action
JSP规范包含了一些标准的action,这些action必须被JSP容器所实现。
例如我们在前面使用过的标准action:<jsp:include>,<jsp:forward>。
<jsp:useBean>
这个动作将创建一个与某个Java对象相关的脚本变量。它是将表现逻辑与业务逻辑分隔开来的最容易的方法之一。但是有了向定制标签和Expression Language这类技术之后,现在已经很少使用useBena了。
jsp:useBean动作在给定的scope范围内,与一个java对象相关联,并可通过一个id值在JSP脚本中来引用这个对象。
jsp:useBean 属性:
- id —— 用来标识在指定的scope范围内的对象实例;大小写敏感;同时必须遵循当前使用语言(java)的命名规则
- scope —— 当前引用的对象的使用scope;默认值为page,可选值为page,request,session,application。该bean实例将会属性写入到PageContext对象中,参数为对应的scope(参见PageContext一节)。
- class —— 该引用对象的类型的全名;大小写敏感
- beanName ——
- type ——
jsp:useBean的语法为:
<jsp:useBean id="name" scope="page|request|session|application" typeSpec />
typeSpec ::= class=”className” |
class=”className” type=”typeName” |
type=”typeName” class=”className” |
beanName=”beanName” type=”typeName” |
type=”typeName” beanName=”beanName” |
type=”typeName”
jsp:useBean可以包含一个body:
<jsp:useBean id="name" scope="page|request|session|application" typeSpec >
body
</jsp:useBean>
body内的内容当action所指定的对象被创建的时候会被调用;通常,body会包含一个java程序片段或者<jsp:setProperty>标签等,用来修改新建的对象。
使用示例:
在standardactions.jsp中使用jsp:userBean,
<%@ 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>Insert title here</title>
</head>
<body>
<%-- jsp:useBean--%>
<jsp:useBean id="today" class="java.util.Date"></jsp:useBean>
<%= today %>
<br/>
</body>
</html>
在浏览器中访问url:
http://localhost:8080/base-webapp/jsp/standardactions.jsp
页面显式如下:
在生成的java类中,jsp:useBean对应的java代码为:
java.util.Date today = null;
synchronized (_jspx_page_context) {
today = (java.util.Date) _jspx_page_context.getAttribute("today", PageContext.PAGE_SCOPE);
if (today == null){
today = new java.util.Date();
_jspx_page_context.setAttribute("today", today, PageContext.PAGE_SCOPE);
}
}
<jsp:setProperty>
setProperty动作是在一个Java对象中保存一个属性。setProperty中属性name所指定对象必须在这个action使用之前被定义。
jsp:setProperty属性为:
- name —— 在<jsp:useBean>中或其他action中定义的bean的实例的名称。这个bean必须包含要设置的属性;定义bean的action必须出现在<jsp:setProperty>之前(在同一个文件中)
- property —— 需要设置值的属性的名称;
- param —— 将request中对应参数的值赋值给指定的属性值;request来自页面的请求;
- value —— 赋给属性的值
- 这个action不能同时设置param和value属性,只能保留一个
jsp:setProperty的语法为:
<jsp:setProperty name="beanName" prop_expr />
prop_expr ::=
property="*" |
property=”propertyName”|
property=”propertyName” param="parameterName"|
property=”propertyName” value=”propertyValue”
propertyValue ::= string
使用示例:
创建一个JavaBean:
package com.gof.test.bean;
public class TestBean {
private String id;
private String firstName;
private String lastName;
public String 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文件为:
<%@ 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>Insert title here</title>
</head>
<body>
<%-- jsp:useBean--%>
jsp:useBean<br/>
<jsp:useBean id="today" class="java.util.Date"></jsp:useBean>
<%= today %>
<br/>
<%-- jsp:setProperty --%>
jsp:setProperty<br/>
<jsp:useBean id="testBean" class="com.gof.test.bean.TestBean" />
<jsp:setProperty property="id" name="testBean" value="1" />
<jsp:setProperty property="firstName" name="testBean" value="my first name" />
<jsp:setProperty property="lastName" name="testBean" value="my last name" />
id is <%= testBean.getId() %> <br/>
firstName is <%= testBean.getFirstName() %><br/>
lastName is <%= testBean.getLastName() %> <br/>
<br/>
</body>
</html>
访问该JSP,浏览器显示为:
<jsp:getProperty>
getProperty则是获取一个Java对象的属性。
jsp:getProperty动作获取bean实例的属性并转换为一个String对象,将其隐式的输入到out对象中。
<jsp:getProperty>的语法:
<jsp:getProperty name=”name” property=”propertyName” />
<jsp:getProperty>的属性为:
- name —— 获取属性的对象实例的名称
- property —— 获取的属性
使用示例:
修改上面的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>Insert title here</title>
</head>
<body>
<%-- jsp:useBean--%>
jsp:useBean<br/>
<jsp:useBean id="today" class="java.util.Date"></jsp:useBean>
<%= today %>
<br/>
<%-- jsp:setProperty --%>
jsp:setProperty<br/>
<jsp:useBean id="testBean" class="com.gof.test.bean.TestBean" />
<jsp:setProperty property="id" name="testBean" value="1" />
<jsp:setProperty property="firstName" name="testBean" value="my first name" />
<jsp:setProperty property="lastName" name="testBean" value="my last name" />
id is <%= testBean.getId() %> <br/>
firstName is <%= testBean.getFirstName() %><br/>
lastName is <%= testBean.getLastName() %> <br/>
getProperty - id is <jsp:getProperty property="id" name="testBean"/><br/>
getProperty - firstName is <jsp:getProperty property="firstName" name="testBean"/><br/>
getProperty - lastName is <jsp:getProperty property="lastName" name="testBean"/> <br/>
<br/>
</body>
</html>
访问jsp,浏览器显示为:
<jsp:include>
include动作用于的哦你太包含另一个Web组件;具体参见 包含 一节。
当使用include动作时,应为包含是发生在发生请求时,因此,可以利用include动作传递参数,include指令不能。
当使用include指令时,被包含资源的文件扩展名并不重要;而使用include动作时,文件扩展名必须为jsp,以便它能够作为一个JSP页面进行处理。
<jsp:include>的语法为:
<jsp:include page=”urlSpec” flush="true|false">
{ <jsp:param .... /> }*
</jsp:include>
<jsp:include>的属性为:
- page —— URL字符串
- flush —— 可选的属性,是否立即输出buffer中的内容;默认为false
<jsp:forward>
forward动作是将当前页面跳转到另一个不同的页面,具体参见 转发 一节。
forward动作同样可以包含param参数。
<jsp:forward>的语法为:
<jsp:forward page=”urlSpec”>
{ <jsp:param .... /> }*
</jsp:forward>
<jsp:forward>的属性为:
- page —— URL字符串
<jsp:param>
jsp:element元素用来提供key/value的信息。这个动作用于jsp:include,jsp:forward,jsp:params元素内部。
<jsp:param>的语法为:
<jsp:param name="name" value="value" />
<jsp:plugin>
<jsp:params>
<jsp:fallback>
<jsp:attribute>
<jsp:body>
<jsp:invoke>
<jsp:doBody>
<jsp:element>
<jsp:text>
<jsp:output>
其他标准actions
动作的异常处理
对于使用动作action所产生的异常,可以使用JSP 的 errorPage,isErrorPage进行异常的捕获。