22

[codes=xml]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Config 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<data-sources>
<data-source>
<set-property
name="${}"
value="${}"/>
</data-source>
</data-sources>
<form-beans>
<form-bean
name="${}"
type="${}">
<form-property
name="${}"
type="${}"/>
</form-bean>
</form-beans>
<global-exceptions>
<exception
type="${}"
key="${}"
path="${}"/>
</global-exceptions>
<global-forwards>
<forward
name="${}"
path="${}"/>
</global-forwards>
<action-mappings>
<action
path="${}"
type="${}"
name="${}"
scope="${}"
validate="${}"
input="${}">
<forward
name="${}"
path="${}"/>
<exception
type="${}"
key="${}"
path="${}"/>
</action>
</action-mappings>
<controller processorClass="${}" />
<form-beans>
<form-bean
name="${}"
type="${}">
<form-property
name="${}"
type="${}"/>
</form-bean>
</form-beans>
<global-exceptions>
<exception
type="${}"
key="${}"
path="${}"/>
</global-exceptions>
<global-forwards>
<forward
name="${}"
path="${}"/>
</global-forwards>
<action-mappings>
<action
path="${}"
type="${}"
name="${}"
scope="${}"
validate="${}"
input="${}">
<forward
name="${}"
path="${}"/>
<exception
type="${}"
key="${}"
path="${}"/>
</action>
</action-mappings>
<controller processorClass="${}" />
<message-resources
parameter="${}"/>
<plug-in
className="${}">
<set-property
property="${}"
value="${}"/>
</plug-in>
</struts-config>
[/codes]

作者:堕落天使

11

大家都知道Struts是一种基于MVC的结构,而这个MVC又怎么样理解呢?书上阐述的一般都很详细,而我的理解很直白,我们可以把业务逻辑放到每个JSP页面中,当你访问一个JSP页面的时候,就可以看到业务逻辑得到的结果,而把这些业务逻辑与HTML代码夹杂到了一起,一定会造成一些不必要的麻烦,可以不可以不让我们的业务逻辑和那些HTML代码夹杂到一起呢?多少得搀杂一些,那干脆,尽量少的吧,于是我们可以尝试着把业务逻辑的运算过程放到一个Action里,我们访问这个Action,之后Action执行业务逻辑,最后把业务逻辑的结果放到request中,并将页面请求转发给一个用于显示结果的jsp页面,这样,这个页面就可以少去很多的业务逻辑,而只是单纯的去显示一些业务逻辑计算结果的页面而已。这时的Action称为控制器,JSP页可以叫做视图了,而控制器操作的业务对象,无非就应该叫模型了!

从上面的话,我们来分析一下当我们要做一个分页时所需要的部分,而在这之前,我们先看看他们的执行过程吧,首先我们第一次请求访问一个页面,它会把所有记录的前N条显示给我们,之后计算是否有下一页,等类似的信息,当我们点下一页的时候,就获取下一页的信息,我们还可以添加一个搜索,比如我们用于显示学生的,可以安学生姓名查找,学号查找,班级查找。而对于显示的对象,我们一般也都会封装为javabean,所以用于放置查询结果的容器是不定的,而这时,我们就需要用泛型来提升我们的代码效率!

首先我们写一个用于分页显示的javabean: 更多详细内容 »

Tags:

作者:堕落天使

11

[codes=java]
package cn.com.lough.struts.action;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.commons.lang.RandomStringUtils;

/**
* MyEclipse Struts Creation date: 01-11-2007
*
* XDoclet definition:
*
* @struts.action validate="true"
*/
public class ValidatecodeAction extends Action {
 /*
  * Generated Methods
  */

