JSTL的set能否设置其他类型的值

基本用法

<c:set var="name" value="amy" scope="域对象" />

以上这行代码的作用是在jsp页面将键为name,值为amy的属性设置到scope设置的域对象中。
在大多数学习网站中,举的例子的value通常都是一个字符串,会让人感觉set只能设置字符串。


疑问

问:set标签能否设置其他类型的值
答:可以的。

例子

<%@ page import="model.City,java.util.*" %>
<%
	Map<String,City> cityMap=new LinkedHashMap<String,City>();
	cityMap.put("01",new City("01","北京"));
	cityMap.put("02",new City("02","上海"));
	cityMap.put("03",new City("03","广州"));
	cityMap.put("04",new City("04","深圳"));
%>
<c:set var="cities" value="<%=cityMap %>" ></c:set>

<h3>遍历map集合:</h3>
<c:forEach items="${cities }" var="entry">
	${entry.value.no }:${entry.value.name }
</c:forEach>

输出结果如下:

由此可见set标签可将jsp代码块中定义的对象设置到域对象中。

为什么可以这样设置

因为JSP页面被访问时,会被web容器解析成Servlet(.java文件),并编译成class文件
.java文件与.class文件保存在下面的目录中:

D:\apache-tomcat-7.0.96\work\Catalina\localhost\JSP_Project\org\apache\jsp
            tomcat根目录\work\Catalina\localhost\     项目名\org\apache\jsp

一个jsp页面解析成一个Servlet,我们在JSP页面写的代码存放在该类中的_JspService方法中
其中set标签会被转换成如下代码:

      //  c:set
      【→】org.apache.taglibs.standard.tag.rt.core.SetTag _jspx_th_c_005fset_005f1 = (org.apache.taglibs.standard.tag.rt.core.SetTag) _005fjspx_005ftagPool_005fc_005fset_0026_005fvar_005fvalue_005fnobody.get(org.apache.taglibs.standard.tag.rt.core.SetTag.class);
      boolean _jspx_th_c_005fset_005f1_reused = false;
      try {
        _jspx_th_c_005fset_005f1.setPageContext(_jspx_page_context);
        _jspx_th_c_005fset_005f1.setParent(null);
        // /MyFunTest.jsp(28,0) name = var type = java.lang.String reqTime = false required = false fragment = false deferredValue = false expectedTypeName = null deferredMethod = false methodSignature = null
        【→】_jspx_th_c_005fset_005f1.setVar("cities");
        // /MyFunTest.jsp(28,0) name = value type = javax.el.ValueExpression reqTime = true required = false fragment = false deferredValue = true expectedTypeName = java.lang.Object deferredMethod = false methodSignature = null
        【→】_jspx_th_c_005fset_005f1.setValue(cityMap );
        int _jspx_eval_c_005fset_005f1 = _jspx_th_c_005fset_005f1.doStartTag();
        if (_jspx_th_c_005fset_005f1.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
          return;
        }
        _005fjspx_005ftagPool_005fc_005fset_0026_005fvar_005fvalue_005fnobody.reuse(_jspx_th_c_005fset_005f1);
        _jspx_th_c_005fset_005f1_reused = true;
      } finally {
        org.apache.jasper.runtime.JspRuntimeLibrary.releaseTag(_jspx_th_c_005fset_005f1, _jsp_getInstanceManager(), _jspx_th_c_005fset_005f1_reused);
      }

关键在标有【→】的后两行代码,与其相关的对象在第一个【→】指向的代码。
查看org.apache.taglibs.standard.tag.rt.core.SetTag的setValue方法(没有源码)

 public void setValue(java.lang.Object value);

可见它的参数是Object类型,所以set标签可设置Object类及其子类的对象。

解释完了,大家觉得解释得可以就点个赞呗→_→
哪位大哥知道怎样将带有特殊字符的内容加粗的留个言哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值