eXtremeConponent's Form指南

 

1. 引言

eXtremeTable本质上是一个form组件,所以我假定表被包在form里,所有的功能都被认为是对form元素的操作。如果你想在表体中包含一些定制的form元素,或者想将eXtremeTable嵌入到另外的form中,那么你就要使用表标签的form属性用来参照最近的form。

为了示范form特性,我们要做的工作将分解为JSP,Cell和Controller。

1.1. JSP

下面列出的是checkbox示例的完整代码。想要强调的主要事情是表标签form属性设置为presForm,它参照被称为presForm的form元素。

同时请注意表标签的autoIncludeParameters属性。进行排序、过滤、分页时,默认的eXtremeTable将保持所有传至JSP页面的参数。这个特性对于内部其他的form进行排序、过滤、分页时,用于高效复制form元素同样有效。可以设置 autoIncludeParameters属性为false来固定它。

在这个form使用id属性是因为xhtm标准的要求,同时你也可以使用form的name属性。

<form id="presForm" action="<c:url value="selectedPresidentsListedController.run"/>" method="post">

Enter your name:

<input

type="text"

name="userName"

style="font-family:verdana,arial,helvetica,sans-serif;font-size:11px;"

value="<c:out value="${param.userName}"/>"

/>

<ec:table

items="presidents"

action="${pageContext.request.contextPath}/selectedPresidentsController.run"

view="compact"

imagePath="${pageContext.request.contextPath}/images/table/compact/*.gif"

rowsDisplayed="8"

autoIncludeParameters="false"

form="presForm"

>

<ec:exportPdf

fileName="output.pdf"

tooltip="Export PDF"

headerColor="black"

headerBackgroundColor="#b6c2da"

headerTitle="Presidents"

/>

<ec:row>

<ec:column

alias="checkbox"

title=" "

width="5px"

filterable="false"

sortable="false"

viewsAllowed="compact"

cell="selectedPresident"

/>

<ec:column property="fullName" title="Name"/>

<ec:column property="nickName" />

<ec:column property="term" />

</ec:row>

</ec:table>

<input

type="button"

name="sel"

class="button"

value="List Selected Presidents"

οnclick="document.forms.presForm.submit();"

/>

<script type="text/javascript">

function setPresidentState(chkbx) {

//make sure that always know the state of the checkbox

if (chkbx.checked) {

eval('document.forms.presForm.chkbx_' + chkbx.name).value='SELECTED';

} else {

eval('document.forms.presForm.chkbx_' + chkbx.name).value='UNSELECTED';

}

}

</script>

</form>

1.1.1. Form特性的技术说明

表标签form属性参照最近的form是你使用这个特性所必须知道的,为了更好的理解这个特性,介绍更多的关于内部实现技术的细节是值得的。

如果您不特意指定form属性,eXtremeTable自动在表附近包上一个form。所有表的动作例如:排序、过滤、分页将自动给一些隐藏的input元素赋值,然后提交这个form到表标签action属性设置的Aciton。这非常有效,除非您想要将自己的form元素设置到表体,或者想将这个表放到别的form里。

表标签form属性参照最近的form,所有表的动作例如:排序、过滤、分页将自动给一些隐藏的input元素赋值,但是现在最近form的action属性将要改变表标签的动作。这非常重要,因为:当排序、过滤、分页时,eXtremeTable能够从一个controller得到数据集合,但是提交这个form到别的controller来处理这个form时需要对用户的输入进行处理。然而,这些对于你使用表标签来说都是透明的。就像你现在做的那样简单地设置表标签的action属性,然后设置相关的form到你想提交的位置。

1.1.2. Checkbox

示例的第一列是checkbox。因为这列不需要参照bean的属性,alias属性用来唯一地标识这列。你可以使用property 属性,但是alias属性使这列如何使用更清楚。alias属性还被用来当同样的属性被多列使用时唯一地标识一列。

1.1.3. Custom Cell

您也许想知道定制的cell是如何通过名称selectedPresident被参照的(cell="selectedPresident")。这是一个对eXtremeTable的preferences特性更强的使用。所有要做的就是在extremecomponents.properties文件中添加一个属性。 请参考Preferences来了解更多的信息

column.cell.selectedPresident=org.extremesite.cell.SelectedPresidentCell

column.cell.selectedPresident就是你定义的用来参照这个cell的名称。

当然你也可以使用这个Cell的全名来进行参照。

<ec:column

alias="checkbox"

title=" "

width="5px"

filterable="false"

sortable="false"

viewsAllowed="compact"

cell="org.extremesite.cell.SelectedPresidentCell"

/>

在属性文件中定义参照更方便,它可以被任何JSP文件引用。如果类名或包名改变的话你只需要对一个地方进行修改。

1.1.4. JavaScript

JavaScript的setPresidentState()方法被定制cell用来设置每个checkbox元素的是否被选中。设置一个隐藏元素的原因是为了获得浏览器的动作而不提交没有选中的checkbox。通过这个Controller将一直知道一个元素是否别选中。

