sclsch

java备忘

BlogJava 首页 新随笔 联系 聚合 管理
  10 Posts :: 0 Stories :: 6 Comments :: 0 Trackbacks

置顶随笔 #

    下拉框是网页的重要元素,动态取数据并不难,通常的思路是在action中取数据,然后把数据放到request中,最后在页面上用标签遍历数据,但写多了,是不是很烦,我想做一个通用的下拉框标签,只要指明了业务接口,并且该接口实现了特定方法,就可以了。
    首先定义一个接口,用来取下拉框的数据。
   
   1package com.ssh.tag;
   
2.
   
3import java.util.List;
   
4.
   
5/** 
   6.  * 
@author 孙程亮 E-mail:sclsch@188.com 
   7.  * 
@version 创建时间:Oct 27, 2008 6:59:05 PM
   8.  * 取得下拉框数据接口 
   9.  
*/
  
10public interface SelectorInterface {
  
11.   public List getVableValueList();
  
12. }
   
    如果哪个业务层service需要增加下拉框的功能,就需要实现它。
例如:
  
   1package com.ssh.entity.board.service;
   
2.
   
3import java.util.ArrayList;
   
4import java.util.List;
   
5.
   
6import com.ssh.common.vo.ValueLabelBean;
   
7import com.ssh.entity.board.dao.IBoardDao;
   
8import com.ssh.entity.board.model.Board;
   
9import com.ssh.tag.SelectorInterface;
  
10import com.sun.java_cup.internal.internal_error;
  
11.
  
12/**
  13.  * 
@author 孙程亮 E-mail:sclsch@188.com
  14.  * 
@version 创建时间:Sep 4, 2008 6:36:22 PM
  15.  
*/
  
16public class BoardServiceImpl implements IBoardService,SelectorInterface{
  
17.     private IBoardDao boardDao;
  
18.
  
19.     public void addBoard(Board b) {
  
20.        boardDao.addBorad(b);
  
21.     }
  
22.
  
23.     public IBoardDao getBoardDao() {
  
24.         return boardDao;
  
25.     }
  
26.
  
27.     public void setBoardDao(IBoardDao boardDao) {
  
28.         this.boardDao = boardDao;
  
29.     }
  
30.
  
31.     public List getAllBoards() {
  
32.         return this.boardDao.getAllBoards();
  
33.     }
  
34.     /**
  35.      * 用来实现下拉框的方法,
  36.      * 把下拉数据存放在ValuLabelBean中,再存放在list中返回
  37.      * 给自定义标签。
  38.      * 
@return 下拉数据集合
  39.      
*/
  
40.     public List getVableValueList() {
  
41.         List list = this.boardDao.getAllBoards();
  
42.         List valueLableList = new ArrayList();
  
43.         for(int i=0;i<list.size();i++){
  
44.           Board board = (Board)list.get(i);
  
45.           ValueLabelBean vlb = new ValueLabelBean();
  
46.           vlb.setValue(board.getId().toString());
  
47.           vlb.setLabel(board.getName());
  
48.           valueLableList.add(vlb);
  
49.         }
  
50.         return valueLableList;
  
51.     }
  
52. }
    注意数据必须放在ValueLabelBean中,label表示下拉框显示的数据,value表示下拉框的value值,下面是ValueLabelBean
这个bean:
   1package com.ssh.common.vo;
   
2.
   
3import java.io.Serializable;
   
4.
   
5/**
   6.  * 
@author 孙程亮 E-mail:sclsch@188.com
   7.  * 
@version 创建时间:Oct 27, 2008 7:00:36 PM
   8.  
*/
   
9public class ValueLabelBean implements Serializable {
  
10.     private String value;
  
11.     private String label;
  
12.
  
13.     public String getValue() {
  
14.         return value;
  
15.     }
  
16.
  
17.     public void setValue(String value) {
  
18.         this.value = value;
  
19.     }
  
20.
  
21.     public String getLabel() {
  
22.         return label;
  
23.     }
  
24.
  
25.     public void setLabel(String label) {
  
26.         this.label = label;
  
27.     }
  
28. }

   下面就是写tag了,暂时设置了三个属性 tagId,serviceBean和title,
tagId:select 的 id 属性值。
serviceBean:对应于spring容器中service的id。
title:select的默认选中项。
   1package com.ssh.tag;
   
2.
   
3import java.io.IOException;
   
4import java.lang.reflect.Method;
   
5import java.util.List;
   
6.
   
7import javax.servlet.jsp.JspException;
   
8import javax.servlet.jsp.tagext.TagSupport;
   
9.
  
