`
raymond.chen
  • 浏览: 1436957 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

自定义标签:在JSP页面中动态执行Spring Bean的方法

阅读更多

     使用该自定义标签,可以在JSP页面中动态执行某个Spring Bean对象的一个方法,方法返回的结果存储在ValueStack中。该自定义标签在Spring2、Struts2、Hibernate3环境下测试通过。

 

一、java源代码

    1、ServiceTag源代码

public class ServiceTag extends BaseBodyTagSupport {
	private String beanName;
	private String methodName;
	private String id;
	public List params = new ArrayList();
	
	public void setBeanName(String beanName) {
		this.beanName = beanName;
	}
	
	public void setMethodName(String methodName) {
		this.methodName = methodName;
	}

	public void setId(String id) {
		this.id = id;
	}
	
	public int doEndTag() throws JspException {		
		Object bean = null;
		Method method = null;
		
		//取得bean对象
		try{
			bean = SpringContextUtil.getBean(beanName);
		}catch(Exception ex){
			throw new JspException("get bean error: " + beanName);
		}
		
		//通过反射取得方法
		if(bean != null){
			try {
				method = bean.getClass().getMethod(methodName, TagUtil.getParameterTypes(params));
			}catch(Exception e) {
				throw new JspException("get method error: " + beanName + "." + methodName);
			}
		}else{
			throw new JspException("ServiceTag Error: bean [" + beanName + "] is null");
		}
		
		//通过反射执行方法,得到结果
		Object result = null;
		if(method != null){
			try {
				result = method.invoke(bean, TagUtil.getParameterValues(params));
			}catch(Exception e){
				throw new JspException("method invoke error");
			}
		}
		
		//将结果存储在ValueStack中
		ValueStack vs = TagUtils.getStack(pageContext);
		vs.getContext().put(id, result);
		
		return EVAL_PAGE;
	}
}

 

    2、ServiceParamTag源代码

public class ServiceParamTag extends BaseBodyTagSupport {
	private String name;
	private Object value;
	private String type;
	
	public void setName(String name) {
		this.name = name;
	}

	public void setValue(Object value) {
		this.value = value;
	}

	public void setType(String type) {
		this.type = type;
	}

	public int doEndTag() throws JspException {
		Tag parent = getParent();
		if(parent instanceof ServiceTag){
			Map p = new HashMap();
			p.put("paramName", name);
			p.put("paramValue", value);
			p.put("paramType", type);
			((ServiceTag)parent).params.add(p);
		}
		
		return EVAL_PAGE;
	}
}

 

    3、公共方法源代码

//参数类型数组
public static Class[] getParameterTypes(List params) throws Exception{
	Class[] c = new Class[params.size()];
	
	for(int i=0;i<params.size();i++){
		Map p = (Map)params.get(i);
		String type = (String)p.get("paramType");
		c[i] = Class.forName(type);
	}
	
	return c;
}

//参数值数组
public static Object[] getParameterValues(List params) throws Exception{
	Object[] o = new Object[params.size()];
	
	for(int i=0;i<params.size();i++){
		Map p = (Map)params.get(i);
		o[i] = p.get("paramValue");
	}
	
	return o;
}

 

二、tld文件源代码

<tag>
	<name>serviceBean</name>
	<tag-class>com.cjm.web.taglib.ServiceTag</tag-class>
	<body-content>JSP</body-content>
	<attribute>
		<name>beanName</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
	<attribute>
		<name>methodName</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
	<attribute>
		<name>id</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
</tag>

<tag>
	<name>serviceParam</name>
	<tag-class>com.cjm.web.taglib.ServiceParamTag</tag-class>
	<body-content>JSP</body-content>
	<attribute>
		<name>name</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
	<attribute>
		<name>value</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
	<attribute>
		<name>type</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
	</attribute>
</tag>

 

三、范例

    1、java源代码

public class RoleService extends BaseService {
	private RoleDao roleDao;
	
	public RoleDao getRoleDao() {
		return roleDao;
	}

	public void setRoleDao(RoleDao roleDao) {
		this.roleDao = roleDao;
	}

	public Role getRole(String roleId){
		return (Role)get(Role.class, roleId);
	}
}

    2、JSP页面源代码

<cjm:serviceBean beanName="roleService" methodName="getRole" id="result">
	<cjm:serviceParam name="roleId" value="ADMIN" type="java.lang.String"/>
</cjm:serviceBean>

<s:property value="#result.roleName"/>

 

2
1
分享到:
评论
2 楼 itc10 2015-10-21  
//取得bean对象 
24.        try{ 
25.            bean = SpringContextUtil.getBean(beanName); 
26.        }catch(Exception ex){ 
27.            throw new JspException("get bean error: " + beanName); 
28.        } 


SpringContextUtil  ????,再加载applicationContext.xml一次??这在web项目会不会造成两个spring容器?,我也是醉了。
1 楼 dayang2001911 2008-10-07  
你也可以用ajax方式来实现吧,或者用dwr框架,直接就和spring集成的,可以调用bean的方法的啊,当然你这么做也应该可以了。

相关推荐

    零基础学Java.Web开发:JSP.Servlet.Struts.Spring.Hibernate.Ajax(PPT)

    首先,JSP是Java的一种视图技术,它允许开发人员在HTML或XML页面中嵌入Java代码,以动态生成网页内容。Servlet则作为服务器端的Java组件,负责处理HTTP请求和生成响应,是JSP背后的执行引擎。两者结合,为Web应用...

    Spring+jsp老项目转Springboot的示例Demo

    在Spring Boot中,我们通常会自定义`WebMvcConfigurer`或`WebMvcConfigurationSupport`来替代传统的`web.xml`配置,例如,可以创建一个`ApplicationConfig`类,重写`addViewControllers`方法,直接映射URL到JSP页面...

    Struts2、Spring、Freemarker自定义标签

    Spring框架也有自己的标签库,如Spring Taglib,可以简化JSP页面中的Spring Bean引用。而在Freemarker中,可以通过扩展其API创建自定义指令,实现更复杂的逻辑或功能。 总结一下,Struts2、Spring和Freemarker的...

    自定义分页标签struts2,spring

    自定义标签的实现主要是通过扩展Struts2的标签支持,创建自定义的TagSupport类,这允许我们在JSP页面上直接使用自定义标签,简化页面的编程逻辑。 Spring框架则在后台提供服务层的支持,包括依赖注入(DI)、面向切...

    java源码:JSP 动态数据菜单.rar

    在这个项目中,开发者通常会利用JSP的内置对象、JavaBean或者自定义标签来从后台数据库获取数据,并在页面上动态生成菜单结构。以下是这个主题涵盖的一些关键知识点: 1. **JSP(JavaServer Pages)**:JSP是一种...

    spring标签.zip

    本压缩包"spring标签.zip"包含的文件"spring标签"可能是指Spring框架中的自定义标签库,如spring.tld,这个TLD文件(Tag Library Descriptor)是用来描述Spring标签库的元数据。 Spring框架的标签主要分为两大部分...

    JSP Struts之HTML标签库详解

    Struts 是一个经典的Java Web开发框架,它提供了一套丰富的标签库来简化JSP页面的编写,特别是对于处理用户输入和展示数据。其中,HTML标签库是Struts中非常重要的一部分,它专门用于创建与Struts框架交互的HTML输入...

    java web 标签大全

    HTML标签在JSP中也广泛使用,与JSP标签结合可以构建复杂的动态页面。 5. Struts 2标签库: Struts 2框架提供了丰富的标签库,如`s:property`、`s:form`、`s:textfield`等,这些标签简化了MVC模式中的视图层开发。 ...

    J2EE页面标签大全

    J2EE页面标签大全涵盖了各种常用的JSP标准标签库(JSTL)以及自定义标签,它们使得开发者能够更加简洁地编写动态网页。下面我们将深入探讨这些标签及其用法。 1. JSTL(JavaServer Pages Standard Tag Library) -...

    jsp入门与提高(实用案例)

    2. **使用自定义标签**:在JSP页面中引入标签库,使用自定义标签进行业务逻辑处理。 **六、JSP与MVC框架** 1. **Struts、Spring MVC**:这些基于JSP的MVC框架,提供了更完善的架构和组件,简化开发流程。 **七、...

    Java自定义注解与spring BeanPostProcessor详解

    Java自定义注解和Spring的BeanPostProcessor是Java企业级开发中的两个重要概念,它们在构建灵活、可扩展的应用程序中发挥着关键作用。本文将深入探讨这两个话题,并结合源码分析,帮助开发者更好地理解和应用。 ...

    Servlet+JSP和Spring+MVC初学指南 书籍配套源码

    Servlet+JSP与Spring+MVC是两种在Java Web开发中常见的技术栈,它们用于构建动态、交互式的Web应用程序。本指南将深入介绍这两种技术及其整合应用,通过配套的源码帮助初学者更好地理解概念和实践操作。 Servlet是...

    全套jsp资料

    8. **JSTL(JavaServer Pages Standard Tag Library)**:JSTL提供了一套标准的标签库,包括核心标签、XML处理标签、JDBC标签和JMS标签等,旨在减少在JSP页面中使用脚本元素。 9. **MVC(Model-View-Controller)**...

    JSP程序设计教程(第1-9章).rar

    这一章讲述了Servlet与JSP的协同工作方式,包括Servlet如何转发或重定向到JSP页面,以及如何在Servlet中设置数据供JSP显示。同时,讲解了MVC(Model-View-Controller)设计模式在JSP开发中的应用。 ### 第8章:JSP...

    大三下学期JSP实验答案

    JSP动作标签负责处理服务器端的任务,如`&lt;jsp:useBean&gt;`用于实例化JavaBean,`&lt;jsp:setProperty&gt;`设置Bean的属性,`&lt;jsp:getProperty&gt;`读取Bean的属性,`&lt;jsp:forward&gt;`转发请求,以及`&lt;jsp:include&gt;`动态包含页面。...

    用纯jsp技术做的项目案例

    - 在这个BBS项目中,可能用到了JSP的动作指令来操作JavaBean,如`&lt;jsp:useBean&gt;`定义和初始化Bean,`&lt;jsp:setProperty&gt;`设置Bean属性,`&lt;jsp:getProperty&gt;`获取Bean属性。 4. **JSP内置对象**: - JSP提供了九个...

    SSH框架整合通用模板(内涵自定义标签分页)

    开发者可以创建一个自定义标签,接收参数如当前页、每页条数等,然后在后台计算总页数,查询相应范围的数据,最后在页面上展示。这种方式可以避免在JSP中嵌入过多的Java代码,提升代码的可读性。 5. **DAO和Service...

    jsp面试题

    - **服务阶段**:每次用户请求JSP时,都会调用Servlet的`service()`方法,执行JSP中的动态内容。 - **销毁阶段**:当服务器关闭或Servlet不再需要时,Servlet实例会被销毁。 3. **JSP指令**: - **page指令**:...

    struts加载spring的方法

    4. **扩展Struts的生命周期**:在某些场景下,可能还需要利用Spring的事件监听机制来扩展Struts的生命周期,比如在某个Action执行前后执行一些自定义逻辑。 通过上述步骤,我们不仅可以在Web应用层面集成Spring,还...

Global site tag (gtag.js) - Google Analytics