 /**
  * Method execute
  *
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return ActionForward
  */
 public ActionForward execute(ActionMapping mapping, ActionForm form,
     HttpServletRequest request, HttpServletResponse response) {
   try {
     int width = 50;
     int height = 18;
     // 取得一个4位随机字母数字字符串
     String s = RandomStringUtils.random(4, true, true);
     
     // 保存入session,用于与用户的输入进行比较.
     // 注意比较完之后清除session.
     HttpSession session = request.getSession(true);
     session.setAttribute("validateCode", s);

     response.setContentType("images/jpeg");
     response.setHeader("Pragma", "No-cache");
     response.setHeader("Cache-Control", "no-cache");
     response.setDateHeader("Expires", 0);

     ServletOutputStream out = response.getOutputStream();
     BufferedImage image = new BufferedImage(width, height,
         BufferedImage.TYPE_INT_RGB);
     Graphics g = image.getGraphics();
     // 设定背景色
     g.setColor(getRandColor(200, 250));
     g.fillRect(0, 0, width, height);

     // 设定字体
     Font mFont = new Font("Times New Roman", Font.BOLD, 18);// 设置字体
     g.setFont(mFont);

     // 画边框
     // g.setColor(Color.BLACK);
     // g.drawRect(0, 0, width – 1, height – 1);

     // 随机产生干扰线,使图象中的认证码不易被其它程序探测到
     g.setColor(getRandColor(160, 200));
     // 生成随机类
     Random random = new Random();
     for (int i = 0; i < 155; i++) {
       int x2 = random.nextInt(width);
       int y2 = random.nextInt(height);
       int x3 = random.nextInt(12);
       int y3 = random.nextInt(12);
       g.drawLine(x2, y2, x2 + x3, y2 + y3);
     }

     // 将认证码显示到图象中
     g.setColor(new Color(20 + random.nextInt(110), 20 + random
         .nextInt(110), 20 + random.nextInt(110)));

     g.drawString(s, 2, 16);

     // 图象生效
     g.dispose();
     // 输出图象到页面
     ImageIO.write((BufferedImage) image, "JPEG", out);
     out.close();
   } catch (Exception e) {
     e.printStackTrace();
   }
   return null;
 }

 private Color getRandColor(int fc, int bc) { // 给定范围获得随机颜色
   Random random = new Random();
   if (fc > 255)
     fc = 255;
   if (bc > 255)
     bc = 255;
   int r = fc + random.nextInt(bc – fc);
   int g = fc + random.nextInt(bc – fc);
   int b = fc + random.nextInt(bc – fc);
   return new Color(r, g, b);
 }
}
[/codes]


jsp页面的调用
<html:img page="/validatecode.do" border="0" onclick="this.src='/validatecode.do'" alt="请输入此验证码,如看不清请点击刷新。" style="cursor:pointer" />

Tags:

作者:堕落天使

09
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package cn.org.jock.http.listener;
 
import java.util.Hashtable;
import java.util.Iterator;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* @author jock
*
*/
public class SessionListener implements HttpSessionListener {
 // 集合对象,保存session 对象的引用
 static Hashtable<String,HttpSession> ht = new Hashtable<String,HttpSession>();
 // 实现HttpSessionListener接口,完成session创建事件控制
 public void sessionCreated(HttpSessionEvent arg0) {
   HttpSession session = arg0.getSession();
   ht.put(session.getId(), session);
   System.out.println("create session :" + session.getId());
 }
 
 // 实现HttpSessionListener接口,完成session销毁事件控制
 public void sessionDestroyed(HttpSessionEvent arg0) {
   HttpSession session = arg0.getSession();
   System.out.println("destory session :" + session.getId());
   ht.remove(session.getId());
 }
 
 // 返回全部session对象集合
 
 static public Iterator getSet() {
   return ht.values().iterator();
 }
 
 // 依据session id返回指定的session对象
 static public HttpSession getSession(String sessionId) {
   return (HttpSession) ht.get(sessionId);
 }
 
}

别忘了在web.xml里加上
<listener>
   <listener-class>cn.org.jock.http.listener.SessionListener</listener-class>
</listener>

有了这个就可以方便的做很多事了,统计在线人数、在线列表、用户单一登陆等等,自己扩展吧。

Tags: , ,

作者:堕落天使

07