10import org.springframework.context.support.AbstractApplicationContext;
  
11import org.springframework.util.StringUtils;
  
12import org.springframework.web.context.WebApplicationContext;
  
13import org.springframework.web.context.support.WebApplicationContextUtils;
  
14import org.springframework.web.util.JavaScriptUtils;
  
15import com.ssh.common.util.*;
  
16import com.ssh.entity.board.service.IBoardService;
  
17import com.sun.org.apache.xml.internal.utils.ObjectPool;
  
18import com.ssh.common.vo.*;
  
19import com.ssh.tag.*;
  
20/**
  21.  * 
  22.  * 
@author 孙程亮 E-mail:sclsch@188.com
  23.  * 
@version 创建时间:Oct 25, 2008 10:22:18 AM
  24.  
*/
  
25public class SelectorTag extends TagSupport {
  
26.     
  
27.     private String tagId;      //select's id
  28.     private String serviceBean;//service
  29.     private String title;      //select's title
  30.     
  
31.     public int doEndTag() throws JspException {
  
32.       WebApplicationContext applicationContext =  WebApplicationContextUtils.getWebApplicationContext(pageContext.getServletContext());
  
33.       SelectorInterface selectorInterface = (SelectorInterface)applicationContext.getBean(serviceBean);
  
34.       List list1 = selectorInterface.getVableValueList();
  
35.       //List list = ServiceLocator.getSelectorService(serviceBean).getVableValueList();
  36.       StringBuffer sBuffer = new StringBuffer();
  
37.       sBuffer.append("<select id='"+this.tagId);
  
38.
  
39.       sBuffer.append("'>");
  
40.       if(!StringUtil.isBlank(title)){
  
41.           sBuffer.append("<option value='-1' selected>"+title+"</option>");
  
42.       }
  
43.       for(int i=0;i<list1.size();i++){
  
44.         ValueLabelBean vlb =  (ValueLabelBean)list1.get(i);
  
45.         sBuffer.append("<option value='"+vlb.getValue()+"'>"+vlb.getLabel()+"</option>");
  
46.       }
  
47.       sBuffer.append("</select>");
  
48.       try {
  
49.         pageContext.getOut().println(sBuffer.toString());
  
50.     } catch (IOException e) {
  
51.         // TODO Auto-generated catch block
  52.         e.printStackTrace();
  
53.     }
  
54.       return EVAL_PAGE;
  
55.     }
  
56.     public void setTagId(String tagId) {
  
57.         this.tagId = tagId;
  
58.     }
  
59.     public void setServiceBean(String serviceBean) {
  
60.         this.serviceBean = serviceBean;
  
61.     }
  
62.     public void setTitle(String title) {
  
63.         this.title = title;
  
64.     }
  
65. }

在标签中可以用WebApplicationContextUtils来得到context,曾一度起了弯路,想到用一个工具类加载容器,倒也能实现,也想到用反射,但是行不通的。 看来变通一下,可能会少走很多弯路。
   下面是tld文件:
<?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE taglib PUBLIC
     "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
     "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

 <taglib>

     <tlib-version>1.0</tlib-version>
     <jsp-version>1.0</jsp-version>
     <short-name>sclschTag</short-name>
     <description>sclschTag</description>

     <tag>
         <name>selectorTag</name>
         <tag-class>com.ssh.tag.SelectorTag</tag-class>
         <body-content>JSP</body-content>
         <description>
         </description>
         <attribute>
             <name>tagId</name>
             <required>true</required>
             <rtexprvalue>true</rtexprvalue>
         </attribute>

         <attribute>
             <name>serviceBean</name>
             <required>true</required>
             <rtexprvalue>true</rtexprvalue>
         </attribute>
         <attribute>
             <name>title</name>
             <required>false</required>
             <rtexprvalue>true</rtexprvalue>
         </attribute>
     </tag>

 </taglib>
最后就剩页面了:
  <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding
="UTF-8"%>
 
<%@ taglib uri="/WEB-INF/tld/selectorTag.tld" prefix="sclsch"%>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
 
<head>
 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 
<title>mytag(sclsch@188.com)</title>
 
</head>
 
<body>
 
<sclsch:selectorTag tagId='myid' title="--请选择--" serviceBean="boardService" />
 
</body>
 
</html>

    好了,尽管这个tag很简陋,但为以后省了不少工,只要在业务层实现一个SelectorInterface接口,在页面上摆个标签就可以了。我刚学标签的编写,有什么不足请指正,如果有更好的设计一定告诉我额。


posted @ 2008-10-28 20:57 sclsch 阅读(731) | 评论 (0)编辑 收藏

仅列出标题