var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-20738293-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script')"/>
jutleo
欢迎走进有风的地方~~
posts - 63,  comments - 279,  trackbacks - 0
 

最近做毕业设计用到Struts2 的标签库,遇到一些比较复杂的数据显示,个人还是比较喜欢用tag显示的,Struts2 tags内容丰富,但是所提供的文档不是很详细(个人认为)在showcase下的例子如:<s:select /> <s:doubleselect /> <s:updownselect /> <s:optiontransferselect />等都是一些简单的值显示,在实际的开发中并没有那么简单,如果我们要迭代显示ListMapSet里的值,我们该怎样做呢?

   
看看html里的例子,

<select name="sex">

    <option value="man"></option>

    <option value="women"></option>

</select>

Sex表示提交的nameman/women是对应页面显示提交后所代表的值,男/女则为页面最终看到的值

   
而如果我们要显示一个List集合里的数据该怎么做呢?
   
看下面的Jsp页面:

<select name="department">

    <%

       Department department = null;

       List list = (List) request.getAttribute("list");

       Iterator iter = list.iterator();

       while (iter.hasNext()) {

           department = (Department) iter.next();

    %>

    <option value="<%=department.getDep_name() %>"><%=department.getDep_name()%>&nbsp;&nbsp;&nbsp;</option>

    <%

    }

    %>

</select>

迭代的是Department的属性dep_name,这样显示显得很麻烦,如果Iterator输出可能会好点,采用JSTL输出:

<c:forEach var="department" items="" varStatus="status">

    <tr>

       <td>${status.dep_name }</td>

       <td>${status.dep_id }</td>

       <td>......</td>

    </tr>

</c:forEach>


现在看看Struts2的例子:这是Strust2 showcase例子

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags"%>

<html>

<head>

<title>Test</title>

</head>

<body>

<center><br>

<br>

<br>

<hr>

<br>

<br>

<s:form action="test_showPost" method="post" theme="simple">

    <table>

       <tr>

           <td><s:select

              list="{'Windows','Linux','Java','.net','Pertl','PHP'}"

              name="program" tooltip="select your program" /></td>

       </tr>

        <tr>

           <td><s:select list="posts" name="post.post_name"

              listKey="post_name" listValue="post_name" headerKey="0"

              headerValue="请选择你的职位" required="true"></s:select></td>

       </tr>

       <tr>

           <td><s:checkboxlist name="skills1" label="Skills 1"

              tooltip="bulktree" list="{'Java', '.Net', 'RoR', 'PHP' }"

              value="{'Java', '.Net' }" /></td>

       </tr>

       <tr>

           <td><s:checkboxlist name="skills2" label="Skills 2"

              tooltip="bulktree" list="#{1:'Java', 2:'.Net', 3:'RoR', 4:'PHP' }"

              listKey="key" listValue="value" value="{1, 2, 3 }" /></td>

       </tr>

       <tr>

           <td><s:doubleselect label="doubleselect test1" name="menu"

              list="{'fruit','other'}" doubleName="dishes"

              doubleList="top == 'fruit' ? {'apple', 'orange'} : {'monkey', 'chicken'}" />

           </td>

       </tr>

       <tr>

           <td><s:updownselect label="Favourite Countries"

              list="#{'england':'England', 'america':'America', 'germany':'Germany'}"

              name="prioritisedFavouriteCountries" headerKey="-1"

              headerValue="--- Please Order Them Accordingly ---"

              emptyOption="true" /></td>

       </tr>

       <tr>

           <td><s:optiontransferselect

              tooltip="Select Your Favourite Cartoon Characters"

              label="Favourite Cartoons Characters"

              name="leftSideCartoonCharacters" leftTitle="Left Title"

              rightTitle="Right Title" list="{'Popeye', 'He-Man', 'Spiderman'}"

              multiple="true" headerKey="headerKey"

              headerValue="--- Please Select ---" emptyOption="true"

              doubleList="{'Superman', 'Mickey Mouse', 'Donald Duck'}"

              doubleName="rightSideCartoonCharacters"

              doubleHeaderKey="doubleHeaderKey"

              doubleHeaderValue="--- Please Select ---" doubleEmptyOption="true"

              doubleMultiple="true" /></td>

       </tr>

       <tr>

           <td><s:submit></s:submit></td>

       </tr>

    </table>

