一、什么对象,可以在 JSTL 标签或 EL 表达式中使用?
在 jsp 页面中的 Java 代码块 <% %> 中定义的 java 对象,可以直接在
JSTL 标签或 EL 表达式 中使用吗?
不可以。访问不到。
JSTL 标签或 EL 表达式 只会调用这四个对象(page, request, session, application)的 getAtrribute(string) 方法,来获取表达式中的对象。这就是所谓的 scope —— 分别对应四个 jsp 的内置对象。
如果 page 对象中没有,则会到 request 对象寻找。依次向更大 scope 的对象中寻找。
所以在 Java 代码块 <% %> 中新建类对象,需要使用上述 scope 对象的 setAttribute() 方法,将新建的对象绑定到 scope 对象中。才能被
JSTL 标签或 EL 表达式 引用到。
例子:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page import="com.test.pojo.User" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<%
/***********************************************
Pay Attention:
===============================================
When using EL or JSTL, the following
User user = new User();
will not work.
==============================================
*/
pageContext.setAttribute("user", new User());
//request.setAttribute("user", new User());
%>
<h4>Using EL</h4>
<p>${user.name }</p>
<p>${user.getName() }</p>
<h4>Using JSTL</h4>
<p><c:out value="${user.name}" /></p>
<p><c:out value="${user.getName()}" /></p>
</body>
</html>
User.java
package com.test.pojo;
public class User {
private String name ="default";
public String getName(){
return "Welcome to JSTL!";
}
}
结果输出:
引用
Using EL
Welcome to JSTL!
Welcome to JSTL!
Using JSTL
Welcome to JSTL!
Welcome to JSTL!
引用
附: 在 JSTL/EL 表达式中的变量可以依附的 scope 对象
只有定义在 scope 对象中的变量,才可以被其它的地方( JSTL/EL)引用到。
page
变量被设置给 page 对象,则只能在本 jsp 内使用。使用 <jsp:useBean> 标签创建的变量默认都是 page scope 。另外这些对象也是 page scope: out, response, pageContext, config, page, exception。
request
变量被设置给 request 对象,可以在本次访问所涉及到的的任何 jsp 页面中使用。
通常多个 jsp 页面共同为一次访问提供结果。
session
变量被设置给 session 对象,可以在本次会话中的任意 jsp 页面中访问。
application
变量被设置给 applicaation 对象,可以在整个应用的任意 jsp 页面中访问。
二、 <c:set> 标签与 <jsp:useBean> 标签
我们一直在关心怎样设置变量,才可以让
JSTL 标签或 EL 表达式 使用到。
除了在 JSP 页面的 Java 代码块 <% %> 中使用四个scope对象的 setAttribute() 方法外(当然,这是最常用和好用的方法),还可以使用: <c:set> 与 <jsp:useBean> 。
使用这两个标签时,都可以指定变量设置在那个 scope 对象中。也就是这两个标签都有一个名为 scope 的属性。
1、<c:set>
主要有下面两种用法:
1、用于修改 JSP scope 中的对象的某个属性值(顾名思义,像是一个 JavaBean 的 set 方法)。
<c:set target="${user}" property="name" value="John"/>
等价于:
user.setName("John");
2、根据值,在 scope 中创建变量
1)不指定 scope,默认为 page
<c:set var="currency" value="USD"/> // 值,可以是现成的。但意义似乎不大。
<c:set var="sum" value="${1+3+6}"/> // 值,可以是现成的。但意义似乎不大。
2)在指定的 scope 中创建一个变量
<c:set var="currency" value="${user.currency}" scope="session" />
注: 使用 <c:remove var="currency"/> 移除所有 scope 中名为 currency 的变量
2、<jsp:useBean>
如果变量已经存在 scope 中,可以使用 <c:set> 据此在 scope 中创建一些新的变量。
但是,如果变量根本就不存在呢?
<jsp:useBean>:用于设置或初始化一个 JavaBean 类。如果 bean 已经在指定的 scope 中存在,则不会去创建,否则会新建一个 JavaBean,然后将其设置到 scope 中。
例子:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page import="com.test.pojo.User" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<jsp:useBean id="user" class="com.test.pojo.User"/>
<h4>Using EL</h4>
<p>${user.name }</p>
<p>${user.getName() }</p>
<%
user = (User) pageContext.getAttribute("user");
user.setName("Hello, JSTL!");
%>
<h4>Using JSTL</h4>
<p><c:out value="${user.name}" /></p>
<p><c:out value="${user.getName()}" /></p>
</body>
</html>
User class
package com.test.pojo;
public class User {
private String name = "Welcome, JSTL!";
public String getName(){
return name;
}
public void setName(String name){
this.name = name == null ? "null" : name ;
}
}
结果输出:
引用
Using EL
Welcome, JSTL!
Welcome, JSTL!
Using JSTL
Hello, JSTL!
Hello, JSTL!
引用:
Scope of JSP Objects
- http://javapapers.com/jsp/explain-the-scope-of-jsp-objects/
JSTL Core: <c:set> Tag
- http://www.tutorialspoint.com/jsp/jstl_core_set_tag.htm
c:set Examples
- http://javarevisited.blogspot.com/2012/02/jstl-tag-examples-in-jsp-java-j2ee.html
jsp:useBean Action Tag
- http://www.javatpoint.com/jsp-useBean-action
-
转载请注明
原文出处:http://lixh1986.iteye.com/blog/2324611
-