- 浏览: 643512 次
- 性别:
- 来自: 北京
-
最新评论
-
2047699523:
java hibernate demo使用实例教程源代码下载: ...
hibernate延迟加载的原理与实现 -
在世界的中心呼喚愛:
hantsy 写道这种lazy的解释只对了一半,按java p ...
hibernate延迟加载的原理与实现 -
moguicy:
看了下时间,不是楼主是否还在开发
【翻译】Wicket启示录——理论与实践(一) -
xfan0828:
"最后但并不是最不重要的一点就是" BZ, ...
【翻译】深入浅出 EJB3.1(上) -
doudou87323:
十分感谢,正在学习中,受益匪浅
【翻译】深入浅出 EJB3.1(上)
接下来,我们再看看EditContact类,把新建联系人的话和编辑联系人也给实现了,开始吧:
public class EditContact extends BasePage {
public EditContact() {
setModel(new CompoundPropertyModel(new LoadableDetachableModel() {
protected Object load() {
return new Contact();
}
}));
init();
}
public EditContact(final Long contactId) {
setModel(new CompoundPropertyModel(new LoadableDetachableModel() {
protected Object load() {
return WicketApplication.get().getContactDao().get(contactId);
}
}));
init();
}
private void init() {
add(new FeedbackPanel("feedback"));
add(new ContactForm("form", getModel()));
}
private class ContactForm extends Form {
public ContactForm(String id, IModel m) {
super(id, m);
TextField firstName = new TextField("firstName");
firstName.setRequired(true);
firstName.add(StringValidator.maximumLength(15));
add(firstName);
TextField lastName = new TextField("lastName");
lastName.setRequired(true);
lastName.add(StringValidator.maximumLength(20));
add(lastName);
TextField email = new TextField("email");
email.add(StringValidator.maximumLength(150));
email.add(EmailAddressValidator.getInstance());
add(email);
TextArea notes = new TextArea("notes");
notes.add(StringValidator.maximumLength(500));
add(notes);
DropDownChoice group = new DropDownChoice("group");
group.setChoices(new AbstractReadOnlyModel() {
public Object getObject() {
List<String> l = new ArrayList<String>(3);
l.add("Friend");
l.add("Co-Worker");
l.add("Nemesis");
return l;
}
});
add(group);
add(new Button("save") {
public void onSubmit() {
Contact c = (Contact) getForm().getModelObject();
WicketApplication.get().getContactDao().save(c);
setResponsePage(ListContacts.class);
}
});
add(new Button("cancel") {
public void onSubmit() {
setResponsePage(ListContacts.class);
}
}.setDefaultFormProcessing(false));
}
}
}
EditContact类的两个构造函数就可以搞定编辑功能。第一个构造函数不带任何参数,目的是用来创建一个新的联系人。即使是新建一个新实体,这里我们仍然可以使用LoadableDetachableModel类来返回一个new Contact。因为当page存储在PageMap中时,LoadableDetachableModel会确保CompoundPropertyModel不去serialize (序列化)一个数据库中不存在的对象。因此,在这里对要新建的对象设置一些默认值是非常不错的选择,比如我们可以对Contact设置一个默认的Group。
第二个构造函数将Contact的主键id作为参数,从数据库读取该对象后,进行相应的编辑操作。构造函数里还调用了init()方法。该方法很简单,加入了一个FeedbackPanel组件,并且将得到的Contact模型绑定到Form上去。FeedbackPanel是Wicket的一个消息反馈组件,比如说如果用户没有输入用户名,那么后台就会将错误信息通过它来显示到前台页面上。用法与其它组件一样,在markup文件标记下:
<span wicket:id="feedback"></span>
任何验证错误信息都可以通过HTML的<span>元素显示出来.你可以反馈你更希望使用什么风格显示你的错误信息,但那是后话了.
看看Contact的firstName属性所对应的TextField组件设置:
TextField firstName = new TextField("firstName");
firstName.setRequired(true);
firstName.add(StringValidator.maximumLength(15));
add(firstName);
看到了吗,我们在这里设置了Contact的firstName属性所对应的TextField输入的字符串长度不能超过15.别的组件也用了类似的验证,原理是一样的.最后还有一个需要注意的组件是DropDownChoice.它专门用来显示HTML的select元素.在我们的例子中,通过使用DropDownChoice的setChoices()方法将我们Contact的group属性列表值显示在HTML上了:
DropDownChoice group = new DropDownChoice("group");
group.setChoices(new AbstractReadOnlyModel() {
public Object getObject() {
List<String> l = new ArrayList<String>(3);
l.add("Friend");
l.add("Co-Worker");
l.add("Nemesis");
return l;
}
});
上面代码中用到的AbstractReadOnlyModel也是IModel的实现之一,将返回的String列表填充到select元素的option中去,生成的HTML片断如下:
<select>
<option value="Friend">Friend</option>
<option value="Co-Worker">Co-Worker</option>
<option value="Nemesis">Nemesis</option>
</select>
上的例子有点简单,其实DropDownChoice在IChoiceRenderer的帮助下,也可以支持很丰富的自定义对象,那么我也演示一下吧:
public class Group {
private String name;
public Group(String name) {
setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
好的,我们将原来的代码改动一下,请注意看下面:
DropDownChoice group = new DropDownChoice("group");
group.setChoices(new AbstractReadOnlyModel() {
public Object getObject() {
List<Group> l = new ArrayList<Group>(3);
l.add(new Group("Friend"));
l.add(new Group("Co-Worker"));
l.add(new Group("Nemesis"));
return l;
}
});
group.setChoiceRenderer(new IChoiceRenderer() {
public Object getDisplayValue(Object o) {
Group g = (Group) o;
return g.getName();
}
public String getIdValue(Object o) {
Group g = (Group) o;
return g.getName();
}
});
IChoiceRenderer接口允许开发人员决定select元素的option中text,value属性分别是什么.如果你先前用过其它web框架的select元素列表,你会发现Wicket做的比其它都要棒。
最后是两个Button组件:
add(new Button("save") {
public void onSubmit() {
Contact c = (Contact) getForm().getModelObject();
WicketApplication.get().getContactDao().save(c);
setResponsePage(ListContacts.class);
}
});
add(new Button("cancel") {
public void onSubmit() {
setResponsePage(ListContacts.class);
}
}.setDefaultFormProcessing(false));
第一个button是用来保存contact模型后跳转到ListContacts页面.第二个button是用来取消对contact模型的编辑,直接跳转回ListContacts页面.两个button的不同之处在于,除了两个不同的onSubmit()行为事件外,还对cancel button调用setDefaultFormProcessing(false)方法,这样当单击cancel button后,不会执行Form体代码,即上述那些验证,更新Contact模型的操作全部跳过,直接返回ListContacts页面.当单击submit button后,Wicket会经过以下几个步骤:
l 进行输入验证
l 如果输入有效,就将输入值更新相应的模型对象.
l 执行onSubmit()方法.
如果你不想处更新型对象,不想进行什么验证.那好,为你的form加上一个cancel button,非常简单,不需要什么复杂的逻辑处理.
EditContact类也看完了,最后再看一遍相应的markup文件.这一回,你再看markup文件,应该不吃力了吧:
<wicket:extend>
<span wicket:id="feedback"></span>
<form wicket:id="form">
<div id="contacts">
<div class="contact">
<table>
<tr>
<td>
First Name
</td>
<td>
<input wicket:id="firstName" type="text"/>
</td>
</tr>
<tr>
<td>
Last Name
</td>
<td>
<input wicket:id="lastName" type="text"/>
</td>
</tr>
<tr>
<td>
Email
</td>
<td>
<input wicket:id="email" type="text" size="40"/>
</td>
</tr>
<tr>
<td>
Notes
</td>
<td>
<textarea wicket:id="notes" rows="4" cols="40"></textarea>
</td>
</tr>
<tr>
<td>
Group
</td>
<td>
<select wicket:id="group"> </select>
</td>
</tr>
<tr>
<td colspan="3" align="center">
<input wicket:id="save" type="submit" value="Save"/>
<input wicket:id="cancel" type="submit" value="Cancel"/>
</td>
</tr>
</table>
</div>
</div>
</form>
</wicket:extend>
wicket:id属性加上HTML元素就可完全符号我们的Wicket组件.用户只要填写form表单,单击save button就可以创建或更新他的联系人;如果想取消的话,单击cancel按钮,就可以放弃所做的修改,回到联系人列表.
这样完整的实例为我们揭示了Apache的Wicket框架.虽然我们谈的比较基础,但所有的一切完全可以应用到你的Wicket web应用程序中去.
总结
文章已经向你介绍了Wicket的核心概念,并且通过一个完整的实例帮助你巩固它们.致使Wicket成功的核心概念其实就是组件和模型.
组件就是独立的Java代码块和与它配对的markup文件.大多数组件被设计成抽象类,你可以扩展相应的子类,来满足你的领域特定逻辑和需求,如上面用到的Page, Panel, Link, Form和ListView都是如此.
模型作为领域对象与Wicket组件之间的桥梁.模型可以有很多特性,可以最大化功能化.理想情况下,你的组件应该永远通过模型来访问你的领域对象.
我希望你们会喜欢这篇文章,并且它使得你愿意研究Wicket的更多细节,我觉得我已经找到了一个非常具备高效生产力的框架.
全文完
评论
发表评论
-
【翻译】深入浅出 EJB3.1(下)
2009-05-07 23:37 8995Global JNDI names( 统一的 全局 ... -
【翻译】深入浅出 EJB3.1(上)
2009-05-06 20:59 11244终于有空将EJB3.1的最新文章与大家分享,原文请看: ht ... -
【翻译】Java EE 6体系结构的变革
2009-02-09 10:01 4603又看到 Reza 同学为 -
【翻译】Java EE 6体系结构的变革(完)
2009-02-09 10:00 6519JSF 2.0 尽� ... -
垃圾收集器是一个“宝贝收藏家”?
2008-11-25 23:58 3122原文请看:http://java.dzone.com/ar ... -
深入理解JBoss Cache3.0——Naga
2008-11-12 09:12 9795原文请看: http://java.dzone.com/ ... -
【翻译】Rod Johnson——关于当选JCP执行委员会的之言片语
2008-11-03 10:42 3235SpringSource 在上月底被宣布被加入 JCP ... -
【翻译】EJB3.1真的来了吗?EJB3.1系列文章(五) 终章
2008-10-16 14:37 9318历时9 个多月的EJB3.1 系列文章终于要划上圆满的句 ... -
【翻译】Rod Johnson——平衡的质疑:Spring维护策略的再次调整(完)
2008-10-09 09:33 4138不管你承不承认,Spring实际上已经是实事上JAVA企业开 ... -
【云计算专家Joseph Ottinger系列】应用服务器本质论
2008-09-08 08:58 3513原文请看: http://www.t ... -
Spring破坏了JEE规范吗?
2008-09-02 13:33 4135[TTS 编辑注:这是 TTS 论坛上的原帖。我现在把它 ... -
【翻译】spring配置全书(下)——附PDF完整版下载
2008-07-14 12:30 10904JMS 命名空间简介 Schema URI ... -
【翻译】spring配置全书(上)
2008-07-07 23:11 9023作者简介: Craig Walls 是 Texa ... -
【翻译】EJB3.1真的来了吗?EJB3.1系列文章(四)
2008-06-18 23:10 38261前言 Raza 同学终于又出 EJB3.1 文章了 ... -
【翻译】Rod Johnson——Spring的宣言:开源,开放(完)
2008-06-10 16:51 5653前言 这是本文的第二部分,里面提到并回答许多Spring用 ... -
【翻译】Rod Johnson——Spring的宣言:开源,开放
2008-06-06 13:06 6187原文地址: http://blog.sp ... -
【翻译】EJB3.1真的来了吗?EJB3.1系列文章(三)
2008-05-01 13:53 8917文本继续和大家分享EJB3.1特性,今天谈到的EJB Lite ... -
【Danny hui】运用抽象工厂模式自己动手写一个IoC
2008-04-23 16:34 6408本文的作者Danny hui似乎是TTS上的新人,我从Goog ... -
【翻译】Wicket启示录——理论与实践(二)
2008-04-09 23:47 5963第二部分 实践 Application(应用程序) 与 ... -
【翻译】Wicket启示录——理论与实践(一)
2008-04-09 23:15 6876序 Wicket,当多数人看到它时,也许又是带着惯性思考 “j ...
相关推荐
博文链接:https://superleo.iteye.com/blog/181053
scratch少儿编程逻辑思维游戏源码-足球冠军.zip
实训商业源码-【超人】积分商城 5.2.26-毕业设计.zip
windows,C# WInform,Excel操作类
这个函数可以直接把tdms文件的数据直接储存为MAT文件,并显示在工作区.具体的使用教程可以参考这篇文章。https://blog.csdn.net/weixin_41968197/article/details/106287744
φ3.2m两段式煤气发生炉CAD工艺流程图.rar
实训商业源码-daohang-毕业设计.zip
内容概要:文章深入探讨了在汽车电子电气架构中,网关ECU采用多CPU解决方案实现网关功能的技术背景、设计原则、挑战与解决方案、典型场景及其未来发展趋势。随着汽车电子电气架构向高集成化、智能化发展,网关ECU需处理复杂的多协议数据转发、协议转换、安全过滤等任务,单CPU难以满足需求。多CPU解决方案通过合理的架构设计,确保满足时延、吞吐量、资源管理等核心要求。文中详细介绍了多CPU架构的核心设计原则,包括内部接口设计、资源协同与容错设计,并针对典型场景提出了具体解决方案。此外,文章还讨论了多CPU架构面临的挑战及应对策略,并展望了未来的发展趋势,如异构计算融合、区域网关、确定性以太网等。; 适合人群:从事汽车电子工程领域的工程师和技术人员,尤其是对网关ECU设计和多CPU架构感兴趣的读者。; 使用场景及目标:①理解网关ECU中多CPU解决方案的必要性和优势;②掌握多CPU架构设计的关键技术和最佳实践;③了解多CPU架构在汽车电子电气架构中的应用前景和发展方向。; 其他说明:本文不仅提供了技术层面的深度解析,还强调了长期主义的重要性,鼓励读者在技术追求的同时保持对自身成长的关注。
实训商业源码-ddos压力测试-毕业设计.zip
JavaScript语言教程&案例&相关项目资源,奖励仅限VIP资源
实训商业源码-超级图文最新资源包及上传位置说明-毕业设计.zip
X-Y数控工作台机电系统设计.rar
实训商业源码-活码自动进群V1.0.0 开源版-毕业设计.zip
YZ8H压路机振动轮设计.rar
PE400x600复摆颚式破碎机设计.rar
scratch少儿编程逻辑思维游戏源码-像素森林.zip
scratch少儿编程逻辑思维游戏源码-躁狂症 RPG游戏.zip
scratch少儿编程逻辑思维游戏源码-战争模拟器(1).zip
内容概要:本文详细介绍了如何使用C# WinForm开发一个纯原生的工作流表单设计器,涵盖动态控件生成、拖拽移动、对齐辅助线、属性调整等功能模块。作者通过具体代码示例展示了如何利用鼠标事件、坐标计算、绘图API等技术手段实现这些功能。文中还提供了扩展功能的方向,如控件Tag属性存储业务数据、自定义控件外观、XML序列化保存流程图结构等。 适合人群:具有一定C#编程基础,尤其是对WinForm开发感兴趣的开发者。 使用场景及目标:适用于需要快速构建可视化工作流表单的应用场景,目标是掌握WinForm的事件机制、GDI+绘图以及控件管理等核心技术。 其他说明:本文强调了纯原生开发的优势,即不需要依赖第三方库,所有功能均由系统自带组件实现,有助于深入理解底层机制并提高代码可控性和灵活性。
内容概要:本文深入探讨了无人驾驶车辆使用动力学MPC(模型预测控制)算法进行蛇形线路径跟踪的技术细节。首先介绍了蛇形线的特点及其对无人驾驶车辆带来的挑战,随后详细讲解了动力学MPC算法的基础理论,包括车辆状态表示、运动方程建模以及控制输入的选择。接着重点阐述了如何通过定义合适的目标函数并加入适当的约束条件来优化MPC算法,使其能够高效地完成蛇形线路径跟踪任务。此外,文中还讨论了一些常见的错误做法和技术改进措施,如引入航向角误差补偿项、采用松弛变量处理约束条件等。最后,作者分享了多个实用的小技巧,例如预测时域内的速度适配和平滑处理、适当降低控制频率以提高跟踪精度等。 适合人群:对无人驾驶技术和控制算法感兴趣的科研人员、工程师及高校学生。 使用场景及目标:适用于研究无人驾驶车辆路径规划与控制领域的项目开发,旨在帮助读者掌握动力学MPC算法的具体应用方法,从而更好地解决实际工程问题。 其他说明:文章不仅提供了详细的理论推导和代码实现,还结合具体案例进行了充分的实验验证,确保所提出的解决方案具有较高的可行性和可靠性。