我有一个使用Spring和Hibernate的多个页面的工作表单,需要报告用户到目前为止完成的字段的进度(字段完成的百分比)。以下是我探讨的选项:
选项A) 检查模型上的每个属性是否有值。如果它不为null,则递增计数器,然后除以检查的属性总数。
选项B) 在模型对象上使用反射并调用每个getter。如果它不为空,则递增计数器,然后除以检查的属性总数以获得完成百分比。我正在思考this post的内容。
我知道选项B)的成本会更高,并且通常会避免反射,但在添加/删除属性时可能更容易维护。
我还缺少其他选择吗?也许某种类型的bean实用程序,我可以专门排除要检查的属性? (或者巧妙地使用BeanUtils?)
答案 0 :(得分:1)
两者都不会起作用。字段不为空的事实并不意味着用户加载它(考虑默认值)。除此之外,您还要在数据模型和表示层之间创建紧密耦合(如果您不想在屏幕上显示某些字段,该怎么办?)。
在我看来,您应该将您希望由页面加载的字段列表发送到浏览器,并在那里管理该信息,因为用户加载(或删除)字段值。用户提交更改后,您将获得修改后的字段数。
答案 1 :(得分:0)
我对您使用的系统不熟悉,但一般情况下还有另一种选择:
在文本框中"输入"事件,更新计数器。假设您知道需要完成的字段总数,您可以使用此计数器和该已知值来确定百分比。
由此产生的一个问题是,用户按下Enter进入下一个或通过它进行选项卡(以任一方式引发事件),然后返回上一个字段(通过执行类似SHIFT + Tab的操作)或点击它然后当他们点击它时,它会错误地更新计数器。
因此,鉴于这个问题,我建议保留一张价值图。说每个文本框,当你编辑它时,放一个布尔值(" true",例如;确切的值并不重要,只要它在那里,而不是null或false)到文本框名称下的地图中。然后,您可以计算地图中有多少个键,并根据已知总值进行检查。
这样的事情:
Map<String, boolean> map = new Map<String, boolean>();
//In the textbox textchanged event:
if (textbox.text != null && ! textbox.text.equals("")){
map.put(textbox.name, true);
}
else{
//if the user puts something in and then deletes it,
//remove this textbox from the map
map.remove(textbox.name);
}
//In the field checker:
if (map.getEntrySet().size() >= numberOfFields){
//the number of fields is good
}
显然,其中一些是伪代码(例如&#34; textbox.text&#34;),但这个想法就在那里。我使用map.getEntrySet(),我认为我拼写正确,但实际上任何返回内容列表表示的地图方法都会这样做,因为你只是得到了列表的大小并且没有&#39 ;确实需要看到它的内容。