1.2. Cell

定制的cell被用来生成checkbox,另外它也创建一个隐藏元素用来表示这个checkbox元素是否被选中。当用户进行排序、过滤、分页时,被选中的数据集合将被放到session里。

getExportDisplay()方法没有返回值,因为治理只需要Html显示。

public class SelectedPresidentCell implements Cell {

public String getExportDisplay(TableModel model, Column column) {

return null;

}

public String getHtmlDisplay(TableModel model, Column column) {

HtmlBuilder html = new HtmlBuilder();

CellBuilder.tdStart(html, column);

try {

Object bean = model.getCurrentRowBean();

String presidentId = BeanUtils.getProperty(bean, "presidentId");

Collection selectedPresidentsIds = (Collection)model.getContext().getSessionAttribute(SelectedPresidentsConstants.SELECTED_PRESIDENTS);

if (selectedPresidentsIds != null && selectedPresidentsIds.contains(presidentId)) {

html.input("hidden").name("chkbx_" + presidentId).value(SelectedPresidentsConstants.SELECTED).xclose();

html.input("checkbox").name(BeanUtils.getProperty(bean, "presidentId"));

html.onclick("setPresidentState(this)");

html.checked();

html.xclose();

} else {

html.input("hidden").name("chkbx_" + presidentId).value(SelectedPresidentsConstants.UNSELECTED).xclose();

html.input("checkbox").name(BeanUtils.getProperty(bean, "presidentId"));

html.onclick("setPresidentState(this)");

html.xclose();

}

} catch (Exception e) {}

CellBuilder.tdEnd(html);

return html.toString();

}

}

1.3. Controller

提示:Spring框架的Controller和Struts框架的Action非常相像。

当在另外的form中使用eXtremeTable时,你可能有1个或2个controllers。当form被提交时,你需要一个controller 来处理用户的输入并重新定向到另外的JSP页面。当排序、过滤、分页时,你可能有另外的controller来得到表使用的数据集合并重定向会本页。或者你可以在同一个controller中分别处理。

checkbox示例里我使用一个controller来关联表标签的action属性。我也使用另外一个controller来关联form元素的动作。

1.3.1. 表标签动作Controller

这个controller负责调用SelectedPresidentsUtils来保存被选中的presidentIds到session里并回到同一页。

SelectedPresidentsUtils.saveSelectedPresidentsIDs(request);

Collection presidents = presidentsService.getPresidents();

request.setAttribute("presidents", presidents);

1.3.2. Form动作Controller

这个controller负责通过presidentIds得到数据集并重定向到下一个Jsp页面

Collection selectedPresidentsIds = SelectedPresidentsUtils.saveSelectedPresidentsIDs(request);

Collection selectedPresidents = SelectedPresidentsUtils.getSelectedPresidents(presidentsService.getPresidents(), selectedPresidentsIds);

request.setAttribute("selected", selectedPresidents);

request.getSession().removeAttribute(SelectedPresidentsConstants.SELECTED_PRESIDENTS);

1.3.3. 重新得到Checkbox的值

我将列出保存presidentIds到session的代码。我经常被问到如何重新得到eXtremeTable中form元素的值。它的原理是设置form输入元素名字属性值前面加上一些东西来唯一标识元素

本示例中我关心的是以chkbx开头参数的元素。chkbx后面是唯一的关联到checkbox的presidentId。它被用来判断这个checkbox是否别选中。

public static Collection saveSelectedPresidentsIDs(HttpServletRequest request) {

Collection presidents = (Collection) request.getSession().getAttribute(SelectedPresidentsConstants.SELECTED_PRESIDENTS);

if (presidents == null) {

presidents = new ArrayList();

request.getSession().setAttribute(SelectedPresidentsConstants.SELECTED_PRESIDENTS, presidents);

}

Enumeration parameterNames = request.getParameterNames();

while (parameterNames.hasMoreElements()) {

String parameterName = (String) parameterNames.nextElement();

if (parameterName.startsWith("chkbx_")) {

String presidentId = StringUtils.substringAfter(parameterName, "chkbx_");

String parameterValue = request.getParameter(parameterName);

if (parameterValue.equals(SelectedPresidentsConstants.SELECTED)) {

if (!presidents.contains(presidentId)) {

presidents.add(presidentId);

}

} else {

presidents.remove(presidentId);

}

}

}

return presidents;

}

 

源文档 <http://www.blogjava.net/lucky/archive/2006/02/19/31469.html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电子图书资源服务系统是一款基于 Java Swing 的 C-S 应用,旨在提供电子图书资源一站式服务,可从系统提供的图书资源中直接检索资源并进行下载。.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人系统开发经验充足,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(若有),项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注计算机领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能 【无积分此资源可联系获取】 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。积分/付费仅作为资源整理辛苦费用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值