该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-01
最后修改:2012-03-01
江南白衣 写道 因为那个被@ModelAttribute的getEntity的方法是每次都会被调的,如果是ListAll/DisplayCreateForm这些场景,调它明显不靠谱,所以要拆到另一个Controller去。 是的,标注了@ModelAttribute的方法会在每次请求该Controller时都调用之。一般情况下,我们仅在createForm这种场景希望调用@ModelAttribute方法以返回的初始模型作为表单的初始模型。而listAll等场景则不希望使用这个@ModelAttribute的方法返回的初始模型。 虽然方法级的@ModelAttribute有这个限制,但如果因为这个限制而将相同模型的请求处理分隔到不同的Controller中,个人觉得不是最佳实践:因为违反了面向对象的基本原则,即类的封装性。 可以有两种解决思路: 其一:直接忽略方法级@ModelAttribute的这个限制,因为对于listAll,dispay这些方法,虽然标注@ModelAttribute的方法会无用功地执行一次,但并不会带来逻辑上的问题,仅仅是做了一次无用功而已。而标注@ModelAtrribute的方法,往往只是new一个Form对象而已,所造成的效率损耗往往可忽略不计; 其二:不用使用方法级的@ModelAttribute,使用参数级的替代。因为方法级的作用仅仅是创建一个对象并放到请求对应的“隐含模型”中去而已,完全可以在createFormPage中用完成这个功能,如下所示: @RequestMapping("/sample/showCreateFormPage") public String createFormPage(@ModelAttribute("sampleForm") sampleForm){ sampleForm.setXxx("xxx"); sampleFrom.setYyy("yyy"); return "/sample/createFormPage"; } 有鉴于此,一般情况下,不使用方法级的@ModelAttribute,可能是更好的方式。 但是有一种情况,即使用了@SessionAttribute时,如果Session中原来没有这个模型,则需要使用方法级的@ModelAttribute,否则会报异常,这是我在写《Spring 3.x企业开发实战》时遇到的一个让我很痛苦的问题,最终通过分析其内部流程才解开的困惑(这个,我的PPT中有专门的讲述)。 |
|
返回顶楼 | |
发表时间:2012-03-01
最后修改:2012-03-01
江南白衣 写道 flashing 写道 的确以前不太了解,最近看你的ss4里面的demo才明白过来,顺便仔细看了一下spirngmvc3.1的文档,的确很强,比struts2要强上半个级别了。 btw有3个建议for springside, 1.ss是不是可以考虑全体改scala 2.spring Security还是比shiro靠谱啊的 3.我觉得demo可以再大一些,做一个大的应用平台,而不是仅仅的demo。 1.全体改scala,直接用Play得了:) 2.个人喜欢shiro多一点,SpringSecurity太复杂,而且作者基本也改不动它了。如果它出个大幅简化的4.0的话可以考虑。 3.时间,时间。 有同感!也觉得SpringSecurity太过复杂了,在《Spring 2.x》时还有专门一章写,但是在《Spring 3.x》时就去除了,这东西太过细节和笨重,对于企业级应用使用起来太过繁琐。不过其框架设计思想方面确实做很不错,非常OO。 |
|
返回顶楼 | |
发表时间:2012-03-01
你可以看看我在springside里的例子,就分成了两个Controller,一个是UserController,主要的action都在这里,一个是UserDetailController,就负责打开更新页面和保存更新提交。
|
|
返回顶楼 | |
发表时间:2012-03-01
最后修改:2012-03-01
江南白衣 写道 你可以看看我在springside里的例子,就分成了两个Controller,一个是UserController,主要的action都在这里,一个是UserDetailController,就负责打开更新页面和保存更新提交。
好的,我下载学习下。在我当前所有的项目实践中,我还是倾向将它们放在一个Controller中,没有遇到什么问题。毕竟类太多,太散不方面维护。 |
|
返回顶楼 | |
发表时间:2012-03-04
谢楼主了, 很好的东西,正好想学习下
|
|
返回顶楼 | |
发表时间:2012-04-22
楼主,我也喜欢用spring mvc。。。O(∩_∩)O哈哈~
|
|
返回顶楼 | |
发表时间:2012-04-22
没想到一上来就看见这么好的资料,正好在学习spring,感谢楼主的分享
|
|
返回顶楼 | |
发表时间:2012-04-22
一直没关注过spring3.0,下载看看楼主写的文章
|
|
返回顶楼 | |
发表时间:2012-04-25
very good.正需要这些资料
|
|
返回顶楼 | |
发表时间:2012-04-28
我一直用springMVC 比struts整合方便多了,但是springMVC就是使用方法比较多,使得刚入门时候 比较繁杂,我就使用一种MVC,写controller时候 和普通类一样,返回的都是String,比如:
@Controller @RequestMapping("/webuser.do") public class WebUserController { protected final Log logger = LogFactory.getLog(getClass()); @Resource(name = "webUserMxService") private IWebUserMxService webUserMxService; /* * 删除 */ @RequestMapping(params = "method=delete") public String doDelete(WebUserMx userMx, HttpServletRequest request, HttpServletResponse response, Map<String, Object> model) { Map<String, Object> result = new HashMap<String, Object>(); try { webUserMxService.deleteByPrimaryKey(userMx.getUserMxId()); result.put("success", true); result.put("message", "保存成功!"); } catch (Exception e) { logger.error(e); result.put("success", false); result.put("message", "保存失败!"); } model.put("result", result); return "JsonView"; } } |
|
返回顶楼 | |