JAVA

人生若只如初见,何事秋风悲画扇。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  50 随笔 :: 25 文章 :: 157 评论 :: 0 Trackbacks

  在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));


  至少给我们指明了一些自定义标签库的经验!

posted on 2006-04-06 18:55 Jkallen 阅读(5946) 评论(8)  编辑  收藏 所属分类: JEE学习其它开源

评论

# re: Struts自定义标签库-----列表显示 2006-12-18 10:31 knight[匿名]
代码不全,不知所云  回复  更多评论
  

# re: Struts自定义标签库-----列表显示 2007-07-11 16:43 darkdragonking
干吗不把全部代码弄上呢,出于保密?
实话实说,
写的不是很明白
但是感谢搂主作出的贡献all the same  回复  更多评论
  

# re: Struts自定义标签库-----列表显示 2007-09-03 18:27 临沂师院
写的更明白些会更好了,不果顶一下  回复  更多评论
  

# re: Struts自定义标签库-----列表显示 2008-01-13 11:26 alonely
感觉概念说的还不是很清楚
http://www.3y11.com  回复  更多评论
  

# re: Struts自定义标签库-----列表显示 2008-10-02 18:03 力五
写的还不错!那位有自定义标签的一些运行顺序图,发给我啊!谢谢
QQ:105677211  回复  更多评论
  

# re: Struts自定义标签库-----列表显示[未登录] 2008-10-03 07:34 蓝天
刚刚毕业之时起的笔,现在一些特殊原因,不能再发了...  回复  更多评论
  

# re: Struts自定义标签库-----列表显示 2009-06-07 09:54 马马虎虎,还需努力
马马虎虎,还需努力  回复  更多评论
  

# re: Struts自定义标签库-----列表显示[未登录] 2013-07-11 00:13 Randy
如果可能,麻烦把完整的源码发给我下:362563734@qq.com
感激不尽!~  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问