LIST页面
<logic:iterate id="item" name="list" scope="request"  indexId="indexid" offset="0">
 <tr>
   <td height="30" align=center>${pageScope.indexid+1}</td>
   <td align=center><a href='${ad.url}' target=_blank>${item.url}</a> </td>
   <td align=center>${item.budget}</td>
   <td align=center>${item.pvmin}</td>
   <td align=center>${item.consumeall}元/${ad.pvall}次</td>
   <td align=center>${item.consumeday}元/${ad.pvday}次</td>
   <td align=center>
   <html:link page="/manage.do" paramId="id" paramName="item" paramProperty="adid">编辑</html:link>
   <html:link page="/delete.do" paramId="id" paramName="item" paramProperty="adid" onclick="return confirmDelete()">删除</html:link>
   </td>
 </tr>
</logic:iterate>


根据条件判断出哪个list
<logic:equal parameter="page" value="1">
<b>2006-12-1 至 2006-12-1 分日统计报告</b>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width="100%" borderColorLight=#cccccc
border=1>
 <TR>
   <TD width="20%" height="25" align="center" bgcolor="#cccccc"><B>日期</B></TD>
   <TD width="15%" align="center" bgcolor="#cccccc"><B>次数</B></TD>
   <TD width="25%" align="center" bgcolor="#cccccc"><B>金额</B></TD>
   <TD width="40%" align="center" bgcolor="#cccccc"><B>所属类别</B></TD>
 </TR>
 <TR>
   <TD width="8%" height="25" align="center"> </TD>
   <TD align="center"> </TD>
   <TD align="center"> </TD>
   <TD align="center"> </TD>
 </TR>
 <TR>
   <TD width="8%" height="25" align="center" bgcolor="#f0f0f0"> </TD>
   <TD align="center" bgcolor="#f0f0f0"> </TD>
   <TD align="center" bgcolor="#f0f0f0"> </TD>
   <TD align="center" bgcolor="#f0f0f0"> </TD>
 </TR>
 <TR>
   <TD height="25" bgcolor="#f0f0f0"><B>总计</B></TD>
   <TD height="25" bgcolor="#f0f0f0"><B>0次</B></TD>
   <TD colSpan=1 rowSpan=2 bgcolor="#f0f0f0"><B>0元</B></TD>
   <TD colSpan=1 rowSpan=2 bgcolor="#f0f0f0"> </TD>
 </TR>
</TABLE>
</logic:equal>

LIST页面嵌套2层循环
grouplist是一个java.util.List<Group>  
clientlist是Group中的一个变量,类型也是一个List,以下内容是显示grouplist中的内容并将group中的每个client也显示。
<logic:iterate id="group" name="grouplist" scope="request"  indexId="indexid" offset="0">
<!– 第一层循环grouplist –>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
 <tr bgcolor="#f0f0f0" height=24>
   <td width="70%" height="25" align="left" bgcolor="#cccccc">&nbsp;&nbsp;&nbsp;${group.groupname}&nbsp;&nbsp;&nbsp;</td>
   <td width="30%" align="right" bgcolor="#cccccc">
     <a href="#">改名</a>
     <html:link page="/deletegroup.do" paramId="id" paramName="group" paramProperty="groupid" onclick="return confirmDelete()">删除</html:link>&nbsp;&nbsp;
   </td>
 </tr>
</table>
<table width=100% border=0 cellpadding="3" cellspacing="1">
 <logic:iterate id="client" name="group"  property="clientlist" type="java.util.Vector" offset="0">  <tr>
<!– 第二层循环clientlist –>
   <td width=100%>&nbsp;&nbsp;
     <html:multibox property="selecteduserids">
      ${client.value}
     </html:multibox>
     <a href='client_info.jsp?aid=${client.value}' target=_blank>${client.label}</a>
   </td>
 </tr>
 </logic:iterate>
 </table>
<br>
</logic:iterate>




一个form里有多个submit时 ,action里如何判断来自哪个submit提交的
<html:submit property="dosubmit" value=" 生成订单 "/>

if (request.getParameter("dosubmit") != null) {
 。。。
}


