浏览 4804 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-09
最后修改:2011-05-09
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。 当然如果涉及到大量的查询结果,也不建议在页面用此标签。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-17
其实这样做,个人觉得还是不建议的,毕竟可配置性也是spring的一项优势,像您这种做法,我们并不能通过配置文件来找到对应的耦合关系
|
|
返回顶楼 | |
发表时间:2010-03-17
allengao 写道 其实这样做,个人觉得还是不建议的,毕竟可配置性也是spring的一项优势,像您这种做法,我们并不能通过配置文件来找到对应的耦合关系
你说的问题的确是这样的,我们可以交流 比较我是个新手的 吼吼 不过我这个一般情况下是建议和之前提到的htmlx标签配合用于常量的 |
|
返回顶楼 | |
发表时间:2010-03-23
建议与页面有关的操作,最好与struts结合比较好
|
|
返回顶楼 | |
发表时间:2010-03-23
JSF不就可以了吗?
没必要些那个类,ApplicationContext能被ServletContext取到。 |
|
返回顶楼 | |
发表时间:2010-04-23
不会用jspTag???,Spring的 RequestContextAwareTag 很方便还可以做权限等等,累!!!!!!!!!!!!!
|
|
返回顶楼 | |