|
在Struts应用中,到JSP页面上显示下拉列表框应该是常有的事。
在基于是Struts的MVC框架中显示下拉框,有好些方法,用自定义标签库就是其中之一。
若我们的此下拉框是放在基于HTMLForm中的。Struts可以通过ActionForm来保存其历史记录(不排除我们人为地给此 ActionForm清理一下)。然而此自定义标签库却没有此功能!因为它没有通过过ActionForm中的字段来保存其记录。所以选择的时候可以根据自己的需要来定(我觉得在ActionForm中处理List列表框真的是一件非常庞大的工程 )。
JSP中对标签的应用:
<% @ taglib uri = " /WEB-INF/self-html.tld " prefix = " test " %>
div class ="formitem" >
< span class ="parameter_name" > 所属栏目: </ span >
< span class ="parameter_value" >
< test:category name ="dto.id" type ="17" />
</ span >
</ div >
web.xml配置文件中:
<!-- self Tag Library Descriptors -->
< taglib >
< taglib-uri > /WEB-INF/self-html.tld </ taglib-uri >
< taglib-location > /WEB-INF/self-html.tld </ taglib-location >
</ taglib >
self-html.tld定义:
< taglib >
< tlibversion > 1.0 </ tlibversion >
< jspversion > 1.1 </ jspversion >
< shortname > netedu </ shortname >
< tag >
< name > category </ name >
< tagclass > com.CategoryTag </ tagclass >
< bodycontent > empty </ bodycontent >
< info > tag here </ info >
< attribute >
< name > name </ name >
< required > false </ required >
< rtexprvalue > false </ rtexprvalue >
</ attribute >
< attribute >
< name > id </ name >
</ tag >
</ taglib >
以后自己就有什么扩展的需要就是在这儿加参数了!
总算是到了标签库的定义的地方了:
/**
* @author test
*/
public class CategoryTag extends TagSupport {
/**/ /* (non-javadoc)
* @see javax.Servlet.jsp.tagext.Tag#doStartTag()
*/
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
try {
JspWriter out = pageContext.getOut();
// jspwriter是一个隐含对象,用于向jsp网页输出内容。输出的目标由
CategoryManager manager = getManager();
List options = null ;
if (type == Constants.SORT_VALUE_ARCHive_YEAR)
options = getArchiveYear();
if (options == null || options.size() == 0 )
options = UMParameterUtil.getParameters(type);
if (options == null || options.size() == 0 )
options = manager.getCategorys(type);
BaseCategoryDTO dto;
ParametersDTO param;
Object o = null ;
if (bean != null )
o = RequestUtils.lookup(pageContext, bean, property, scope);
if (o != null && (( ! (o instanceof Integer)) && ( ! (o instanceof Long)) && ( ! (o instanceof List)) && ( ! (o
instanceof Long[])) ))
throw new JspException(
" bean or property must be instanceof Long or List " );
out.print( " <select " + TaglibUtil.attrFormat( " name " , name));
out.print(TaglibUtil.attrFormat( " id " , id));
out.print(TaglibUtil.attrFormat( " multiple " , multiple));
out.print(TaglibUtil.attrFormat( " class " , styleClass));
out.print(TaglibUtil.attrFormat( " size " , String.valueOf(size)));
out.print(TaglibUtil.attrFormat( " onchange " , onchange));
out.print(TaglibUtil.attrFormat( " style " , style));
out.print(TaglibUtil.attrFormat( " disable " , disable));
out.print( " > " );
if (showAll) out.print( " <option value=-1>不限</option> " );
if (showNull) out.print( " <option value=''></option> " );
printOption(out, options, o);
out.print( " </select> " );
} catch (IOException ioException) {
throw new JspException(ioException.getMessage());
} // catch
return (SKIP_BODY);
// return super.doStartTag();
}
注:
有options= manager.getCategorys(type);其中manager是CategoryManager类。此方法返回的一个List就是下拉框的值。具体实现可由我们自己来定义好了!记得在JSP中也有<test:category name="dto..id" type="17"/>,其中的type="17"(比如说可以是传一个DB中的一个表的一个外键)就是此方法中的初始化参数值了(关于此标签库的定义的一些setter and getter方法中也舍了).既然是库当然要通用。这个type就是通用的一个关键入口,不过显然这样一样可读性打了几分折扣。
TaglibUtil.attrFormat("name", name)的方法如下:
public class TaglibUtil {
public static String attrFormat(String attrName, Object attrValue) {
if (attrValue != null )
return " " + attrName + " = " + " \ "" + attrValue + " \ "" ;
else
return " " ;
}
还有一个就是printOption,这个方法应该比较重要了。它负责生成了列表框的选择的值与名称。如:
if ( ! excludeFlag) {
out.print( " <option "
+ TaglibUtil.attrFormat( " value " , id
.toString()));
out.println(TaglibUtil.attrFormat( " sysValue " , sysValue));
if (o != null ) {
if (o instanceof Long) {
if (id.equals(o)) out.print( " selected " );
}
else
if (o instanceof List) {
if (((List)o).contains(id))
out.print( " selected " );
} else
if (o instanceof Long[]) {
if (isSelected(id,(Long[])o))
out.print( " selected " );
}
}
// if (dto.getId().equals(o)) out.print("selected ");
out.print( " > " );
out.print(name);
out.print( " </option> " );
}
不要郁闷id是如何来的。当然是从options= manager.getCategorys(type)中来的了。
也许说得不是太详细,代码也有些残缺。不过实现过程基本全在这里了。我觉得它非常棒,直到我用到它的onchange,style时!简直在直接跟使用html中的list一样!
out.print(TaglibUtil.attrFormat("size", String.valueOf(size)));
out.print(TaglibUtil.attrFormat("onchange", onchange));
out.print(TaglibUtil.attrFormat("style", style));
out.print(TaglibUtil.attrFormat("disable", disable)); |
|