表单中部分内容是根据用户状态动态生成的时,将生成的方法写在reset方法里
   public void reset(ActionMapping mapping, HttpServletRequest request) {
       provinceSelect = ProvinceSelect.getProvinceSelect();
       this.manageid = -1;
       this.province = "";
       // this.groupid = -1;
       this.selectedProduct = null;
       Account a = (Account) request.getSession().getAttribute("user");
       if (a != null) {
           ManageSelect ms = new ManageSelect(a.getIAccountId());
           this.setManageSelect(ms.getManageSelect());
           GroupSelect gs = new GroupSelect(a.getIAccountId());
           this.setGroupSelect(gs.getGroupSelect());
           ProductSelect ps = new ProductSelect();
           this.setProductSelect(ps.getProductSelect(a.getCProduct()));
       }
   }


要使用validation.xml验证,form类要继承org.apache.struts.validator.ValidatorForm
同时form类里没有validate验证方法。
个人认为validation只做一些书写规则的校验,例如非空、数字之类的,
action里调用一些业务逻辑的校验,最好将校验规则也脱离action单独出来。

select、checkbox和raido的动态显示
以下property中的元素都是LabelValueBean的形式
select的最简单
<html:select property="groupid">
<html:optionsCollection property="groupSelect"/>
</html:select>


radio的
<logic:iterate id="manage" name="accountForm" property="manageSelect" indexId="indexid" offset="0">
   <html:radio property="manageid" value="${manage.value}"/>${manage.label}
</logic:iterate>

checkbox的
在formbean中selectedProduct是一个value形式的数组,内容是页面被选中的这些元素的value。
<logic:iterate id="product" name="accountForm" property="productSelect" indexId="indexid" offset="0">
     <html:multibox property="selectedProduct">
     ${product.value}
     </html:multibox>
     ${product.label}
</logic:iterate>

如果需要确省选中某项只要在reset方法里给对应的form里的变量赋上要选中项的value值就行了。

作者:堕落天使

04

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC
         "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
         "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>
 <formset>
   <form name="loginForm">
     <field depends="required,email" property="email">
       <msg name="required" key="error.required"/>
       <arg0 key="用户名" resource="false"/>
       <msg name="email" key="errors.email"/>
     </field>
     <field depends="required,minlength,maxlength" property="password">
       <msg name="required" key="error.required"/>
       <arg0 key="密码" resource="false"/>
       <msg name="minlength" key="errors.minlength"/>
       <arg0 key="密码" resource="false"/>
       <arg1 name="minlength" key="${var:minlength}" resource="false"/>
       <var>
         <var-name>minlength</var-name>
         <var-value>8</var-value>
       </var>
       <msg name="maxlength" key="errors.maxlength"/>
       <arg0 key="密码" resource="false"/>
       <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
       <var>
         <var-name>maxlength</var-name>
         <var-value>16</var-value>
       </var>
     </field>
   </form>
 </formset>
</form-validation>


<arg0 key="密码" resource="false"/>指定传给消息文件ApplicationResources.properties文件的对应域的第一个参数内容,resource="false" 不从资源文件读取,相当于直接将“密码”当作第一个参数。

Tags:

作者:堕落天使

04

Struts In Action完整pdf下载

StrutsinAction.rar

Tags:

作者:堕落天使

十二 29

    Struts提供了五个标签库,即:HTML、Bean、Logic、Template和Nested。
标签库
 说明

HTML 标签  用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单
Bean 标签  在访问JavaBeans 及其属性,以及定义一个新的bean 时使用
Logic 标签  管理条件产生的输出和对象集产生的循环
Template 标签  随着Tiles框架包的出现,此标记已开始减少使用
Nested 标签  增强对其他的Struts 标签的嵌套使用的能力

标签的公共特征

使用固定属性名称的Struts 标签:
属性
 说明

