`
sjsky
  • 浏览: 918280 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[实用技巧] jsp页面直接调用spring中定义的Bean的属性方法

阅读更多
    blog迁移至:http://www.micmiu.com

    也许你会问:为什么我要在页面里调用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中
/**
 * 将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 配置文件如下:(只显示本文相关的一些配置)
<!-- 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页面里引入标签:
<%@ taglib prefix="ct" uri="http://devsphere.com/articles/calltag/CallTag.tld"%>

具体页面的引用例子:
<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方法,还可以用如下方法调用:
<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。
  当然如果涉及到大量的查询结果,也不建议在页面用此标签。
分享到:
评论
5 楼 cike 2010-04-23  
不会用jspTag???,Spring的 RequestContextAwareTag 很方便还可以做权限等等,累!!!!!!!!!!!!!
4 楼 mercyblitz 2010-03-23  
JSF不就可以了吗?

没必要些那个类,ApplicationContext能被ServletContext取到。
3 楼 sunliao_first 2010-03-23  
建议与页面有关的操作,最好与struts结合比较好
2 楼 sjsky 2010-03-17  
allengao 写道
其实这样做,个人觉得还是不建议的,毕竟可配置性也是spring的一项优势,像您这种做法,我们并不能通过配置文件来找到对应的耦合关系


你说的问题的确是这样的,我们可以交流 比较我是个新手的 吼吼
不过我这个一般情况下是建议和之前提到的htmlx标签配合用于常量的
1 楼 allengao 2010-03-17  
其实这样做,个人觉得还是不建议的,毕竟可配置性也是spring的一项优势,像您这种做法,我们并不能通过配置文件来找到对应的耦合关系

相关推荐

    S2SH中JSP页面调用dao的方法

    如果直接在JSP页面尝试调用DAO层的方法,很可能会遇到空指针异常,这是因为JSP页面无法直接获取到Spring容器管理的对象实例。因此,我们需要一种方法使得JSP页面能够间接地调用DAO层的方法。 #### 三、解决方案步骤...

    JSP 获取spring容器中bean的两种方法总结

    这种做法使得在JSP页面中可以非常方便地调用Spring容器中的服务类,进而进行业务逻辑处理。 ### 方法二:手动启动Spring容器后获取 在某些特殊情况下,可能需要在Web应用之外手动启动Spring容器,进而获取容器中的...

    spring+springmvc+mybatis整合(含简单jsp页面)

    总结来说,"spring+springmvc+mybatis整合(含简单jsp页面)"这个主题涵盖了Java Web开发中的核心框架集成,涉及Spring的IOC和AOP、SpringMVC的MVC架构以及MyBatis的SQL映射。通过合理的配置和组织,可以构建出高效...

    JspServletBean example

    在Servlet的`doGet`或`doPost`方法中,可以实例化一个Bean,设置其属性,然后将其放在请求或session范围,以便在JSP页面上使用。以下是一个简单的示例: ```java // Servlet代码 public void doGet...

    java JSP开发之Spring中Bean的使用

    在Java JSP开发中,Spring框架的使用是至关重要的,特别是对于管理Bean的生命周期。Spring中的Bean代表着应用中的对象,这些对象由Spring容器管理,提供了一种松耦合和依赖注入的机制。在本文中,我们将深入探讨...

    JSP工程包含Spring配置信息

    总结来说,“JSP工程包含Spring配置信息”意味着这个项目是基于Spring框架构建的,使用JSP作为视图展示,并且其配置信息用于定义和管理项目中的对象和服务。理解并熟练掌握这些知识点对于Java Web开发至关重要。

    spring+Hibernate+jsp的简单例子

    - 配置Spring环境,包括设置Spring的bean定义文件(如applicationContext.xml),定义数据源、事务管理器等。 - 配置Hibernate,创建hibernate.cfg.xml文件来指定数据库连接,以及实体类对应的hbm.xml映射文件。 - ...

    JSP 获取Spring 注入对象示例

    这样,我们就成功地在JSP页面中获取到了Spring管理的`MyService`对象,可以进一步调用其方法来执行业务逻辑。 需要注意的是,虽然在JSP中直接获取Spring bean是可行的,但这并不推荐。因为JSP的主要职责是呈现视图...

    基于jsp+struts+spring+hibernate的Blog

    在这个Blog系统中,Struts用于处理HTTP请求,调用相应的业务逻辑,并将结果传递给JSP页面。 3. **Spring框架** Spring是一个全面的Java企业级应用开发框架,提供了依赖注入(DI)和面向切面编程(AOP)等核心特性...

    jsp定时执行的三种方法

    本文将详细介绍在JSP环境下实现定时执行任务的三种方法:利用`java.util.Timer`类、通过`ServletContextListener`接口以及采用Spring框架中的`ScheduledTimerTask`。 ### 1. 使用`java.util.Timer` `java.util....

    SpringMVC+Hibernate+Spring+JSP整合实例

    "SpringMVC+Hibernate+Spring+JSP整合实例"是一个经典的后端技术组合,它涵盖了Java领域中多个核心框架的集成应用,旨在实现数据持久化、业务逻辑处理以及用户界面展示的无缝连接。下面我们将深入探讨这些技术及其...

    maven+servlet+jsp+bean的demo

    在JSP页面中,我们可以通过EL(Expression Language)或JSTL(JavaServer Pages Standard Tag Library)来访问和操作Bean的属性。 JavaBean是一种符合特定规范的Java类,它具有默认构造器、getter和setter方法,...

    SSH项目后台JSP页面.zip

    在JSP页面中,虽然不直接与Spring交互,但Spring的模型对象(Model)会传递到视图层,供JSP展示。 3. **Hibernate**:是一个持久化框架,简化了Java对象与数据库之间的映射。它处理SQL查询和结果集转换,使得开发者...

    Servlet JSP Spring MVC初学指南(alin书签).pdf

    在Spring MVC中,控制器接收用户请求,调用业务逻辑(通常由Spring Bean处理),并返回一个模型,该模型随后被渲染为视图。Spring MVC还提供了强大的数据绑定、表单验证和异常处理功能。 在学习Servlet、JSP和...

    Spring+SpringMVC+Hibernate+JSP框架搭建

    5. **控制流程**:SpringMVC的Controller接收请求,调用业务服务层(由Spring管理的Bean),服务层通过Hibernate操作数据库,然后返回结果给Controller,Controller再将数据传递给JSP页面展示。 这个框架组合的优势...

    动态bean,自动动态输出数据库列和数据到jsp页面

    这通常是通过接口的实现、属性的动态添加和方法的动态调用来实现的。Spring框架中的`Prototype`作用域 bean 或者使用反射和代理技术来实现的类都属于动态Bean的范畴。 2. **数据库操作**: 在这个例子中,动态Bean...

    Spring-Reference_zh_CN(Spring中文参考手册)

    12.2.2. 在Spring的application context中创建 SessionFactory 12.2.3. HibernateTemplate 12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. ...

    JSF 资源 managed bean 课件

    - **输出Bean属性**:展示Bean中的数据到前端。 #### 三、Bean的定义及规范 - **背景介绍**:Bean是遵循一定约定的Java类,通常用于表示数据模型或控制逻辑。 - **Bean的定义**: - **零参构造函数**:Bean必须有...

    EL调用Java函数(想dwr里那样的调用)

    在Web开发中,EL(Expression Language)是一种用于在JSP页面中访问JavaBean属性和执行简单操作的语言。它简化了视图层与模型层的数据交互。然而,有时我们需要在EL表达式中调用Java方法,这通常是通过自定义EL函数...

Global site tag (gtag.js) - Google Analytics