下拉框是网页的重要元素,动态取数据并不难,通常的思路是在action中取数据,然后把数据放到request中,最后在页面上用标签遍历数据,但写多了,是不是很烦,我想做一个通用的下拉框标签,只要指明了业务接口,并且该接口实现了特定方法,就可以了。
首先定义一个接口,用来取下拉框的数据。
1. package com.ssh.tag;
2.
3. import java.util.List;
4.
5. /**
6. * @author 孙程亮 E-mail:sclsch@188.com
7. * @version 创建时间:Oct 27, 2008 6:59:05 PM
8. * 取得下拉框数据接口
9. */
10. public interface SelectorInterface {
11. public List getVableValueList();
12. }
如果哪个业务层service需要增加下拉框的功能,就需要实现它。
例如:
1. package com.ssh.entity.board.service;
2.
3. import java.util.ArrayList;
4. import java.util.List;
5.
6. import com.ssh.common.vo.ValueLabelBean;
7. import com.ssh.entity.board.dao.IBoardDao;
8. import com.ssh.entity.board.model.Board;
9. import com.ssh.tag.SelectorInterface;
10. import 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. */
16. public 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:
1. package com.ssh.common.vo;
2.
3. import java.io.Serializable;
4.
5. /**
6. * @author 孙程亮 E-mail:sclsch@188.com
7. * @version 创建时间:Oct 27, 2008 7:00:36 PM
8. */
9. public 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的默认选中项。
1. package com.ssh.tag;
2.
3. import java.io.IOException;
4. import java.lang.reflect.Method;
5. import java.util.List;
6.
7. import javax.servlet.jsp.JspException;
8. import javax.servlet.jsp.tagext.TagSupport;
9.
10. import org.springframework.context.support.AbstractApplicationContext;
11. import org.springframework.util.StringUtils;
12. import org.springframework.web.context.WebApplicationContext;
13. import org.springframework.web.context.support.WebApplicationContextUtils;
14. import org.springframework.web.util.JavaScriptUtils;
15. import com.ssh.common.util.*;
16. import com.ssh.entity.board.service.IBoardService;
17. import com.sun.org.apache.xml.internal.utils.ObjectPool;
18. import com.ssh.common.vo.*;
19. import com.ssh.tag.*;
20. /**
21. *
22. * @author 孙程亮 E-mail:sclsch@188.com
23. * @version 创建时间:Oct 25, 2008 10:22:18 AM
24. */
25. public 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接口,在页面上摆个标签就可以了。我刚学标签的编写,有什么不足请指正,如果有更好的设计一定告诉我额。