【问题标题】:Keep the state of an Object same in Spring MVC在 Spring MVC 中保持对象的状态相同
【发布时间】:2013-08-24 12:01:09
【问题描述】:

在我们的应用程序中,我们需要在数据库中创建一个对象的条目,然后将其发送给用户以进行相同的更改。如下图-:

    @RequestMapping(value = "/addCompany", method = RequestMethod.POST)
public ModelAndView addCompany(
        @ModelAttribute("company-entity") Company company,
        BindingResult result) {
    CompanyService companyService = (CompanyService) applicationContext
            .getBean("companyService");     
    companyService.saveVersionAsDraft(company, 1110);*/
    return new ModelAndView("success");
}

    //Delegate to addPage after making an entry in the database
@RequestMapping("/companyHome")
public ModelAndView showCompanyForm() {
    System.out.println("CompanyController.showContacts()");
    CompanyService companyService = (CompanyService) applicationContext
            .getBean("companyService");
    CommonService commonService = (CommonService) applicationContext.getBean("commonService");
    Company company = (Company) companyService.addNew(new Company(), 1100);
    ModelAndView modelAndView = new ModelAndView("company");
    modelAndView.addObject("companyCategories",
             companyService
                .findAllCompanyCategories());
    modelAndView.addObject("sectors", commonService.findAllSectors());

    modelAndView.addObject("companyStatus",
            companyService.findAllCompanyStatuses());

    ModelAndView modelAndView = new ModelAndView("company");
    modelAndView.addObject("company-entity",company);

    return modelAndView;
}

现在在这个公司对象中,我们还传递了 Db 的主键,我们需要在 add Company() 中使用它。所以我们需要用表单中的对象返回这个主键。 有什么办法吗? 我们有 6 到 7 个此类条目,因此我们不能在表单中使用隐藏字段。

【问题讨论】:

  • 我完全不明白你的问题。可以肯定的是,您还没有真正理解依赖注入的全部内容。您不应该调用 applicationContext.getBean() 从控制器获取服务:它应该由 Spring 注入。用一个具体的例子解释你想要达到的目标。
  • 为什么你不能使用隐藏的表单域,而它们可以完美地解决你的问题?
  • 您的showCompanyForm 也有缺陷,您正在构建 2 个 ModelAndView 对象。您忽略第一个,构建一个新的(仅添加公司)并返回它。现在基本上你所有的参考数据都没有了。

标签: spring spring-mvc


【解决方案1】:

就像 JB Nizet 说的,你似乎绝对没有使用 Spring 的核心:依赖注入。 而不是直接获取服务 bean:

CompanyService companyService = (CompanyService) applicationContext
        .getBean("companyService"); 

你应该让 Spring 在你的控制器中注入类似的东西:

@Autowired
private CompanyService companyService;

除此之外,关于您的问题,您有三个选项可以保留 id。第一个解决方案使用 Spring 提出的经典方式来编辑一些域对象(受 RestFull 方法的启发):

//Delegate to addPage after making an entry in the database
@RequestMapping("/company/{id}")
public ModelAndView showCompany(@PathVariable("id") Long id,Model model) {

使用它,您将始终在 url 中拥有 id,因此您将保留它。

如果您利用 Spring 的“表单”标签,则可以使用第二个选项。您只需要创建一个表单:隐藏字段并给他 path="yourIdAttribute"

第三个是类似的,但你必须创建一个标准输入 type="hidden" 然后在你的控制器中使用类似的东西:

public ModelAndView showCompany(@RequestParam(value="name_of_your_field") Long id,...)

如果您需要更多详细信息,请随时询问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多