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入门到精通教程
查看: 1064|回复: 0

jsp页面直接调用spring中定义的Bean的属性方法

[复制链接]

该用户从未签到

发表于 2011-10-17 19:34:54 | 显示全部楼层 |阅读模式
也许你会问:为什么我要在页面里调用bean里的方法呢?请你耐心看下去,希望对你有帮助。
   1.在项目中经常会遇到动态下拉框的情况,比如角色列表、部门列表、分类....,当然你也可以选择把这些变量request、session或者application 但是这就涉及到何时放入变量、何时更新等问题,同时会占用容器的内存。特别是在查询条件的列表,运用下面的方法<ct:call/>再配合之前有一篇文章中的HTMLx 标签就能非常好的解决此问题。
   2.我们经常会遇到用户id关联到其他表比如:消息表,作为消息的创建人,我们在展现消息表时,可以用下面介绍的方法在页面得到Map<userId,userName>,配合el表达式就能显示创建人的姓名,并不需要我们去关联查询。又比如我们经常会遇到给出用户id,显示用户本身的详细信息,同样我们可以用下面介绍的方法<ct:call/>结合jstl或el表达式就能取得用户这个对象来完成此需求。
   这里举了几个简单的例子,基于上面的情况我们才需要这样的方法,下面就对这个方法的整个步骤进行详细的描述:

   对于在spring xml配置文件中的bean里的属性方法,如果符合java Bean规范,直接用EL表达式调用,例如srpingctx.userAccountService.userList 这个代表调用userAccountService中的方法getUserList();
   如果不符合Java Bean规范(不是getXxxxx()或者isXxxx())或者带有参数的方法,可以采用taglib标签
<ct:call object="beanName" method="xxx" param1="p1" param2="p2" return="RT_VAR" />此标签lib见附件
其中beanName对应于spring中定义的名字,xxx对应于beanName中定义的方法,如果xxx方法没有参数,则param1、param2...等都省略,调用的结果保存在return定义的变量名RT_VAR中,以后可以用EL表达(RT_VAR)直接访问.
  
  1.需要写一个类把spring context中定义的bean放在web application中

Java代码
/**   
* 将spring context 中定义的bean放到Web的Application中.   
*/   
public class SpringCtxLoader extends WebApplicationObjectSupport {   
    /**   
     * Logger for this class   
     */   
    private static final Logger logger = Logger   
            .getLogger(CodeTableLoader.class);   
    /**   
     * Web application 中的常量集合Map的名字.   
     */   
    private static final String SPRING_CONTEXT = "springctx";   
    /**   
     * initialize application context .   
     */   
    @SuppressWarnings("unchecked")   
    protected void initApplicationContext() {   
        try {   
            final WebApplicationContext ctx = this.getWebApplicationContext();   
            HashMap springServices = new HashMap() {   
            private static final long serialVersionUID = -1759893921358235848L;   
   
                public Object get(Object key) {   
                    return ctx.getBean((String) key);   
                };   
                public boolean containsKey(Object key) {   
                    return true;   
                }   
            };   
            logger.info("load code table (spring  beans");   
            // 放入到Web全局变量中,供页面使用.   
            this.getServletContext().setAttribute(SPRING_CONTEXT,   
                    springServices);   
        } catch (IllegalStateException e) {   
            logger.warn("not web app application context ,can't be load "   
                    + e.getLocalizedMessage());   
        }   
    }   
}  
/**
* 将spring context 中定义的bean放到Web的Application中.
*/
public class SpringCtxLoader extends WebApplicationObjectSupport {
    /**
     * Logger for this class
     */
    private static final Logger logger = Logger
            .getLogger(CodeTableLoader.class);
    /**
     * Web application 中的常量集合Map的名字.
     */
    private static final String SPRING_CONTEXT = "springctx";
    /**
     * initialize application context .
     */
    @SuppressWarnings("unchecked")
    protected void initApplicationContext() {
        try {
            final WebApplicationContext ctx = this.getWebApplicationContext();
            HashMap springServices = new HashMap() {
            private static final long serialVersionUID = -1759893921358235848L;

                public Object get(Object key) {
                    return ctx.getBean((String) key);
                };
                public boolean containsKey(Object key) {
                    return true;
                }
            };
            logger.info("load code table (spring  beans");
            // 放入到Web全局变量中,供页面使用.
            this.getServletContext().setAttribute(SPRING_CONTEXT,
                    springServices);
        } catch (IllegalStateException e) {
            logger.warn("not web app application context ,can't be load "
                    + e.getLocalizedMessage());
        }
    }
}
  2.spring 配置文件如下只显示本文相关的一些配置)


