gpt4 book ai didi

jsp - 在 Spring Web 应用程序中显示日期字段的策略

转载 作者:行者123 更新时间:2023-12-04 22:43:36 25 4
gpt4 key购买 nike

不知道有没有人能帮忙。我正在编写一个 Spring MVC/Webflow 网络应用程序,我需要从用户那里收集数据。我有一个反射(reflect)后端模式的表单支持对象(我认为 JAXB 用于生成类)。无论如何,我需要捕获的字段之一是 DOB,它在表单支持对象中是 XMLGregorianCalendar 类型的单个属性

在大多数情况下,表单上的 html 输入字段是一对一映射到表单支持对象中的属性 - 例如:html 输入“surname”映射到表单支持中名为“surname”的 String 属性对象(通过 getter 和 setter)。不错:)

但是日期字段有点不同。在表单支持对象中,它只有一个属性和一对 getter/setter;但在屏幕上我们可能希望将其显示为 3 个单独的字段 - 可能是天的下拉列表、月的下拉列表和年的文本框

无论后端技术如何,每个网络应用程序都必须出现这种类型的问题,我想知道其他人如何处理它。

我有两个想法:

1) 扩展我的表单支持对象,以便我拥有 dobDay、dobMonth 和 dobYear 的属性,然后作为我的验证器的一部分,获取 3 个值并从中设置真正的 DOB 属性。我过去曾这样做过,它有点管用,但感觉有点垃圾,尤其是当网络应用程序有很多日期时。

2) 查找或编写一个 jsp 标签库来为我实现这一神奇效果。我可以在呈现表单时看到这项工作是如何工作的——可以使用 FBO 中的属性名称调用 taglib,它可以获取当前日期值,然后可以写入输出 3 个 html 字段。但是我看不出提交是如何工作的——需要读取 3 个 html 字段并将它们“粘合”到 FBO 的不动产中

所以,真的,这只是一个求助电话 - 过去其他人对这种事情做了什么?

欣赏你的想法

内森

最佳答案

您可以使用任一选项,但我倾向于同意您的看法,即让命令对象包含日期组件并不是很巧妙。

如果您在页面中为日期字段添加一个隐藏字段并使用该值来填充日、月和年的三个组合,则数字 2 将起作用。在提交表单时,您必须首先使用 javascript 重新组合此隐藏字段内组合的值(它将与命令对象中的日期字段映射)。

我认为这是最干净的方法,但如果您不想使用 javascript,您可以提交三个值(在命令对象中没有对应的字段)并在命令绑定(bind)后组装它们。

您没有提及您使用的 Spring 版本,但对于 2.x,您可以干预 workflowonBind 方法上重新组合那里的值。

在 Spring 3 中发生了一些变化, Controller 类被弃用,取而代之的是带注释的 Controller ,但如果您使用 InitBinder,您可能会得到类似的结果。结合对 register a custom date editor 的请求并重新组合字段;例如:

命令:

public class TestCommand implements Serializable {
private static final long serialVersionUID = 1L;
private Date someDate;

public Date getSomeDate() {
return someDate;
}

public void setSomeDate(Date someDate) {
this.someDate = someDate;
}
}

Controller :

@Controller
@RequestMapping(value="/testAction")
public class TestController {

@RequestMapping(method=RequestMethod.GET)
public String handleInit() {
return "form";
}

@InitBinder
protected void initBinder(WebDataBinder dataBinder, WebRequest webRequest) {
dataBinder.registerCustomEditor(Date.class, "someDate", new TestPropertyEditor(webRequest));
}

@RequestMapping(method=RequestMethod.POST)
public String handleSubmit(@ModelAttribute("testCommand") TestCommand command, BindingResult result) {
return "formResult";
}
}

表格:

<form:form modelAttribute="testCommand" action="testAction" method="post">
<%-- need a parameter named "someDate" or Spring won't trigger the bind --%>
<input type="hidden" name="someDate" value="to be ignored" />

year: <input type="text" name="year" value="2012" /><br/>
month: <input type="text" name="month" value="5" /><br/>
day: <input type="text" name="day" value="6" /><br/>

<input type="submit" value="submit" />
</form:form>

表单结果:

some date: ${testCommand.someDate}

属性编辑器:

public class TestPropertyEditor extends PropertyEditorSupport {
private WebRequest webRequest;

public TestPropertyEditor(WebRequest webRequest) {
this.webRequest = webRequest;
}

@Override
public void setAsText(String text) throws IllegalArgumentException {
Map<String, String[]> parameterMap = webRequest.getParameterMap();

// should validate these...
Integer year = Integer.valueOf(parameterMap.get("year")[0]);
Integer month = Integer.valueOf(parameterMap.get("month")[0]);
Integer day = Integer.valueOf(parameterMap.get("day")[0]);

try {
String value = String.format("%1$d-%2$d-%3$d", year, month, day);
setValue(new SimpleDateFormat("yyyy-MM-dd").parse(value));
} catch (ParseException ex) {
setValue(null);
}
}
}

关于jsp - 在 Spring Web 应用程序中显示日期字段的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11903449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com