Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 767|回复: 0

关于JSP页面中嵌入的java代码中函数参数的见解

[复制链接]

该用户从未签到

发表于 2011-10-20 11:00:57 | 显示全部楼层 |阅读模式
源代码是:

    <c:forEach items="${result}" var="gb">
    <tr align="center" class="font1">
   <td class="font1">${gb.goodId }</td>
    <td class="font1">${gb.goodName }</td>
    <td class="font1">${gb.goodPrice }</td>
    <td class="font1"><table width="100%" border="1">
    <tr align="center" class="font1">
    <td width="9%"><input type="text" name="num" value="<%=ms.getGoodsNum(gb.goodId+"") %>" size="18">

   <input type="hidden" name="goodsId" value="${gb.goodId }"></td>
    <td width="9%"><a href="HandleShoppping?type=delGoods&goodsID=${gb.goodId}">删除</a></td>
   <td width="9%"><a href="HandleShow?id=${gb.goodId }">查看</a></td>
    </tr>
    </table></td>
    </tr>
  </c:forEach>
        看起来是很怪,JSP界面里,既有java代码,又有EL。

        当然,我不希望里面嵌入任何的java代码,但换成EL表达式的时候,EL支持的只是JSTL中的function标签,而且这个标签里面的函数都已经规定了,基本上是对String 类型 字符串处理的函数,所以,当我调用的时候,系统提示要用 fn:前缀(fn:就是function 的前缀),去百度里 Google了一下,上面说的 可以自己定义函数,但我看了很久没有明白什么意思,所以这条路算是走到尽头了。

      既然EL中不能嵌入已存在的函数,那我就只能用java代码了<%=...%>了,这里是调用了

        MainShopping ms = (MainShopping)session.getAttribute("myShopping")  存在session里的myShopping 的属性。函数的调用没问题了,但真正的问题出现了,函数的参数无法传递,gb.goodId cannot be resolved to a type 怎么想的想不明白。在result容器里,gb就是每个类型的对象,对象当然可以调用自己的成员变量,这里当然没错,就像下面的参数传递,完全证明了我的想法,但这里就是无法传递,一开始,以为是我的RP问题,电脑重启了N次,tomcat重启了2N次,但就是同样的错误,本来这个圣诞节就下雪,天气冷,这样,心更冷了。

      没办法了,只能上网求助了,在里问了,很多好心的大神们都说了自己的想法,果然是  “广撒网,多捞鱼”尽管这句话用在这里不是很适合(本来是追女生的手段)但得到了一些答案。

      EL表达式只能单独在页面的代码中实现,在<%=...%>里,EL表达式在编译阶段根本不校验,校验的是java代码,所以,在java代码里,出现EL表达式, 系统根本不知道是什么类型,这里就证实了 报错的原因了。

      如果不能用EL表达式的话,怎么办,如果在用以前那种(源代码:



  <%

  ArrayList<UseBean> al = (ArrayList<UseBean>)request.getAttribute("result");


       for(int i=0;i<al.size();i++) {
      
       UseBean ub = (UseBean)al.get(i);
      
       %>
      <tr align="center" class="font1">
        <td class="font1"><%=ub.getGoodId() %></td>
        <td class="font1"><%=ub.getGoodName() %></td>
        <td class="font1"><%=ub.getGoodPrice() %></td>
        <td class="font1"><table width="100%" border="1">
          <tr align="center" class="font1">
            <td width="9%"><input type="text" name="num" value=<%=ms.getGoodsNum(ub.getGoodId()+"") %> size="18"><input type="hidden" name="goodsId" value="<%=ub.getGoodId() %>"></td>
            <td width="9%"><a href="HandleShoppping?type=delGoods&goodsID=<%=ub.getGoodId() %>">删除</a></td>
            <td width="9%"><a href="HandleShow?id=<%=ub.getGoodId() %>">查看</a></td>
          </tr>
        </table></td>
      </tr>
      <%
        }
       %>

)那样,JSP页面里,一半是java代码,看起来很不舒服,并且JSP页面就是实现界面的,没必要要那么多的java代码,那是 Servlet 或者是structs 里的 action 需要的。

     所以,只能通过java代码取出每个变量(result里的类型的对象),因为在 <c:forEach items="${result}" var="gb"> 没有指定每个对象存在哪里,所以,默认的就是在 page 作用域里了。那么就可以调用 (pageContext.getAttribute("gb")) 取出对象,然后强制转换成相对于的

JavaBean了,这里就是 (UseBean)pageContext.getAttribute("gb"),然后就可以调用相应的方法取得参数。

完整的:(((UseBean)pageContext.getAttribute("gb")).getGoodId()+"") 然后在调用

       value="<%=ms.getGoodsNum(((UseBean)(pageContext.getAttribute("gb"))).getGoodId()+"") %>" 终于算是解决了,但还有不组,如何能够在EL里调用已存在的函数。。。。

   

       现在终于明白了为什么要用框架了,SSH 的好处现在就体现出来了,Structs 的 优势就在于参数的传递的时候,会自动封装成 各自的ActionForm,再也不用如此麻烦了,still purse.......
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-11 20:54 , Processed in 0.331413 second(s), 39 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表