`
zengsun
  • 浏览: 39296 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论

在JSP页面中使用自定义标记调用javabean的方法

    博客分类:
  • JSP
阅读更多
不知道大家在调用JavaBean的方法时,是不是像我一样感觉很是不爽?
看下面这段代码:
<jsp:useBean id="memberBean" class="org.jforum.bbean.MemberBean" scope="session">
</jsp:useBean>
<c:choose>
    <c:when test="${param.Submit=='注 销'}">
        <% memberBean.loginOut(); %>
        <c:redirect url="index.jsp" />
    </c:when>
    <c:when test="${param.Submit=='登 录'}">
        <% memberBean.login(request.getParameter("username"), request.getParameter("password")); %>
        <c:if test="${memberBean.logined}">
            <c:redirect url="index.jsp" />
        </c:if>
    </c:when>
</c:choose>

<% memberBean.login(request.getParameter("username"), request.getParameter("password")); %>
自己写出来,都觉得很费力!
但是还有更糟的:
<ul>
            <c:forEach items="${categoryBean.categoryList}" var="category">
                <li>${ category.name }</li>
                <ul>
                    <c:forEach items="<%= categoryBean.getSubCategoryList((Category)pageContext.getAttribute("category")) %>" var="subCategory">
                        <li>
                            <a href="category.jsp?id=${ subCategory.id }">${ subCategory.name }</a><br />
                            ${ subCategory.description }
                        </li>
                    </c:forEach>
                </ul>
            </c:forEach>
        </ul>

大家都看到了:<% %>中想要使用标签库定义的对象真是痛苦!
我只是恨JSP2没有调用javabean方法的标签!!!(该死的JSP,总有一天要淘汰你。)
但是想想要通过反射调用bean的方法应该也不是什么难事,就自己翻参考书写了两个标签解决了这个问题!
现将成果公布一下,和大家分享!
主要的标记处理代码:Call.java
/*
 * Call.java
 *
 * Created on June 11, 2007, 12:03 PM
 */

package learnjsp2.tags;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import org.apache.taglibs.standard.lang.jstl.Coercions;
import org.apache.taglibs.standard.lang.jstl.ELException;

/**
 *
 * @author  zsun
 * @version
 */

public class Call extends SimpleTagSupport implements DynamicAttributes, StrictTypeParams  {
    
    /**
     * Initialization of bean property.
     */
    private java.lang.Object bean;
    
    /**
     * Initialization of method property.
     */
    private java.lang.String method;
    
    /**
     * Initialization of var property.
     */
    private java.lang.String var = null;
    
    /**
     * Initialization of scope property.
     */
    private int scope = PageContext.PAGE_SCOPE;
    private List dynamicAttrValues = new ArrayList();
    private List typeList = null;
    
    /**Called by the container to invoke this tag.
     * The implementation of this method is provided by the tag library developer,
     * and handles all tag processing, body iteration, etc.
     */
    public void doTag() throws JspException {
        JspWriter out=getJspContext().getOut();
        try {
            JspFragment f=getJspBody();
            if (f != null) f.invoke(out);
        } catch (java.io.IOException ex) {
            throw new JspException(ex.getMessage());
        }
        
        Class cls = bean.getClass();
        Method[] methods = cls.getMethods();
        Method m = null;
        Class[] paramTypes = null;
        
        search: for (int i = 0; i < methods.length; i++ ) {
            Method t = methods[i];
            paramTypes = t.getParameterTypes();
            if (t.getName().equals(method) &&
                    paramTypes.length == dynamicAttrValues.size()) {
                if (typeList != null)
                    for (int j = 0; j < paramTypes.length; j++)
                        if (!paramTypes[j].getName().equals(typeList.get(j)))
                            continue search;
                m = t;
                break;
            }
        }
        if (m == null)
            throw new JspException("JavaBean Object hasn't no method named '" + method + "'");
        
        try {
            Object coercedValues[] = new Object[paramTypes.length];
            Iterator paramIterator = dynamicAttrValues.iterator();
            for (int i = 0; i < paramTypes.length; i++) {
                Object paramValue = paramIterator.next();
                Class paramClass = paramTypes[i];
                System.out.println(paramClass);
                if (paramValue == null || paramValue.getClass() != paramClass)
                    try {
                        paramValue = Coercions.coerce(paramValue, paramClass, null);
                    } catch (ELException e) {
                        throw new JspException(e.getMessage(), e.getRootCause());
                    }
                coercedValues[i] = paramValue;
            }
            Object returnVal = m.invoke(bean, coercedValues);
            if (var != null)
                if (returnVal != null)
                    getJspContext().setAttribute(var, returnVal, scope);
                else
                    getJspContext().removeAttribute(var, scope);
            
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new JspException("Call method is Error!");
        }
        
    }
    
    /**
     * Setter for the bean attribute.
     */
    public void setBean(java.lang.Object value) throws JspException {
        if (value == null)
            throw new JspException("Null 'bean' attribute in 'Call' tag");
        this.bean = value;
    }
    
    /**
     * Setter for the method attribute.
     */
    public void setMethod(java.lang.String value) throws JspException {
        if (value == null)
            throw new JspException("Null 'method' attribute in 'Call' tag");
        this.method = value;
    }
    
    /**
     * Setter for the var attribute.
     */
    public void setVar(java.lang.String value) throws JspException {
        if (value == null)
            throw new JspException("Null 'var' attribute in 'Call' tag");
        this.var = value;
    }
    
    /**
     * Setter for the scope attribute.
     */
    public void setScope(java.lang.String value) {
        if (value.equalsIgnoreCase("page"))
            scope = PageContext.PAGE_SCOPE;
        else if (value.equalsIgnoreCase("request"))
            scope = PageContext.REQUEST_SCOPE;
        else if (value.equalsIgnoreCase("session"))
            scope = PageContext.SESSION_SCOPE;
        else if (value.equalsIgnoreCase("application"))
            scope = PageContext.APPLICATION_SCOPE;
    }
    
    public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
        dynamicAttrValues.add(value);
    }

    public void addStrictTypeParameter(String type, Object value) {
        if (typeList == null)
            typeList = new ArrayList();
        typeList.add(type);
        dynamicAttrValues.add(value);
    }
}

定义父子标签协作接口:StrictTypeParams.java
/*
 * StrictTypeParams.java
 *
 * Created on June 14, 2007, 9:35 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package learnjsp2.tags;

/**
 *
 * @author zsun
 */
public interface StrictTypeParams {
    void addStrictTypeParameter(String type, Object value);
}

参数标记:ParamTag.java
package learnjsp2.tags;
/*
 * ParamTag.java
 *
 * Created on June 14, 2007, 10:35 AM
 */

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;

/**
 *
 * @author  zsun
 * @version
 */

public class ParamTag extends SimpleTagSupport {

    /**
     * Initialization of class property.
     */
    private java.lang.String _class;
    
    /**Called by the container to invoke this tag.
     * The implementation of this method is provided by the tag library developer,
     * and handles all tag processing, body iteration, etc.
     */
    public void doTag() throws JspException {
        StrictTypeParams parent = (StrictTypeParams)findAncestorWithClass(this, StrictTypeParams.class);
        if (parent == null) {
            throw new JspException("The Param tag is not enclosed by a supported tag type");
        }
        parent.addStrictTypeParameter(this._class, this.value);
        
    }
    /**
     * Initialization of value property.
     */
    private java.lang.Object value;
    /**
     * Setter for the class attribute.
     */
    public void setParamclass(java.lang.String value) {
        this._class = value;
    }
    /**
     * Setter for the value attribute.
     */
    public void setValue(java.lang.Object value) {
        this.value = value;
    }
}

部署描述符:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
  <tlib-version>1.0</tlib-version>
  <short-name>utils</short-name>
  <uri>/WEB-INF/tlds/utils</uri>
  <tag>
    <name>Call</name>
    <tag-class>learnjsp2.tags.Call</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
      <name>bean</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.Object</type>
    </attribute>
    <attribute>
      <name>method</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.String</type>
    </attribute>
    <attribute>
      <name>var</name>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.String</type>
    </attribute>
    <attribute>
      <name>scope</name>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.String</type>
    </attribute>
    <dynamic-attributes>true</dynamic-attributes>
  </tag>
  <tag>
    <name>Param</name>
    <tag-class>learnjsp2.tags.ParamTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
      <name>paramclass</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.String</type>
    </attribute>
    <attribute>
      <name>value</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.lang.Object</type>
    </attribute>
  </tag>
</taglib>


分享到:
评论
2 楼 abc789111 2011-10-11  
"我只是恨JSP2没有调用javabean方法的标签" 谁说JSP没有? 自己不知道 不要说人家没有。
1 楼 uule 2011-09-01  
这个方法addStrictTypeParameter有什么用?

相关推荐

    JavaBean技术与Web数据库操作.ppt

    三、JSP自定义标记 自定义标记允许开发者创建自己的标签库,提供更高级别的抽象和封装,使得代码更加简洁易读。通过TLD(Tag Library Descriptor)文件定义标签的行为,然后在JSP页面中使用。 四、Java Web数据库...

    使用javabean创建您的网上日历本(1)_jsp实例

    最后,通过调用JavaBean的`getHtml`方法获取到渲染后的HTML代码,并将其展示在网页上: ```jsp () %&gt; ``` 这里,`() %&gt;`表示将JavaBean返回的HTML代码插入到当前HTML文档中。 ### 四、扩展性与灵活性 该项目...

    jsp jsp+javabean bbs论坛

    JavaServer Pages(JSP)是Java平台上的动态网页开发技术,它允许开发者将静态HTML、XML或自定义标记与Java代码混合在一起,以创建动态、交互式的Web应用。JSP的核心概念包括以下几个方面: 1. **模板文本**:JSP...

    JavaBean组件程序设计

    这些标签可以调用JavaBean的方法,实现特定的功能,如发送邮件、文件上传或显示图形组件。 总结: JavaBean是Java编程中的一个重要概念,它促进了组件化开发,使得代码更易于复用和维护。在JSP环境下,JavaBean是...

    jsp页面源码

    %&gt;`:声明区,声明变量或方法,这部分代码在JSP被转换为Java servlet时会出现在`_jspService`方法中。 - `&lt;% %&gt;`:脚本区,可以放置Java代码,它会被直接执行。 - `&lt;%= %&gt;`:表达式标签,用于输出变量或表达式的...

    JSP几个应用实例

    例如,可以编写一个验证电子邮件地址格式的函数,放在JavaBean中,然后在JSP页面上使用条件语句进行调用和处理。 4. **会话管理**:JSP支持会话跟踪,可以用来存储用户的登录状态或者购物车信息。通过`session`对象...

    jsp程序设计ppt

    本章将讲述如何创建和使用JavaBean,以及如何在JSP页面中实例化和调用JavaBean的方法。 **第8章 Java Servlet基础** 虽然JSP主要关注视图层,但理解Servlet对于JSP的完整学习至关重要。Servlet是Java Web应用的...

    简单的jsp+javabean+access留言簿修正版

    在JSP中,Java代码通常被封装在脚本元素或自定义标签中,使得页面更加清晰,易于维护。在这个留言簿系统中,JSP将用于展示用户界面,处理用户请求,并向服务器传递数据。 2. **JavaBeans** JavaBeans是一种符合...

    Jsp期末考试卷子

    3. **自定义标签处理**:在JSP中使用自定义标签时,`doEndTag()`方法会在标签结束时被调用,用于完成标签的处理过程,如资源清理或最终的输出操作。 ### JSP内置对象与作用域 4. **对象作用域**:`&lt;jsp:useBean&gt;`...

    JSP试题题库(上)

    这些声明在整个JSP页面中都是有效的,并且在JSP转换为Servlet时会被移动到Servlet的`_jspService`方法中。声明的变量作为实例变量(非局部变量),在JSP页面初始化时被初始化。 3. SQL查询: 在SQL中,使用`LIKE`...

    JavaWeb-标签库应用方法初探.docx

    使用JavaBean组件编程技术可以在JSP页面中调用JavaBean中的各个属性和方法,但是要求页面设计者熟悉Java程序编程。使用JSP标签(Tag)技术可以在页面程序中不出现Java程序代码,并且可以对JavaBean中的各个功能进行...

    《jsp程序的设计》_试卷.doc

    include动作标记告诉jsp页面动态加载一个文件,不把jsp页面中动作指令include所指定的文件与原jsp页面合并一个新的jsp页面,而是告诉Java解释器,这个文件在jsp运行时(Java文件的字节码文件被加载执行)才被处理。...

    jsp程序设计考试题及答案.doc

    11. JSP调用JavaBean的标记:`&lt;jsp:useBean&gt;`用于实例化或查找Bean,`&lt;jsp:setProperty&gt;`和`&lt;jsp:getProperty&gt;`分别用于设置和获取Bean的属性。`&lt;javabean&gt;`不是JSP标准标签,因此选项D `&lt;javabean&gt;`不会在JSP中用到...

    JSP由浅入深完全精通(CHM)

    - **脚本声明**:在JSP页面中声明变量或方法,不建议在生产环境中使用,因为它们在每个请求中都会被重新声明。 - **脚本表达式**:用于将Java表达式的值插入到HTML输出中。 - **脚本let块**:在JSP 2.0及更高版本中...

    jsp程序设计课件

    JSP动作标记是在JSP页面中使用的XML元素,它们告诉JSP引擎执行特定的操作,而不是生成Java代码。常见动作标记包括: 1. **jsp:include**:动态地包含一个文件,与include指令类似,但可以改变每次请求时包含的内容...

    JSP实用教程 第二版

    本章将讲述如何创建和使用JavaBean,以及在JSP中通过jsp:useBean标签进行实例化和调用JavaBean的方法。 **第6章 JSP中的文件操作** 这一章讨论了在JSP中处理文件上传和下载的方法,包括使用Servlet API和JSP动作...

    Java-Web程序设计-高职软件专业技能测试题库.doc

    预定义指令可以声明多个变量和方法,可以在整个 JSP 页面中使用。 十二、选择12:Select 语句 要从“员工”表的“姓名”字段中找出名字包含“玛丽”的人,正确的 Select 语句是 Select * from 员工 where 姓名 like...

    自定义EL表达式

    最后,我们需要在JSP页面中引入我们的自定义函数库,并在EL表达式中使用它。在`elTest.jsp`页面中,我们添加以下代码: ```jsp ... ${m:getFruit("10") } ``` 这里,`prefix="m"`是我们为自定义函数库选择的前缀,...

Global site tag (gtag.js) - Google Analytics