</s:form></center>

</body>

</html>

注意:上面的代码不需要用table布局,Struts2内置了表格功能,run显示如下:

 


   
上面的代码都是一些简单的值显示,实际的开发所出现的数据都不是现成的。大家可能注意了这段代码:
   

<tr>

           <td><s:select list="posts" name="post.post_name"

              listKey="post_name" listValue="post_name" headerKey="0"

              headerValue="请选择你的职位" required="true"></s:select></td>

       </tr>


下来就来说说Struts2 tag怎么显示List/Map/Set里的值:
采用POJO方式访问 VO是一些最基本的getter/setter省略不写。
    action
代码:

package com.bulktree.AutoOffice.action;

import java.util.List;

import java.util.Map;

import com.bulktree.AutoOffice.factory.DAOFactory;

import com.bulktree.AutoOffice.vo.Client;

import com.bulktree.AutoOffice.vo.ClientUser;

import com.bulktree.AutoOffice.vo.User;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

publicclass ClientUserAction extends ActionSupport {

   

    private List<Client> clients;

    private List<User> users;

   

    public List<Client> getClients() {

       returnclients;

    }

    publicvoid setClients(List<Client> clients) {

       this.clients = clients;

    }

    public List<User> getUsers() {

       returnusers;

    }

    publicvoid setUsers(List<User> users) {

       this.users = users;

    }

    public String queryClientID() throws Exception {

       Map session = ActionContext.getContext().getSession();

       String userid = (String)session.get("userid");

      

       setUsers(DAOFactory.getEmployeeInstance().queryUidUserid());

       setClients(DAOFactory.getClientInstance().queryByAll(userid));

      

       returnSUCCESS;

    }

}


   
下面是用来测试上面actionjsp页面:分别使用了<s:select/> <s:doubleselect /> <s:updownselect />来接收List集合里的值

<s:form action="clientuser_changeClient" method="post">

       <s:doubleselect list="clients" name="client.client_id"

           listKey="client_id" listValue="client_id"

           doubleName="client.client_name" doubleList="clients"

           doubleListKey="client_name" doubleListValue="client_name" />

       <s:updownselect label="All Clients ID" tooltip="show all clients"

           list="clients" headerKey="0" headerValue="--所有客户编号--"

           listKey="client_id" listValue="client_id" emptyOption="true"

           moveUpLabel="向上" moveDownLabel="向下" selectAllLabel="全选" />

       <s:updownselect label="All Clients name" tooltip="show all clients"

           list="clients" headerKey="0" headerValue="--所有客户姓名--"

           listKey="client_name" listValue="client_name" moveUpLabel="向上"

           moveDownLabel="向下" selectAllLabel="全选" emptyOption="true" />

       <s:select list="clients" name="clientuser.client_id"

           tooltip="Change Your Client" label="选择你将要转让的客户" listKey="client_id"

           listValue="client_id" required="true" />

       <s:select list="users" name="clientuser.userid" label="将要转让给同事"

           tooltip="Choose your partner" listKey="userid" listValue="userid"

           required="true" />

       <s:submit value=" 确认转让 " onclick="alert('转让后你就失去了该客户');" />

    </s:form>


   
说说最简单的<s:selelct />其他的以此类推:
·select标签必须属性只有一个为List
·select一定要有值,否则出错。如果我们在html中使用select时会有个默认的值,在Struts2中也是一样的,如果List,没有值可以加上headerKey,headerValue就可以通过。
·List属性的值在Action中定义,必须为一个迭代的List/Map/Set,本例采用List
· listKey对应html表单select中的value,listValue对应html表单中的option
·List/SetlistKeylistValue是一样的
·如果是Map,则mapkey对应key,mapvalue对应value
   
如下代码:

