2014-09-26 84 views
0

考虑以下问题。如何在Spring mvc中为同一个url控制两个操作?

用户已选择通过点击创建文档创建一个文档,然后他将数据写入到文件。用于创建文档的URL是/ document/save。

对于后续的写了起来,现有的文件必须保存,而不是创建一个新的。

这里是我的代码。

@Controller 
public MyController implements Controller, TemplateTypeAware 
{ 
     @RequestMapping("/document/save") 
     public String saveOrCreateDocument(@ModelAttribute DocumentWrapper wrapper, ModelAndView m) 
     { 
       if(m.getModel().get("document_id")==null) 
       { 
       Document doc=createDocument(wrapper); 
       m.addObject("document_id",doc.getId()); 
       } 
       else 
       { 
       saveDocument(m.getModel().get("document_id"), wrapper); 
       } 
      return documentView; 
     } 
} 

模板:

<form> 
<input type="hidden" name="document_id" th:value="*{document_id}"/> 
<!-- other fields --> 
</form> 

这里的问题是,我得到document_id总是null。有没有解决这个问题的方法?

在此先感谢。希望你能尽快回复。

+0

它为什么会比'null'其他什么吗?如果您要发送现有文档的请求,则需要在请求中标识该文档。 – 2014-09-26 15:49:38

+0

您是否将document_id作为请求参数发送? – 2014-09-26 15:52:21

+0

第一次访问页面时,必须完成创建,因此不会有'document_id',为了后续保存,我已将'document_id'模型添加为对象。当我设置该对象时,我将返回与更新后的问题中相同的视图。 – user12458 2014-09-26 16:02:19

回答

0

表单域会,如果他们匹配的名字被自动绑定到你的DocumentWrapper领域,这意味着DocumentWrapper需要一个名为场DOCUMENT_ID,否则DOCUMENT_ID请求参数将不会被绑定到你的对象。

模型属性会接触到的观点,在这一点上,模型将是空的,你可以在你的处理方法添加属性,他们将成为你的观点,但请求参数不会在模型中。这就解释了你为什么总是空白。

如果你只需要DOCUMENT_ID参数,使用@RequestParam

@RequestMapping("/document/save") 
public String saveOrCreateDocument(@RequestParam("document_id") Long documentId, Model m) { 
... 
} 

请参考Spring MVC中的结合部分:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestparam

+0

但是在创建文档时,不会有'documentId'。如何才能做到这一点? – user12458 2014-09-27 11:15:50

+0

我其实在我看来确实是首次创建时的文件,然后我得到的是放在模型属性的ID,这个属性值(文档ID)被置为将提交表单的隐藏字段值。现在,因为它是表单的一部分,所以我应该得到document_id,但问题是我无法得到它,即返回null。 – user12458 2014-09-27 14:23:05

+0

这里视图不会更新新的值集。 – user12458 2014-09-27 16:46:45

相关问题