Spring:将修改后的命令对象传递给响应页面

时间:2011-09-18 16:41:55

标签: java spring spring-mvc

我有一个简单的Spring 2.5 JSP表单,我从下拉列表中接受用户的星座,验证他已选择参数,并在表单提交时调用实用程序方法来获取符号的预测(实际上这个测试应用程序的随机字符串。)

但是当我在ModelAttrribute中设置它时,它没有被传递到响应页面。如何将附加属性传递给响应页面?

我的模型对象是Forecast,有两个属性ZodiacSignForecast。以下代码在控制器中,在表单提交时调用:

@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提供它的旧对象(只有黄道带符号),我在方法中所做的操作并没有影响它。

1 个答案:

答案 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