我有一个简单的Spring 2.5 JSP表单,我从下拉列表中接受用户的星座,验证他已选择参数,并在表单提交时调用实用程序方法来获取符号的预测(实际上这个测试应用程序的随机字符串。)
但是当我在ModelAttrribute
中设置它时,它没有被传递到响应页面。如何将附加属性传递给响应页面?
我的模型对象是Forecast
,有两个属性ZodiacSign
和Forecast
。以下代码在控制器中,在表单提交时调用:
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("forecast") Forecast forecast, BindingResult result, SessionStatus status, ModelMap model) {
forecastFormValidator.validate(forecast, result);
if (result.hasErrors()) {
//if validator fails
return "forecastForm";
}
else {
//the utility class, will set a random string as forecast
//in the forecast attribute of forecast object and return the
//modified object
forecast = myUtil.returnForecastForZodiac(forecast);
//Following prints the forecast string correctly
System.out.println(forecast.getForecast());
}
status.setComplete();
//form success
return "forecastSuccess";
}
forecastSuccess
JSP只显示“预测”模型属性(例如:$ {forecast.zodiacSign}),但它不显示我在上面的方法中设置的预测属性的值(实际上我修改了对象本身)。
似乎响应表单传递了forecastForm
提供它的旧对象(只有黄道带符号),我在方法中所做的操作并没有影响它。
答案 0 :(得分:0)
这与Spring无关。 您未正确使用forecast
引用。
这是错误的代码:
forecast = myUtil.returnForecastForZodiac(forecast);
forecast
引用现在指向您的方法中的本地对象,由您的util调用创建。但是引用是副本,因此原始对象保持不变。
退出方法后,您将返回旧值。
您必须forecast.setStuff(...)
而不是forecast = someStuff
。第一个修改对象,第二个重新分配引用,保留原始对象。
请记住,Java总是按值传递(即使引用是按值传递)。 Further reading found here for an explanation of why assigning to object parameters doesn't always yield the expected result