Java 在Wicket中保存数据而不使用PropertyModels
我正在尝试使用Wicket和OrientDB构建一个web应用程序。我试图避免编写/维护一个平面Java类,将每个顶点类表示为POJO(如ORM)。相反,我将顶点本身一直发送到web层。我通过以下方式访问酒店:Java 在Wicket中保存数据而不使用PropertyModels,java,wicket,orientdb,Java,Wicket,Orientdb,我正在尝试使用Wicket和OrientDB构建一个web应用程序。我试图避免编写/维护一个平面Java类,将每个顶点类表示为POJO(如ORM)。相反,我将顶点本身一直发送到web层。我通过以下方式访问酒店: vertex.getProperty(“propertyName”) 这意味着属性本身不是Vertex的成员变量,因此不能通过普通的getter/setter访问。我遇到了Wicket的一个问题,因为许多组件依赖于“PropertyModel”样式的实现,在该实现中,您传入一个表示您正在
vertex.getProperty(“propertyName”)代码>
这意味着属性本身不是Vertex的成员变量,因此不能通过普通的getter/setter访问。我遇到了Wicket的一个问题,因为许多组件依赖于“PropertyModel”样式的实现,在该实现中,您传入一个表示您正在处理的类的一个成员变量的模型,并且数据存储在该成员变量中
我有一个数据视图,它将顶点的属性提取到标签和文本字段中
public VertexViewer(final PageParameters pageParameters, OrientVertex vertex)
this.vertex = vertex;
this.properties = this.vertex.getProperties();
List<String> keyList = new ArrayList<>();
keyList.addAll(this.vertex.getPropertyKeys());
final DataView<String> propertiesView = new DataView<String>("properties", new ListDataProvider<>(keyList)) {
@Override
protected void populateItem(Item item) {
String key = item.getModelObject().toString();
item.add(new Label("property_name", key));
item.add(new TextField<String>("edit_field", new Model<String>(properties.get(key).toString())));
}
};
add(propertiesViewer);
}
公共顶点查看器(最终页面参数页面参数,方向顶点)
这个顶点=顶点;
this.properties=this.vertex.getProperties();
List keyList=new ArrayList();
addAll(this.vertex.getPropertyKeys());
最终数据视图属性视图=新数据视图(“属性”,新列表数据提供程序(键列表)){
@凌驾
受保护的无效填充项(项){
String key=item.getModelObject().toString();
添加(新标签(“属性名称”,键));
添加(新文本字段(“编辑字段”),新模型(properties.get(key.toString()));
}
};
添加(propertiesViewer);
}
以及HTML:
<wicket:extend>
<div wicket:id="properties" style="display: table-row;">
<div wicket:id="property_name" style="display: table-cell;"></div>
<input wicket:id="edit_field" type="text" style="display: table-cell;"/>
</div>
</wicket:extend>
这正是我想要的呈现方式,但是有人对如何保存文本字段中正在更改的数据有什么建议吗?我不能像通常在表单上那样使用成员变量的模型,因为我永远不知道顶点中会有多少属性。我是不是完全错了?非常感谢您的帮助。请查看。
这个库的开发人员也创建了这个库,但是这个改进没有得到太多的支持。如果您认为有必要,请随意投票。因此,经过多次尝试和错误(主要是错误)后,我找到了一个解决Wicket的NoSQL缺陷的模式,它不涉及手动创建成员变量来建立模型 我从
vertex.getProperties()
获取贴图
,然后创建它的副本
private Map<String, Object> realProperties = baseVertex.getProperties();
private Map<String, Object> dummyProperties = new HashMap<>();
dummyProperties.putAll(realProperties);
private Map realProperties=baseVertex.getProperties();
私有映射dummyProperties=new HashMap();
dummyProperties.putAll(realProperties);
这允许我使用dummyProperties中的值作为模型来存储数据
List<String> keyList = new ArrayList<>();
keyList.addAll(getDummyProperties().keySet());
final DataView<String> propertiesView = new DataView<String>("properties", new ListDataProvider<>(keyList)) {
@Override
protected void populateItem(Item item) {
String key = item.getModelObject().toString();
item.add(new Label("property_name", key));
item.add(new TextField<String>("edit_field", new PropertyModel<String>(getDummyProperties(), key)));
}
};
List keyList=new ArrayList();
addAll(getDummyProperties().keySet());
最终数据视图属性视图=新数据视图(“属性”,新列表数据提供程序(键列表)){
@凌驾
受保护的无效填充项(项){
String key=item.getModelObject().toString();
添加(新标签(“属性名称”,键));
添加(新文本字段(“编辑_字段”,新属性模型(getDummyProperties(),key));
}
};
从那里,我将DataView放在一个带有AjaxButton的表单上,该按钮通过一些复杂的循环将文本字段中潜在的新值与原始值进行比较
AjaxButton saveButton = new AjaxButton("saveButton") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
super.onSubmit(target, form);
Map<String, Object> changedProperties = new HashMap<>();
// for each entry in the dummy values linked via PropertyModel to the TextField input
for (Map.Entry<String,Object> dummyEntry : getDummyProperties().entrySet()) {
// for each entry in the
for (Map.Entry<String,Object> realEntry : baseVertex.getProperties().entrySet()) {
// if the keys match
if (dummyEntry.getKey().equals(realEntry.getKey())) {
// if the value has changed
if (!dummyEntry.getValue().equals(realEntry.getValue())){
// value in textField differs from value in database
changedProperties.put(dummyEntry.getKey(),dummyEntry.getValue());
}
}
}
}
DBWorker worker = new DBWorker();
// perform the update
worker.updateVertex(recordID, changedProperties);
// pull the fresh vertex out and pass it to the page again
setResponsePage(new VertexViewer(new PageParameters(), new CustomVertex(worker.getVertexByID(recordID))));
}
};
AjaxButton saveButton=新的AjaxButton(“saveButton”){
@凌驾
提交时受保护的void(AjaxRequestTarget目标,表单){
super.onSubmit(目标、形式);
Map changedProperties=新HashMap();
//对于通过PropertyModel链接到TextField输入的虚拟值中的每个条目
对于(Map.Entry dummeyentry:getDummyProperties().entrySet()){
//对于中的每个条目
对于(Map.Entry realEntry:baseVertex.getProperties().entrySet()){
//如果钥匙匹配
if(dummeyentry.getKey().equals(realcentry.getKey())){
//如果值已更改
如果(!dummeyentry.getValue().equals(realEntry.getValue())){
//textField中的值与数据库中的值不同
changedProperties.put(dummeyEntry.getKey(),dummeyEntry.getValue());
}
}
}
}
DBWorker=新的DBWorker();
//执行更新
worker.updateVertex(记录ID,changedProperties);
//拉出新的顶点并再次将其传递到页面
setResponsePage(新的VertexViewer(新的PageParameters(),新的CustomVertex(worker.getVertexByID(recordID)));
}
};
最后,将根据旧值计算新值,将新值写回数据库,提取新顶点并调用一个新的ViewerPage,该ViewerPage接受更新的顶点作为参数
这可以按预期工作,对于顶点类/属性数是通用的,并且避免了我必须为每个顶点类维护ORM样式类。这看起来正是我所需要的。谢谢你提醒我这件事。但是我看不到一个我可以投票的地方?我想出来了。登记、投票并加入观察名单。谢谢。简而言之,有没有一种方法可以从for()循环中创建的模型中提取新数据,而无需为每个潜在数据段添加成员变量?