论坛首页 Java企业应用论坛

Spring 3.0 MVC 开发指南[强烈推荐1个小时掌握精华]

浏览 127151 次
该帖已经被评为精华帖
作者 正文
   发表时间: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中有专门的讲述)。
     
0 请登录后投票
   发表时间: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。
0 请登录后投票
   发表时间:2012-03-01  
你可以看看我在springside里的例子,就分成了两个Controller,一个是UserController,主要的action都在这里,一个是UserDetailController,就负责打开更新页面和保存更新提交。
0 请登录后投票
   发表时间:2012-03-01   最后修改:2012-03-01
江南白衣 写道
你可以看看我在springside里的例子,就分成了两个Controller,一个是UserController,主要的action都在这里,一个是UserDetailController,就负责打开更新页面和保存更新提交。

    好的,我下载学习下。在我当前所有的项目实践中,我还是倾向将它们放在一个Controller中,没有遇到什么问题。毕竟类太多,太散不方面维护。
0 请登录后投票
   发表时间:2012-03-04  
谢楼主了, 很好的东西,正好想学习下
0 请登录后投票
   发表时间:2012-04-22  
楼主,我也喜欢用spring mvc。。。O(∩_∩)O哈哈~
0 请登录后投票
   发表时间:2012-04-22  
没想到一上来就看见这么好的资料,正好在学习spring,感谢楼主的分享
0 请登录后投票
   发表时间:2012-04-22  
一直没关注过spring3.0,下载看看楼主写的文章
0 请登录后投票
   发表时间:2012-04-25  
very good.正需要这些资料
0 请登录后投票
   发表时间: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";
}
}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics