不知道大家在调用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>
分享到:
相关推荐
三、JSP自定义标记 自定义标记允许开发者创建自己的标签库,提供更高级别的抽象和封装,使得代码更加简洁易读。通过TLD(Tag Library Descriptor)文件定义标签的行为,然后在JSP页面中使用。 四、Java Web数据库...
最后,通过调用JavaBean的`getHtml`方法获取到渲染后的HTML代码,并将其展示在网页上: ```jsp () %> ``` 这里,`() %>`表示将JavaBean返回的HTML代码插入到当前HTML文档中。 ### 四、扩展性与灵活性 该项目...
JavaServer Pages(JSP)是Java平台上的动态网页开发技术,它允许开发者将静态HTML、XML或自定义标记与Java代码混合在一起,以创建动态、交互式的Web应用。JSP的核心概念包括以下几个方面: 1. **模板文本**:JSP...
这些标签可以调用JavaBean的方法,实现特定的功能,如发送邮件、文件上传或显示图形组件。 总结: JavaBean是Java编程中的一个重要概念,它促进了组件化开发,使得代码更易于复用和维护。在JSP环境下,JavaBean是...
%>`:声明区,声明变量或方法,这部分代码在JSP被转换为Java servlet时会出现在`_jspService`方法中。 - `<% %>`:脚本区,可以放置Java代码,它会被直接执行。 - `<%= %>`:表达式标签,用于输出变量或表达式的...
例如,可以编写一个验证电子邮件地址格式的函数,放在JavaBean中,然后在JSP页面上使用条件语句进行调用和处理。 4. **会话管理**:JSP支持会话跟踪,可以用来存储用户的登录状态或者购物车信息。通过`session`对象...
本章将讲述如何创建和使用JavaBean,以及如何在JSP页面中实例化和调用JavaBean的方法。 **第8章 Java Servlet基础** 虽然JSP主要关注视图层,但理解Servlet对于JSP的完整学习至关重要。Servlet是Java Web应用的...
在JSP中,Java代码通常被封装在脚本元素或自定义标签中,使得页面更加清晰,易于维护。在这个留言簿系统中,JSP将用于展示用户界面,处理用户请求,并向服务器传递数据。 2. **JavaBeans** JavaBeans是一种符合...
3. **自定义标签处理**:在JSP中使用自定义标签时,`doEndTag()`方法会在标签结束时被调用,用于完成标签的处理过程,如资源清理或最终的输出操作。 ### JSP内置对象与作用域 4. **对象作用域**:`<jsp:useBean>`...
这些声明在整个JSP页面中都是有效的,并且在JSP转换为Servlet时会被移动到Servlet的`_jspService`方法中。声明的变量作为实例变量(非局部变量),在JSP页面初始化时被初始化。 3. SQL查询: 在SQL中,使用`LIKE`...
使用JavaBean组件编程技术可以在JSP页面中调用JavaBean中的各个属性和方法,但是要求页面设计者熟悉Java程序编程。使用JSP标签(Tag)技术可以在页面程序中不出现Java程序代码,并且可以对JavaBean中的各个功能进行...
include动作标记告诉jsp页面动态加载一个文件,不把jsp页面中动作指令include所指定的文件与原jsp页面合并一个新的jsp页面,而是告诉Java解释器,这个文件在jsp运行时(Java文件的字节码文件被加载执行)才被处理。...
- **例子6**:`studentForm1.jsp`—介绍如何在JSP页面中使用JavaBean来收集和显示数据。 - **例子7**:`studentForm2.jsp`—进一步讨论如何使用JavaBean进行复杂的数据处理。 - **例子8**:`Triangle.java`—展示...
11. JSP调用JavaBean的标记:`<jsp:useBean>`用于实例化或查找Bean,`<jsp:setProperty>`和`<jsp:getProperty>`分别用于设置和获取Bean的属性。`<javabean>`不是JSP标准标签,因此选项D `<javabean>`不会在JSP中用到...
- **脚本声明**:在JSP页面中声明变量或方法,不建议在生产环境中使用,因为它们在每个请求中都会被重新声明。 - **脚本表达式**:用于将Java表达式的值插入到HTML输出中。 - **脚本let块**:在JSP 2.0及更高版本中...
JSP动作标记是在JSP页面中使用的XML元素,它们告诉JSP引擎执行特定的操作,而不是生成Java代码。常见动作标记包括: 1. **jsp:include**:动态地包含一个文件,与include指令类似,但可以改变每次请求时包含的内容...
本章将讲述如何创建和使用JavaBean,以及在JSP中通过jsp:useBean标签进行实例化和调用JavaBean的方法。 **第6章 JSP中的文件操作** 这一章讨论了在JSP中处理文件上传和下载的方法,包括使用Servlet API和JSP动作...
预定义指令可以声明多个变量和方法,可以在整个 JSP 页面中使用。 十二、选择12:Select 语句 要从“员工”表的“姓名”字段中找出名字包含“玛丽”的人,正确的 Select 语句是 Select * from 员工 where 姓名 like...
最后,我们需要在JSP页面中引入我们的自定义函数库,并在EL表达式中使用它。在`elTest.jsp`页面中,我们添加以下代码: ```jsp ... ${m:getFruit("10") } ``` 这里,`prefix="m"`是我们为自定义函数库选择的前缀,...