id  命名自定义标签创建时的脚本变量名。
name  指出关键字值,在该关键字下可以找到一个存在的bean 。如果给出了scope属性,则仅仅在scope中查找。否则,根据标准的顺序在各种scope中查找:(page, request, session, or application)。
property  指出bean 中的某个属性,可以在其中检索值。如果没有标明,则使用对象本身的值。
scope  定义了Bean在哪个范围(page, request, session, or application)中被查找。如果没有标明按顺序查找。脚本变量(见id)将在相同的范围中创建。

Struts 标签也支持嵌套引用,例如:
Property="foo.bar.baz"

这相当于进行下面的调用:
getFoo().getBar().getBaz();

或者做为setter:
getFoo().getBar().setBaz(value);

虽然Struts 标签的设计原意是为了避免使用scriptlet,scriptlet的表达式还能够提供给所有的Struts 标签使用。但请确保使用完整的表达式:

错误:
<html:link href="'<%= "/" + name %>/index.jsp>'>

正确:
<html:link href="'<%= "/" + name + "/index.jsp" %>'>    // 表达式必须提供整个属性值

更多详细内容 »

作者:Jock

十二 28

Danilo Gurovich (dan@gurovich.com), 首席工程师, Earthlink Inc.
2005 年 11 月 28 日
Struts Recipes 的合著者 Danilo Gurovich 从 George Franciscus 停止的地方开始,介绍了易于使用的创建动态选择复选框的 Struts 诀窍。

在用户界面设计中,复选框组不如它的同类 —— 多行选择框那样流行。它们基本上做的是同一件事,即选择映射到单一 name 属性的一组选项。当在组中使用时,复选框执行的功能实际与多行选择框一样,但是它们占据的屏幕空间更多。当希望用户在选择一个或多个选项之前能够看到所有选项的时候,这会很有好处。

虽然在选项不多的时候,多行选择框通常提供更好的观感,但是当选择框必须动态呈现而且包含预选功能时,对企业应用程序来说复选框组会是更好的选择。幸运的是,使用 Struts 框架可以很容易地创建动态复选框组。

在这篇文章中,我将介绍一个简单的诀窍:用 Struts 的 <html:multibox/> 和 <logic:iterate/> 标记在应用程序的视图层呈现大量条目,在本例中是 Java™ Server Page(JSP)。

我先从使用复选框元素显示简单的 String[] 数组开始,数组中包含喜玛拉雅山的顶峰高度。然后,我将创建另外一个 String[] 数组,包含 selectedMountains ,代表已经选中的复选框。复选框的预选情况会在两个数组的交叉中产生。如果 selectedMountains 的初始数组为空,那么所有复选框最初都会显示为未选中。

请参阅 下载 获得完整的示例源代码。应当拥有跟随本文所需要的每样东西。如果需要下载 Struts 框架,请参阅 参考资料。

创建动态复选框

创建动态复选框的诀窍包含三个主要部分:

一个表单 bean,容纳复选框的 String[] 数组和表示选中复选框的 String[] 数组。

一个 JSP,带有一个表单,在需要的时候显示复选框。

一个简单的 Action 类,从表单页面转到显示页面。
请注意 “Himalayas” 示例非常简单。用来填充复选框的字段应当来自更复杂的模型,比如这样的模型,它能够标识用户,并选择要显示的字段,然后把业务对象认为需要的选项预先选中。我采用简单的模型是为了更好地演示 Struts 的用户界面功能。代码示例使用 JSP 脚本语言是为了表示清楚。

第 1 步. 创建表单 bean

我先从创建 Struts 表单 bean 开始,它包含填充复选框所需要的信息。请注意清单 1 中的 TestForm.java 包含了两个示例 String[] 数组变量的 getter 和 setter。数组 mountains 代表示例复选框的 全部选项,数组 selectedMountains 代表预选的在浏览器中显示为选中的元素。

除了代表初始选中的复选框,selectedMountains 还代表处理表单时,由用户选中的复选框。(它只代表最终选中的元素。)当请求页面时,会显示复选框。当我在它们之间迭代时,与 selectedMountains 匹配的复选框元素就是选中的元素。

清单 1 显示了 TestForm.java 的完整代码:

清单 1. TestForm.java 更多详细内容 »

