- 浏览: 1112639 次
文章分类
- 全部博客 (379)
- S2SH (16)
- stuts2 (0)
- java语言 (81)
- JSP (17)
- <html>元素 (11)
- javaweb (4)
- web容器 (3)
- ext (23)
- javaScript (48)
- ant (1)
- liferay (1)
- sql (9)
- css (42)
- 浏览器设置 (3)
- office_world (1)
- eclipse (4)
- 其它 (28)
- 操作系统 (5)
- android (6)
- Struts2 (11)
- RegEx (3)
- mysql (5)
- BigDATA (1)
- Node.js (1)
- Algorithm (10)
- Apache Spark (1)
- 数据库 (5)
- linux (2)
- git (1)
- Adobe (3)
- java语言,WebSocket (1)
- Maven (3)
- SHELL (1)
- XML (2)
- 数学 (2)
- Python (2)
- Java_mysql (1)
- ReactJS (6)
- 养生 (4)
- Docker (1)
- Protocols (3)
- java8 (2)
- 书籍 (1)
- Gradle (2)
- AngularJS (5)
- SpringMVC (2)
- SOAP (1)
- BootstrapCSS (1)
- HTTP协议 (1)
- OAuth2 (1)
最新评论
-
Lixh1986:
Java并发编程:自己动手写一把可重入锁https://blo ...
Java之多线程之Lock与Condition -
Lixh1986:
http://win.51apps.com.cn/https: ...
temp -
ztwsl:
不错,支持很好
HttpServletRequest和ServletRequest的区别 -
guodongkai:
谢谢您能将知识精华汇编总结,让初学者们从原理中学会和提高。
javaScript之function定义 -
kangwen23:
谢谢了,顶顶
struts2中的ValueStack学习
准备工作:在JSP 中启用 EL 表达式
一、什么是 JSTL/EL
JSTL : jsp 标准标签库(Jsp Standard Tag Library)
EL: 表达式语言 (Expression Language)
JSTL/EL 提供了一些通用的核心功能,如:设置变量的 scope,判断,迭代等。
使JSP开发者提高了开发效率。
二、 JSTL 与 EL 的区别和联系
EL 表达式最初只用于 JSTL 标签(或其它自定义标签)的属性中。
在后来的 JSP 定义版本中,允许 EL 单独在 JSP 中使用,用于简单属性的输出。
例如: ${user.id} 可以把 user 对象的 id 属性写入到 jsp 中。但这并不表明 JSTL 就没有用处了,JSTL 可以提供:条件判断,循环输出,html 标签过滤,URLs,日期格、数字式化等功能。
三、什么对象可以在 EL 表达式中使用?
问题:
在 jsp 页面中的 Java 代码块 <% %> 中定义的 java 对象,可以直接在 EL 表达式 中使用吗?
回答:
不可以。访问不到。
EL 表达式 只会调用这四个对象(page, request, session, application)的 getAtrribute(string) 方法,来获取表达式中的对象。
这就是所谓的 EL 内置 scope 对象 —— 它们分别对应四个 jsp 的内置对象。
如果 page 对象中没有,则会到 request 对象寻找。依次向更大 scope 的对象中寻找。
所以在 Java 代码块 <% %> 中新建类对象,需要使用上述 scope 对象的 setAttribute() 方法,将新建的对象绑定到 scope 对象中。才能被 EL 表达式 引用到。
例子:
User.java
结果输出:
Using EL
Welcome to JSTL!
Welcome to JSTL!
Using JSTL
Welcome to JSTL!
Welcome to JSTL!
Using JSP Expression
Hello World!
生成的 JSP 源码:
附: 在 EL 表达式中的变量可以依附的 scope 对象
只有定义在 scope 对象中的变量,才可以被其它的地方( EL)引用到。
page
变量被设置给 page 对象,则只能在本 jsp 内使用,不能在使用 <jsp:include> 调用该 jsp 的上级 jsp 中起作用。
- 使用 <jsp:useBean> 标签创建的变量默认都是 page scope 。
- 另外这些对象也都属于 page scope: out, response, pageContext, config, page, exception。
request
变量被设置给 request 对象,可以在本次访问所涉及到的的任何 jsp 页面中使用。
通常多个 jsp 页面共同为一次访问提供结果。
session
变量被设置给 session 对象,可以在本次会话中的任意 jsp 页面中访问。
application
变量被设置给 applicaation 对象,可以在整个应用的任意 jsp 页面中访问。
注:这种内置对象或上下文的用法在类库或模板设计方法中经常使用。比如, JSP有内置对象,JSTL也有内置对象(语法使用时的上下文环境),Struts 2 的标签也有内置对象及上下文环境(ValueStack)
四、 <c:set> 标签
我们一直在关心在 scope 范围内怎样灵活设置变量。
除了在 JSP 页面的 Java 代码块 <% %> 中使用四个scope对象的 setAttribute() 方法外(当然,这是最常用和好用的方法),还可以使用: <c:set> 与 <jsp:useBean> 。
使用这两个标签时,都可以指定变量设置在那个 scope 对象中。也就是这两个标签都有一个名为 scope 的属性。
c:set 标签可以设置3种类型的变量到 scope 中(默认为 page Scope):
1、设置 纯文本字符 到 scope 中:
2、设置 本地变量 到 scope 中:
3、设置 scope变量 到 scope 中:
用法示例:
输出:
<c:set> 的第二种用法:用于修改 JSP scope 中的对象的某个属性值
<c:set> 用法示例:
1、未指定 scope 时,使用 pageContext 对象对 c:set 对变量进行获取。
2、设置代码中的变量到 scope 中,从而在其它 c 标签中使用
3、在指定的 scope 中创建一个变量
注:
1、使用 <c:remove var="currency"/> 移除所有 scope 中名为 currency 的变量
2、注意在一个jsp中引用其他jsp时(<jsp:include>),使用<c:set />时变量的范围。
一般为当前jsp内起作用,也就是不指定scope时在当前页面中设置的变量,
在子页面中时访问不到的(scope 默认为 page)。
The <c:set> tag sets the value of an EL variable or the property of an EL variable in any of the JSP scopes (page, request, session, or application). If the variable does not already exist, it is created.
The JSP EL variable or property can be set either from the attribute value:
<c:set var="foo" scope="session" value="..."/>
or from the body of the tag:
<c:set var="foo">
...
</c:set>
http://docs.oracle.com/javaee/5/tutorial/doc/bnakh.html
五、 <jsp:useBean>标签
如果变量已经存在 scope 中,可以使用 <c:set> 据此在 scope 中创建一些新的变量。
但是,如果变量根本就不存在呢?
<jsp:useBean>:用于设置或初始化一个 JavaBean 类。如果 bean 已经在指定的 scope 中存在,则不会去创建,否则会新建一个 JavaBean,然后将其设置到 scope 中。
例子:
User class
结果输出:
Using EL
Welcome, JSTL!
Welcome, JSTL!
Using JSTL
Hello, JSTL!
Hello, JSTL!
c:set 与 jsp:useBean 的区别
*Difference betweenn c:set and jsp:useBean*
See the basic difference between c:set and jsp:useBean is:
First
c:set is a JSTL tag
while jsp:useBean is a JSP action.
Second thing,
you can use jsp:useBean either to retrieve a bean or create a bean object.
While c:set is used to set the property of an already existing bean not to create a bean or get a bean. c:set works somewhat similar to jsp:setProperty action for java beans.
And third thing,
there is no scope attribute for c:set(when you are using it with target attribute) JSTL tag as it is there for jsp:useBean JSP action.
And if you provide the value of target attribute as an EL expression, searching is from most restrictive scope to least restrictive scope.
六、EL 表达式 与 JSTL 标签的不同之处
问题1:JSTL 与 EL(Expression Language)的区别和联系?
阅读完“怎样避免在jsp中写逻辑代码”后,我停止了在jsp中写java代码片段的行为。因此我开始阅读和学习 JSTL,结果发现 JSTL 和 EL 之间有联系。但是我并不清楚这种联系。
下面是代码:
我只知道 <c:set 是 JSTL 标签,而 ${test} 是 EL (表达式语言)。
我的困惑是:
1. JSTL 可以单独使用吗?是否必须配合 EL ?如果不是必须,如何解释上面代码?
2. 如何最简单的只使用 EL 表达式?
-----------------------------
Answer:
EL 表达式最初只用于 JSTL 标签(或其它自定义标签)的属性中。
在后来的 JSP 定义版本中,允许 EL 单独在 JSP 中使用,用于简单属性的输出。例如:
${user.id}
可以把 user 对象的 id 属性写入到 jsp 中。但这并不表明 JSTL 就没有用处了,JSTL 可以提供:条件判断,循环输出,html 标签过滤,URLs,日期格、数字式化等功能。
问题2:Are session and sessionScope the same in JSP EL?
I put "counter" in application "user" in session and "tip" in ActionContext. In JSP I can use ${session.user} and ${sessionScope.user} to reference the "user" property. ${request.tip} and ${requestScope.tip} to reference tip.
My questions:
Are session, request, application the same as sessionScope, requestScope, applicationScope in EL?
What's the relationship between ActionContext and request(requestScope)?
P.S.:
I test ${request == requestScope} which is true, this means they are the same?
回答:
引用:
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
Exact difference and relation between JSTL and expression-language
- http://stackoverflow.com/questions/15848251/
-
转载请注明
原文出处:http://lixh1986.iteye.com/blog/2324611
-
<%@ page isELIgnored="false"%>
一、什么是 JSTL/EL
JSTL : jsp 标准标签库(Jsp Standard Tag Library)
EL: 表达式语言 (Expression Language)
JSTL/EL 提供了一些通用的核心功能,如:设置变量的 scope,判断,迭代等。
使JSP开发者提高了开发效率。
二、 JSTL 与 EL 的区别和联系
EL 表达式最初只用于 JSTL 标签(或其它自定义标签)的属性中。
在后来的 JSP 定义版本中,允许 EL 单独在 JSP 中使用,用于简单属性的输出。
例如: ${user.id} 可以把 user 对象的 id 属性写入到 jsp 中。但这并不表明 JSTL 就没有用处了,JSTL 可以提供:条件判断,循环输出,html 标签过滤,URLs,日期格、数字式化等功能。
三、什么对象可以在 EL 表达式中使用?
问题:
在 jsp 页面中的 Java 代码块 <% %> 中定义的 java 对象,可以直接在 EL 表达式 中使用吗?
回答:
不可以。访问不到。
EL 表达式 只会调用这四个对象(page, request, session, application)的 getAtrribute(string) 方法,来获取表达式中的对象。
这就是所谓的 EL 内置 scope 对象 —— 它们分别对应四个 jsp 的内置对象。
如果 page 对象中没有,则会到 request 对象寻找。依次向更大 scope 的对象中寻找。
所以在 Java 代码块 <% %> 中新建类对象,需要使用上述 scope 对象的 setAttribute() 方法,将新建的对象绑定到 scope 对象中。才能被 EL 表达式 引用到。
例子:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <%@ 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> <% String hello = "Hello World!"; %> <h4>Using JSP Expression</h4> <p><%=hello%></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!
Using JSP Expression
Hello World!
生成的 JSP 源码:
/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/7.0.78 * Generated at: 2017-06-21 19:40:24 UTC * Note: The last modified time of this file was set to * the last modified time of the source file after * generation to assist with modification tracking. */ package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import com.test.pojo.User; public final class home_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fc_005fout_0026_005fvalue_005fnobody; private volatile javax.el.ExpressionFactory _el_expressionfactory; private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public javax.el.ExpressionFactory _jsp_getExpressionFactory() { if (_el_expressionfactory == null) { synchronized (this) { if (_el_expressionfactory == null) { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); } } } return _el_expressionfactory; } public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { if (_jsp_instancemanager == null) { synchronized (this) { if (_jsp_instancemanager == null) { _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } } } return _jsp_instancemanager; } public void _jspInit() { _005fjspx_005ftagPool_005fc_005fout_0026_005fvalue_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig()); } public void _jspDestroy() { _005fjspx_005ftagPool_005fc_005fout_0026_005fvalue_005fnobody.release(); } public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null; try { response.setContentType("text/html; charset=UTF-8"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write("\n"); out.write(" \n"); out.write(" \n"); out.write("<html> \n"); out.write("<head> \n"); out.write("\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n"); out.write("\t<title>Hello World</title> \n"); out.write("</head> \n"); out.write("<body> \n"); out.write(" \n"); out.write(" "); /*********************************************** Pay Attention: =============================================== When using EL or JSTL, the following User user = new User(); will not work. ============================================== */ pageContext.setAttribute("user", new User()); pageContext.setAttribute("user2", new User()); //request.setAttribute("user", new User()); out.write(" \n"); out.write(" \n"); out.write(" \n"); out.write(" <h4>Using EL</h4> \n"); out.write(" <p>"); out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${user.name }", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false)); out.write("</p> \n"); out.write(" <p>"); out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${user.getName() }", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false)); out.write("</p> \n"); out.write(" \n"); out.write(" <h4>Using JSTL</h4> \n"); out.write(" <p>"); if (_jspx_meth_c_005fout_005f0(_jspx_page_context)) return; out.write("</p> \n"); out.write(" <p>"); if (_jspx_meth_c_005fout_005f1(_jspx_page_context)) return; out.write("</p> \n"); out.write(" \n"); out.write(" \n"); out.write(" \n"); out.write(" "); String hello = "Hello World!"; out.write(" \n"); out.write(" <h4>Using JSP Expression</h4> \n"); out.write(" <p>"); out.print(hello); out.write("</p> \n"); out.write(" \n"); out.write("</body> \n"); out.write("</html> "); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { if (response.isCommitted()) { out.flush(); } else { out.clearBuffer(); } } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else throw new ServletException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } } private boolean _jspx_meth_c_005fout_005f0(javax.servlet.jsp.PageContext _jspx_page_context) throws java.lang.Throwable { javax.servlet.jsp.PageContext pageContext = _jspx_page_context; javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut(); // c:out org.apache.taglibs.standard.tag.rt.core.OutTag _jspx_th_c_005fout_005f0 = (org.apache.taglibs.standard.tag.rt.core.OutTag) _005fjspx_005ftagPool_005fc_005fout_0026_005fvalue_005fnobody.get(org.apache.taglibs.standard.tag.rt.core.OutTag.class); boolean _jspx_th_c_005fout_005f0_reused = false; try { _jspx_th_c_005fout_005f0.setPageContext(_jspx_page_context); _jspx_th_c_005fout_005f0.setParent(null); // /home.jsp(38,7) name = value type = null reqTime = true required = true fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null _jspx_th_c_005fout_005f0.setValue((java.lang.Object) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${user2.name}", java.lang.Object.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false)); int _jspx_eval_c_005fout_005f0 = _jspx_th_c_005fout_005f0.doStartTag(); if (_jspx_th_c_005fout_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { return true; } _005fjspx_005ftagPool_005fc_005fout_0026_005fvalue_005fnobody.reuse(_jspx_th_c_005fout_005f0); _jspx_th_c_005fout_005f0_reused = true; } finally { org.apache.jasper.runtime.JspRuntimeLibrary.releaseTag(_jspx_th_c_005fout_005f0, _jsp_getInstanceManager(), _jspx_th_c_005fout_005f0_reused); } return false; } private boolean _jspx_meth_c_005fout_005f1(javax.servlet.jsp.PageContext _jspx_page_context) throws java.lang.Throwable { javax.servlet.jsp.PageContext pageContext = _jspx_page_context; javax.servlet.jsp.JspWriter out = _jspx_page_context.getOut(); // c:out org.apache.taglibs.standard.tag.rt.core.OutTag _jspx_th_c_005fout_005f1 = (org.apache.taglibs.standard.tag.rt.core.OutTag) _005fjspx_005ftagPool_005fc_005fout_0026_005fvalue_005fnobody.get(org.apache.taglibs.standard.tag.rt.core.OutTag.class); boolean _jspx_th_c_005fout_005f1_reused = false; try { _jspx_th_c_005fout_005f1.setPageContext(_jspx_page_context); _jspx_th_c_005fout_005f1.setParent(null); // /home.jsp(39,7) name = value type = null reqTime = true required = true fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null _jspx_th_c_005fout_005f1.setValue((java.lang.Object) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${user2.getName()}", java.lang.Object.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false)); int _jspx_eval_c_005fout_005f1 = _jspx_th_c_005fout_005f1.doStartTag(); if (_jspx_th_c_005fout_005f1.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) { return true; } _005fjspx_005ftagPool_005fc_005fout_0026_005fvalue_005fnobody.reuse(_jspx_th_c_005fout_005f1); _jspx_th_c_005fout_005f1_reused = true; } finally { org.apache.jasper.runtime.JspRuntimeLibrary.releaseTag(_jspx_th_c_005fout_005f1, _jsp_getInstanceManager(), _jspx_th_c_005fout_005f1_reused); } return false; } }
引用
附: 在 EL 表达式中的变量可以依附的 scope 对象
只有定义在 scope 对象中的变量,才可以被其它的地方( EL)引用到。
page
变量被设置给 page 对象,则只能在本 jsp 内使用,不能在使用 <jsp:include> 调用该 jsp 的上级 jsp 中起作用。
- 使用 <jsp:useBean> 标签创建的变量默认都是 page scope 。
- 另外这些对象也都属于 page scope: out, response, pageContext, config, page, exception。
request
变量被设置给 request 对象,可以在本次访问所涉及到的的任何 jsp 页面中使用。
通常多个 jsp 页面共同为一次访问提供结果。
session
变量被设置给 session 对象,可以在本次会话中的任意 jsp 页面中访问。
application
变量被设置给 applicaation 对象,可以在整个应用的任意 jsp 页面中访问。
注:这种内置对象或上下文的用法在类库或模板设计方法中经常使用。比如, JSP有内置对象,JSTL也有内置对象(语法使用时的上下文环境),Struts 2 的标签也有内置对象及上下文环境(ValueStack)
四、 <c:set> 标签
引用
我们一直在关心在 scope 范围内怎样灵活设置变量。
除了在 JSP 页面的 Java 代码块 <% %> 中使用四个scope对象的 setAttribute() 方法外(当然,这是最常用和好用的方法),还可以使用: <c:set> 与 <jsp:useBean> 。
使用这两个标签时,都可以指定变量设置在那个 scope 对象中。也就是这两个标签都有一个名为 scope 的属性。
c:set 标签可以设置3种类型的变量到 scope 中(默认为 page Scope):
1、设置 纯文本字符 到 scope 中:
<c:set var="cName1" value="My Name"/>
2、设置 本地变量 到 scope 中:
<c:set var="cName2" value="<%= name %>"/>
3、设置 scope变量 到 scope 中:
<c:set var="cName3" value="${user.name}"/>
用法示例:
<%@ page isELIgnored="false"%> <%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %> <%@ page contentType="text/html; charset=utf-8" language="java" %> <%@ page import="com.eddy.pojo.User"%> <html> <body> <% String name = "Hello World!"; User user = new User("Admin"); pageContext.setAttribute("user",user); %> <c:set var="cName1" value="My Name"/> <c:set var="cName2" value="<%= name %>"/> <c:set var="cName3" value="${user.name}"/> <c:out value="${cName1}"></c:out><br/> <c:out value="${cName2}"></c:out><br/> <c:out value="${cName3}"></c:out><br/> <hr/> name: <%= name %><br/> cName2: <%= pageContext.getAttribute("cName2") %><br/> cName3: <%= pageContext.getAttribute("cName3") %><br/> </body> </html>
输出:
My Name Hello World! Admin —————————————— name: Hello World! cName2: Hello World! cName3: Admin
<c:set> 的第二种用法:用于修改 JSP scope 中的对象的某个属性值
<c:set target="${user}" property="name" value="John"/> 等价于: user.setName("John");
<c:set> 用法示例:
1、未指定 scope 时,使用 pageContext 对象对 c:set 对变量进行获取。
<c:set var="streetName" value="${properties.street}" /> <c:set var="cityName" value="${properties.city}" /> <c:set var="stateName" value="${properties.state}" /> <c:set var="startPoint" value="${streetName}, ${cityName}, +${stateName}" /> // 使用 pageContext 对象,对 c:set 对变量进行获取 <% String encodedStartPoint = java.net.URLEncoder.encode( (String)pageContext.getAttribute("startPoint"), "UTF-8");%>
2、设置代码中的变量到 scope 中,从而在其它 c 标签中使用
<c:set var="language"> <%= langTemp %> </c:set> <c:choose> <c:when test="${language=='en'}"> <body class="bodytag-en"> </c:when> <c:otherwise> <body> </c:otherwise> </c:choose>
3、在指定的 scope 中创建一个变量
<c:set var="currency" value="${user.currency}" scope="session" />
注:
1、使用 <c:remove var="currency"/> 移除所有 scope 中名为 currency 的变量
2、注意在一个jsp中引用其他jsp时(<jsp:include>),使用<c:set />时变量的范围。
一般为当前jsp内起作用,也就是不指定scope时在当前页面中设置的变量,
在子页面中时访问不到的(scope 默认为 page)。
引用
The <c:set> tag sets the value of an EL variable or the property of an EL variable in any of the JSP scopes (page, request, session, or application). If the variable does not already exist, it is created.
The JSP EL variable or property can be set either from the attribute value:
<c:set var="foo" scope="session" value="..."/>
or from the body of the tag:
<c:set var="foo">
...
</c:set>
http://docs.oracle.com/javaee/5/tutorial/doc/bnakh.html
五、 <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!
c:set 与 jsp:useBean 的区别
引用
*Difference betweenn c:set and jsp:useBean*
See the basic difference between c:set and jsp:useBean is:
First
c:set is a JSTL tag
while jsp:useBean is a JSP action.
Second thing,
you can use jsp:useBean either to retrieve a bean or create a bean object.
While c:set is used to set the property of an already existing bean not to create a bean or get a bean. c:set works somewhat similar to jsp:setProperty action for java beans.
And third thing,
there is no scope attribute for c:set(when you are using it with target attribute) JSTL tag as it is there for jsp:useBean JSP action.
And if you provide the value of target attribute as an EL expression, searching is from most restrictive scope to least restrictive scope.
六、EL 表达式 与 JSTL 标签的不同之处
问题1:JSTL 与 EL(Expression Language)的区别和联系?
阅读完“怎样避免在jsp中写逻辑代码”后,我停止了在jsp中写java代码片段的行为。因此我开始阅读和学习 JSTL,结果发现 JSTL 和 EL 之间有联系。但是我并不清楚这种联系。
下面是代码:
<c:set var="test" value="JSTL Core Tags"></c:set> <c:out value="${test}"></c:out>
我只知道 <c:set 是 JSTL 标签,而 ${test} 是 EL (表达式语言)。
我的困惑是:
1. JSTL 可以单独使用吗?是否必须配合 EL ?如果不是必须,如何解释上面代码?
2. 如何最简单的只使用 EL 表达式?
-----------------------------
Answer:
EL 表达式最初只用于 JSTL 标签(或其它自定义标签)的属性中。
在后来的 JSP 定义版本中,允许 EL 单独在 JSP 中使用,用于简单属性的输出。例如:
${user.id}
可以把 user 对象的 id 属性写入到 jsp 中。但这并不表明 JSTL 就没有用处了,JSTL 可以提供:条件判断,循环输出,html 标签过滤,URLs,日期格、数字式化等功能。
问题2:Are session and sessionScope the same in JSP EL?
public class LoginAction extends ActionSupport { private String username; private String password; @Override public String execute() throws Exception { ActionContext ctx = ActionContext.getContext(); Integer counter = (Integer)ctx.getApplication().get("counter"); // put counter into application ctx.getApplication().put("counter", counter); // put username into session ctx.getSession().put("user", username); if (getUsername().equals("crazyit.org") && getPassword().equals("leegang")) { ctx.put("tip", "Login Success! "); return SUCCESS; } else { ctx.put("tip", "Login Falied!"); return ERROR; } } }
I put "counter" in application "user" in session and "tip" in ActionContext. In JSP I can use ${session.user} and ${sessionScope.user} to reference the "user" property. ${request.tip} and ${requestScope.tip} to reference tip.
My questions:
Are session, request, application the same as sessionScope, requestScope, applicationScope in EL?
What's the relationship between ActionContext and request(requestScope)?
P.S.:
I test ${request == requestScope} which is true, this means they are the same?
回答:
/* <%-- http://stackoverflow.com/a/17592665/2893073 By default page, request, session, application objects are available to JSP pages. So you can access then using EL syntax. Except the above objects, And following table shows IMPLICIT objects available to EL. Implicit object Description 1. pageScope Scoped variables from page scope 2. requestScope Scoped variables from request scope 3. sessionScope Scoped variables from session scope 4. applicationScope Scoped variables from application scope 5. param Request parameters as strings 6. paramValues Request parameters as collections of strings 7. header HTTP request headers as strings 8. headerValues HTTP request headers as collections of strings 9. initParam Context-initialization parameters 10. cookie Cookie values 11. pageContext The JSP PageContext object for the current page So session and sessionScope are same but differs in context they are used. More specifically session is object and sessionScope is map (key, value) of Attribute and its value. If you say ${session.sessionAttr} it refers to session object available to JSP page. If you say ${sessionScope.sessionAttr} it refers to IMPLICIT session object available to EL. if you just say {attrName} it will search attrName in all scope, from page to application scope. -------------- EL duplicates those objects for self style usage. But it may cause confusion to jsp beginners. --%> */
引用:
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
Exact difference and relation between JSTL and expression-language
- http://stackoverflow.com/questions/15848251/
-
转载请注明
原文出处:http://lixh1986.iteye.com/blog/2324611
-
发表评论
-
javaWeb session失效时间设置
2018-04-25 14:19 1996session失效时间设置 session失效时间设 ... -
JSP 表达式 VS EL 表达式 用法比较
2017-06-21 06:03 1054应用场景: 根据访问路径URL,判断当前用户选择使用的语言。转 ... -
JSP之 @include VS jsp:include
2017-06-17 01:39 1416第一篇 对于可以重复使用的一段代码, 1、使用 <%@ ... -
JavaEE之(Servlet+Filter)环境搭建
2017-04-01 14:15 1041初学 Java Web 开发,请远 ... -
Servlet之单例与线程安全
2017-02-06 13:04 4441一、Servlet 是单例吗 不 ... -
Servlet之 destroy
2016-11-29 22:04 792只听说过 Servlet 何时 init(),何时 servi ... -
Servlet之JSP_02初探
2016-09-15 22:37 843一、被编译后的JSP 1、写一个JSP文件:index.js ... -
Servlet之JSP_01概述
2016-09-15 20:42 1164一、什么是JSP JSP (Java Server Page ... -
Servlet之Servlet API
2016-09-13 19:10 1613一、在哪里 Java Servlet ... -
Servlet 的生命周期图
2014-12-31 03:18 951A servlet life cycle can be def ... -
在一个JSP页面中,操作数据库
2013-03-11 19:02 2784下面的代码是在一个jsp页面中实现数据库的操作。 也是为了加深 ... -
Servlet之Filter及FilterChain的使用详解
2013-01-07 20:06 2163在 JavaEE 中没有 Interceptor(拦截器)的概 ... -
out.print和out.write
2012-12-30 11:42 19432问题: 这是一个JSP页面: <%@ page l ... -
等幂操作——get方法与post方法
2012-12-23 20:13 1753幂等操作: 指的是对于同一数据,不论对其进行任何次幂操作,总 ... -
如何将jsp中<input>设为只读
2012-12-13 10:49 23333将一个input变为只读,可以使用 readonly 属性 和 ... -
Request的 getAttribute 和 getParameter
2012-12-03 19:57 1281getParameter 返回的是String, 用于 ...
相关推荐
JavaWeb分页展示数据是Web应用开发中的常见需求,它涉及到多个关键技术的综合运用,包括AJAX、JSTL、EL表达式以及JSP标准动作。在这个项目中,我们将深入探讨这些技术,以便理解如何有效地在网页上实现数据的动态...
**JSTL与EL的协同工作**:在JSP页面中,EL表达式通常与JSTL标签一起使用,EL负责数据的获取和计算,而JSTL标签则负责页面的逻辑控制。例如,使用EL表达式和`<c:if>`标签可以实现简单的条件判断: ```jsp ${user != ...
EL表达式通常以`${}`包裹,它能够直接访问作用域中的对象,如request、session、application等。EL的优势在于其简洁性,可以快速地访问和操作数据,而无需编写大量的Java脚本。 **相关jar包**: - **standard.jar**...
6. 在JSP页面中,使用EL表达式读取Servlet传递的数据,并用JSTL标签生成分页链接。 7. 如果用户点击分页链接,上述流程重复,但页码会改变。 具体到本示例的"20131210servlet分页"文件,它可能包含了以下内容: - `...
3. 利用EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)减少脚本代码,提高可读性。 4. 使用session和cookie时注意管理好状态,避免过多的会话存储导致服务器性能下降。 综上所述,JSP...
使用JSTL和EL表达式,可以显著提升JSP页面的可读性和可维护性,减少JSP页面中的Java脚本,让页面更专注于展示逻辑,而不是控制逻辑。在现代的Java Web开发中,JSTL和EL已经成为构建高效、整洁的Web应用程序的标准...
Java Servlet和JSP(JavaServer Pages)是Java Web开发中的两个核心技术,用于构建动态网站和Web应用程序。这个压缩包“JavaServlet_JSP.zip”显然包含了关于这两者的学习资料,特别是“0596005725.chm”文件,可能...
在实验中,我们学习了 EL 表达式和 JSTL 标签库的原理和使用,了解了如何使用 EL 表达式和 JSTL 标签库来简化 JSP 页面的开发。我们还学习了如何使用 EL 表达式和 JSTL 标签库来实现具体的功能,例如输出数据、条件...
在这个例子中,`<c:forEach>`标签用于遍历集合,并通过EL表达式`${list}`引用了页面范围内的`list`变量。 总的来说,JSTL为JSP开发提供了强大的工具集,通过其丰富的标签库,可以有效地组织和简化Web应用程序的视图...
在这个例子中,`<c:forEach>`标签用于迭代`list`集合,而`${item.name}`是EL表达式,用于获取当前迭代项的`name`属性。 总结来说,JSTL是JSP开发中的重要工具,它通过提供一系列标准标签,简化了页面逻辑,提高了...
6. **JSTL与EL表达式(Expression Language)**:JSTL通常与JavaServer Pages Expression Language (EL) 结合使用,EL用于在JSP页面中访问和操作Java对象。EL表达式可以在JSTL标签中直接使用,简化了数据绑定。 7. ...
8. **EL和JSTL**:Expression Language和JavaServer Pages Standard Tag Library,简化JSP页面的编程,提高可读性和可维护性。 9. **会话管理**:使用session对象跟踪用户状态,实现购物车功能。 10. **过滤器和...
开发这样一个系统需要掌握JSP和Servlet的核心概念,如生命周期、页面指令、动作标签、EL表达式和JSTL标签库等。同时,还需要理解数据库操作,如SQL查询,以及如何通过Java的JDBC API与数据库进行交互。此外,良好的...
这里`${list}`是EL表达式,表示JSP页面中的一个变量,`<c:forEach>`标签则会遍历这个列表,并将当前元素赋值给`item`变量,然后在循环体内显示。 JSTL的引入使得JSP页面更加符合MVC(Model-View-Controller)设计...
其中,EL(Expression Language)表达式是JSP 2.0引入的一种轻量级脚本语言,用于访问JavaBeans属性和执行基本操作。FN函数是JSTL提供的一个功能强大的工具,包含在`javax.servlet.jsp.jstl.fn`包下,提供了一系列...
EL表达式(Expression Language)与JSTL(JavaServer Pages Standard Tag Library)是JSP Web开发中的重要组成部分,它们极大地提升了代码的可读性和维护性。在这个名为"EL表达式&JSTL;标签库_jar包"的压缩包中,...
而`standard.jar`则包含了JSTL需要的一些标准标签库,特别是`javax.servlet.jsp.jstl.core`包,它是EL表达式实现的基础。在项目中,这两个jar包通常需要一起导入,才能确保EL表达式和JSTL的正常工作。 导入这两个...
EL是JSP中的表达式语言,用于从页面作用域、请求作用域、会话作用域和应用作用域等范围内检索数据。EL提供了一种简洁的方式来访问和操作对象属性。 JSTL是一组标准标签库,提供了许多用于处理常见任务的标签,如...