Xml代码
<!-- web application 全局常量列表 对象 -->   
    <bean name="springCtxLoader" class="utils.SpringCtxLoader"   
        lazy-init="false">   
    </bean>   
   
<!-- UserAccountService 事务管理 -->   
    <bean name="userAccountService" parent="baseTransactionProxy">   
        <property name="target">   
            <bean class="service.UserAccountService">   
                <property name="sessionFactory" ref="sessionFactory" />   
            </bean>   
        </property>   
    </bean>  
<!-- web application 全局常量列表 对象 -->
    <bean name="springCtxLoader" class="utils.SpringCtxLoader"
        lazy-init="false">
    </bean>

<!-- UserAccountService 事务管理 -->
    <bean name="userAccountService" parent="baseTransactionProxy">
        <property name="target">
            <bean class="service.UserAccountService">
                <property name="sessionFactory" ref="sessionFactory" />
            </bean>
        </property>
    </bean>


3.别忘了在jsp页面里引入标签:

Html代码
<%@ taglib prefix="ct" uri="http://devsphere.com/articles/calltag/CallTag.tld"%>  
<%@ taglib prefix="ct" uri="http://devsphere.com/articles/calltag/CallTag.tld"%>

具体页面的引用例子:


Html代码
<ct:call object="userAccountService" method="getUserList" return="USER_LIST" />   
所有的用户列表:<br>   
<c:forEach var="vo" items="${USER_LIST}">   
        用户ID:${vo.userID},姓名:${vo.userName}<br>   
</c:forEach>   
   
<ct:call object="userAccountService" method="getUserMapByRole" param1="admin" return="USER_LIST" />   
遍历管理员列表:<br>   
<c:forEach var="vo" items="${USER_LIST}">   
        用户ID:${vo.key},姓名:${vo.value}<br>   
</c:forEach>  
<ct:call object="userAccountService" method="getUserList" return="USER_LIST" />
所有的用户列表:<br>
<c:forEach var="vo" items="${USER_LIST}">
        用户ID:${vo.userID},姓名:${vo.userName}<br>
</c:forEach>

<ct:call object="userAccountService" method="getUserMapByRole" param1="admin" return="USER_LIST" />
遍历管理员列表:<br>
<c:forEach var="vo" items="${USER_LIST}">
        用户ID:${vo.key},姓名:${vo.value}<br>
</c:forEach>

对于符合java bean规范的,比如上面的getUserList方法,还可以用如下方法调用:


Html代码
<c:set var="USER_LIST" value="${springctx.userAccountService.userList}" />   
所有的用户列表:<br>   
<c:forEach var="vo" items="${USER_LIST}">   
        用户ID:${vo.userID},姓名:${vo.userName}<br>   
</c:forEach>  
<c:set var="USER_LIST" value="${springctx.userAccountService.userList}" />
所有的用户列表:<br>
<c:forEach var="vo" items="${USER_LIST}">
        用户ID:${vo.userID},姓名:${vo.userName}<br>
</c:forEach>
    在上面的具体实例中用到了Map,在EL表达式中,Map集合对象中元素的访问可以用${VAR_MAP.key}的方式访问key对应的value,也可以用${VAR_MAP[key]}来访问,后者是通常的访问语法,也更为灵活,比如key是某个对象的某个属性,此时我们只能采用${VAR_MAP[vo.property]}来访问,而不能用${VAR_MAP.vo.property}

ps:需要特别注意的!!!如果要用这个标签,那么spring中定义的这个bean中,最好不要有相同方法名而参数不同的方法,此标签对此功能不支持,有可能会出错,暂时还没有解决此bug。
  当然如果涉及到大量的查询结果,也不建议在页面用此标签。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 17:15 , Processed in 0.485643 second(s), 38 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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