作者:Jock

十二 27

html:options是Struts中比较复杂的一个tage lib,用法灵活,但是Sturts提供的源码exercise taglib中没有提出常用jsp+ActionForm这样形式的最直接的总结,现从中总结如下,分两种情况:数组和Collection。
需求,要达到:
<select name="beanCollectionSelect" multiple="multiple" size="10">
  <option value="Value 0">Label 0</option>
  <option value="Value 1" selected="selected">Label 1</option>
  <option value="Value 2">Label 2</option>
  <option value="Value 3" selected="selected">Label 3</option>
  <option value="Value 4">Label 4</option>
  <option value="Value 5" selected="selected">Label 5</option>
  <option value="Value 6">Label 6</option>
  <option value="Value 7">Label 7</option>
  <option value="Value 8">Label 8</option>
  <option value="Value 9">Label 9</option>
</select>

要实现上述效果,需要两步:
第一:设置ActionForm,
也分两小步:第一小步必须在ActionForm中,有一句
private Collection beanCollection;
public Collection getBeanCollection();

Collection beanCollection要确保是一个实现,如ArrayList,如果不是则会报No collection found的错误,Struts的最大不方便就是一旦出问题,定位很难,不知道什么地方使用错误,或忘记设置什么了。

因为前面需求中option的value值和label值不一样,那么在beanCollection中保存的就是一个value和label组成的对象,名为LabelValueBean,在LabelValueBean中有两个属性value和label,

在程序某个地方要为beanCollection赋值,如:

Vector entries = new Vector(10);
entries.add(new LabelValueBean("Label 0", "Value 0"));
entries.add(new LabelValueBean("Label 1", "Value 1"));
entries.add(new LabelValueBean("Label 2", "Value 2"));
entries.add(new LabelValueBean("Label 3", "Value 3"));
entries.add(new LabelValueBean("Label 4", "Value 4"));
entries.add(new LabelValueBean("Label 5", "Value 5"));
entries.add(new LabelValueBean("Label 6", "Value 6"));
entries.add(new LabelValueBean("Label 7", "Value 7"));
entries.add(new LabelValueBean("Label 8", "Value 8"));
entries.add(new LabelValueBean("Label 9", "Value 9"));

然后执行setBeanCollection(entries);
这样ActionForm中的beanCollection算有值了。
第二小步,需要设置Selected,selected有两种,单选和多选:
在ActionForm中必须有:

private String singleSelect = "Single 5";
public String getSingleSelect() {
  return (this.singleSelect);
}
public void setSingleSelect(String singleSelect) {
 this.singleSelect = singleSelect;
}
或多选,多选必须是数组:

private String[] beanCollectionSelect = { "Value 1", "Value 3", "Value 5" };
public String[] getBeanCollectionSelect() {
  return (this.beanCollectionSelect);
}
public void setBeanCollectionSelect(String beanCollectionSelect[]) {
  this.beanCollectionSelect = beanCollectionSelect;
}


第二:在Jsp中写入tang lib语句如下:

<html:select property="beanCollectionSelect" size="10" multiple="true">
<html:optionsCollection name="testbean" property="beanCollection"/>
</html:select>
其中testbean是ActionForm的名称。

以上是html:options的Collection解决方案,如果option值很少,简单地可以实现为数组,两步:
第一:在ActionForm中,

private String values[] = { "Magazine", "Journal", "News Paper","Other" };
private String labels[] = { "L-Magazine", "L-Journal", "L-News Paper","L-Other"};
private String selected = "Magazine";
public String getSelected(){
  return selected;
}
public void setSelected(String selected){
  this.selected = selected;
}
public String[] getValues(){
  return values;
}
public void setValues(String[] values){
  this.values = values;
}
public String[] getLabels(){
  return values;
}
public void setLabels(String[] labels){
  this.labels = labels;
}

第二步在jsp中:


<html:select property="selected" >
<html:options name="testbean" property="values" labelProperty="label"/>
</html:select>

作者:Jock

Switch to our mobile site