<s:select list="clients" name="clientuser.client_id"

           tooltip="Change Your Client" label="选择你将要转让的客户" listKey="client_id"

           listValue="client_id" required="true" />

    Clientsactionlist的对象,也就是getter/setter方法的名字,Struts2支持POJO访问,listKey的值”client_id”则为VO对象 (client)的属性(client_id(Struts2支持OGNL)我们还可以加上headerKeyheaderValue用以显示首行的提示,大家可以加上试试,注意:headerKey的值不能为-1否则编译不能通过。
    <s:doubleselect />
<s:select />运行机制是一样的,不同的就是<s:doubleselect />显示的是两个list/doubleList的值,doubleList的值牵制于list的值,它的内部实现机制是采用JavaScript
   

<s:doubleselect list="clients" name="client.client_id"

           listKey="client_id" listValue="client_id"

           doubleName="client.client_name" doubleList="clients"

           doubleListKey="client_name" doubleListValue="client_name" />

    这个<s:doubleselect />是有问题的,只是为了演示有值,但是没有真正起到doubleselect的作用,doubleList是按编号取值的,doubleList对应Map中一个keyvalue。采用本例的话可以把这样做:

Map<Integer, List<clients>> maps = new HashMap<Integer, List<clients>>();

maps.put(1, clients);

maps.put(2, clients);

maps.put(3, clients);

 
maps
key为第一级下拉列表的listKeytopclient的实例

<s:doubleselect list="clients" name="client.client_id"

           listKey="id" listValue="client_id"

           doubleName="client.client_name" doubleList="maps.get(top. id)"

           doubleListKey="client_name" doubleListValue="client_name" />

posted on 2008-04-02 08:46 凌晨风 阅读(10357) 评论(8)  编辑  收藏 所属分类: Spring/Hibernate/Struts2

FeedBack:
# re: Struts2中select/doubleselect标签数据显示
2008-04-02 09:07 | 凌晨风
顺便说说,毕业在即,我的系统侧重业务逻辑,主要是想用Struts2,严格按照MVC三大模块做,业务逻辑全部封装在DAO工厂中,前台JSP显示OGNL,由于导师要求后面加了QQ/MSN、短信平台(测试成功未实现),哪位能提供个就业的机会,本人感激不尽,后续将继续整理系统的相关知识发布上来。谢谢关注!  回复  更多评论
  
# re: Struts2中select/doubleselect标签数据显示
2008-05-08 17:31 | 爱爱爱
建议业务逻辑放在Bo 中  回复  更多评论
  
# re: Struts2中select/doubleselect标签数据显示
2008-07-08 14:21 | 汽车
写的真好,struts2就是好用.  回复  更多评论
  
# re: Struts2中select/doubleselect标签数据显示
2008-08-14 17:35 | KingBack
嗨, 你好, select List试了半天总是不成功, 能把你用select的完整代码贴出来吗?  回复  更多评论
  
# re: Struts2中select/doubleselect标签数据显示
2008-09-13 14:50 | waylon
LZ能不能把源代码贴出来啊,我调试了两天,没成功,有个错误
tag 'select', field 'list', name 'post.post_name': The requested list key 'Category' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location  回复  更多评论
  
# re: Struts2中select/doubleselect标签数据显示
2008-11-19 19:02 | 有点晕
select的还是不行,可不可以把你
<tr>

<td><s:select list="posts" name="post.post_name"

listKey="post_name" listValue="post_name" headerKey="0"

headerValue="请选择你的职位" required="true"></s:select></td>

</tr>
对应的action代码贴出来看看呢?  回复  更多评论
  
# re: Struts2中select/doubleselect标签数据显示
2008-11-20 10:20 | 凌晨风
这些是我毕业设计里的东东摘出来写了点,最近忙一项目没有时间找这些,你要是需要的话我把整个包发给你吧!laoshulin@gmail.com  回复  更多评论
  
# re: Struts2中select/doubleselect标签数据显示
2009-01-03 18:27 | 曾红伟
其实作者没有写全,s:select要想从数据库中获取值,首先创建一个action,然后在s:select标签前加一段话:
<s:action name="***" id="***"></s:action>
<s:set name="**" value="#***.**"></s:set>  回复  更多评论
  

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


网站导航:
 

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用链接

留言簿(11)

我参与的团队

随笔分类

随笔档案

文章分类

文章档案

新闻分类

新闻档案

收藏夹

围脖

最新随笔

搜索

  •  

最新评论

阅读排行榜

评论排行榜