SpringMVC实例分析
Spring的MVC模块
Spring提供了自己的MVC框架实现,相比Struts、WebWork等MVC模块,Spring的MVC模块显得小巧而灵活。Spring的MVC使用Controller处理用户请求,此处的Controller类似于Struts1.x中的Action。SpringMVC作为Spring框架的一部分,在进行框架整合时不需要像Struts1&2那样特意的去融合到Spring里面,其本身就在Spring里面。
先定义如下各层:
域模型层实体类Cat:
package com.spring.mvc; import java.util.Date; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity @Table(name = "tb_cat") public class Cat { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String name; @Temporal(value = TemporalType.TIMESTAMP) private Date createdDate; public Date getCreatedDate() { return createdDate; } public void setCreatedDate(Date createdDate) { this.createdDate = createdDate; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
业务逻辑层接口ICatService:
package com.spring.mvc; import java.util.List; public interface ICatService { public void createCat(Cat cat); public List<Cat> listCats(); public int getCatsCount(); }
业务逻辑层接口的实现类CatServiceImpl:
package com.spring.mvc; import java.util.List; public class CatServiceImpl implements ICatService { private ICatDao catDao; public ICatDao getCatDao() { return catDao; } public void setCatDao(ICatDao catDao) { this.catDao = catDao; } public void createCat(Cat cat) { if (catDao.findCatByName(cat.getName()) != null){ throw new RuntimeException("猫" + cat.getName() + "已经存在。" ); } catDao.createCat(cat); } public int getCatsCount() { return catDao.getCatsCount(); } public List<Cat> listCats() { return catDao.listCats(); } }
数据库持久层接口ICatDao:
package com.spring.mvc; import java.util.List; public interface ICatDao { public void createCat(Cat cat); public Cat findCatByName(String name); public List<Cat> listCats(); public int getCatsCount(); }
数据库持久层实现类CatDaoImpl:
package com.spring.mvc; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; public class CatDaoImpl extends HibernateDaoSupport implements ICatDao { public void createCat(Cat cat) { this.getHibernateTemplate().persist(cat); } public Cat findCatByName(String name) { List<Cat> catList = this.getHibernateTemplate().find(" select c from Cat c where c.name = ? ", name); if (catList.size() > 0) return catList.get(0); return null; } public int getCatsCount() { return (Integer) this.getSession(true).createQuery(" select count(c) from Cat c ").uniqueResult(); } public List<Cat> listCats() { return this.getHibernateTemplate().find(" select c from Cat c "); } }
SpringMVC的控制层和视图层
SpringMVC的控制层是Controller。Controller是个接口,一般直接继承AbstractController抽象类,并实现handleRequestInternal方法,此方法类似于Struts1.x中的execute()方法。
SpringMVC的视图层使用的是ModelAndView对象。handleRequestInternal方法返回的即时此对象,ModelAndView相当于Struts1.x中的ActionForward。
ModelAndView可以方便的传递参数,例如
return new ModelAndView("cal/listCat","cat",cat);
等价于
request.setAttribute("cat",cat);
return new ModelAndView("cal/listCat");
当传递多个参数时,可以使用Map,例如:
Map map = new HashMap();
map.put("cat",cat);
map.put("catList",catList);
return new ModelAndView("cat/listCat",map);
package com.spring.mvc; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; public class CatController extends AbstractController { private ICatService catService; @Override protected ModelAndView handleRequestInternal(HttpServletRequest request,HttpServletResponse response) throws Exception { String action = request.getParameter("action"); if ("add".equals(action)) { return this.add(request, response); } return this.list(request, response); } protected ModelAndView list(HttpServletRequest request,HttpServletResponse response) throws Exception { List<Cat> catList = catService.listCats(); request.setAttribute("catList", catList); return new ModelAndView("cat/listCat"); } protected ModelAndView add(HttpServletRequest request,HttpServletResponse response) throws Exception { Cat cat = new Cat(); cat.setName(request.getParameter("name")); cat.setCreatedDate(new Date()); catService.createCat(cat); return new ModelAndView("cat/listCat", "cat", cat); } public ICatService getCatService() { return catService; } public void setCatService(ICatService catService) { this.catService = catService; } }
多业务分发器
如果一个Controller需要处理多种业务逻辑,可以使用MultiActionController。MultiActionController就是一个分发器,相当于Struts1.x中的DispatchAction分发器,能根据某参数值将不同的请求分发到不同的方法上,比如可以设置分发器参数为method,则URL地址访问catMulti.mvc?method=add时将会执行add方法。CatMultiController不需要继承父类的任何方法,只需要定义形如public ModelAndView xxx(HttpServletRequest request,HttpServletResponse response)的方法,当地址栏参数method为xxx时,Spring会通过反射调用xxx()方法。
package com.spring.mvc; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; public class CatMultiController extends MultiActionController { private ICatService catService; public ICatService getCatService() { return catService; } public void setCatService(ICatService catService) { this.catService = catService; } @SuppressWarnings("unchecked") public ModelAndView add(HttpServletRequest request,HttpServletResponse response) { Cat cat = new Cat(); cat.setName(request.getParameter("name")); cat.setCreatedDate(new Date()); catService.createCat(cat); return this.list(request, response); } @SuppressWarnings("unchecked") public ModelAndView list(HttpServletRequest request,HttpServletResponse response) { List<Cat> catList = catService.listCats(); request.setAttribute("catList", catList); return new ModelAndView("cat/listCat"); } }
SpringMVC实例分析的更多相关文章
- RPC原理及RPC实例分析
在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...
- java基础学习05(面向对象基础01--类实例分析)
面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过set ...
- (转)实例分析:MySQL优化经验
[IT专家网独家]同时在线访问量继续增大,对于1G内存的服务器明显感觉到吃力,严重时甚至每天都会死机,或者时不时的服务器卡一下,这个问题曾经困扰了我半个多月.MySQL使用是很具伸缩性的算法,因此你通 ...
- sql注入实例分析
什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...
- 实例分析ELF文件静态链接
参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第4章 静态链接 开发平台: [thm@tanghuimin static_link]$ uname ...
- 用实例分析H264 RTP payload
用实例分析H264 RTP payload H264的RTP中有三种不同的基本负载(Single NAL,Non-interleaved,Interleaved) 应用程序可以使用第一个字节来识别. ...
- nodejs的模块系统(实例分析exprots和module.exprots)
前言:工欲善其事,必先利其器.模块系统是nodejs组织管理代码的利器也是调用第三方代码的途径,本文将详细讲解nodejs的模块系统.在文章最后实例分析一下exprots和module.exprots ...
- Android Touch事件原理加实例分析
Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...
- Camera图像处理原理及实例分析-重要图像概念
Camera图像处理原理及实例分析 作者:刘旭晖 colorant@163.com 转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rg ...
随机推荐
- 数组循环:循环多个li 每个li 固定N条数据
PHP代码: $arr = array(1,2,3,4,5,6,7); $x = 1; $y = 0; foreach($arr as $k => $v){ $data[$y][] = $v; ...
- 重装Ubuntu16.04及安装theano
一.卸载现有的ubuntu系统 1.下载MbrFix,并放在C盘根目录. 2.管理员身份运行cmd命令符:切换到C盘根目录,然后输入命令符MbrFix /drive 0 fixmbr,回车确认即可. ...
- Query 一些简单的效果
Query 一些简单的效果 $(selector).hide(speed,callback); 隐藏 $(selector).show(speed,callback); 显示 $(selector). ...
- C的文件操作
文件文件的基本概念 所谓“文件”是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名. 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件.库文件 (头文件)等 ...
- 因为换工作,需要学习CCNA的课程
听说集齐7个CCIE就可以召唤神龙,不知道是不是真的,从CCNA开始吧! 加油!!!
- linux创建动态库
[1]新建源程序sharelib.c /************************************************************************* > F ...
- 实验1_IPv6地址配置
IPv6地址配置 实验任务 (1)掌握如何在路由器及PC上配置IPv6地址 (2)掌握如何用IPv6 ping命令进行IPv6地址可达性检查 (3)掌握如何用命令来查看IPv6地址配置 实验过程 在R ...
- 51nod 1228 序列求和 ( 1^k+2^k+3^k+...+n^k )
C为组合数,B为伯努利数 具体推到过程略 参考博客:http://blog.csdn.net/acdreamers/article/details/38929067# (我的式子和博客中的不一样,不过 ...
- float和double精度问题
System.out.println(new BigDecimal(253.90).doubleValue() * 100);25390.0精度正确 System.out.println(new Bi ...
- 从0和1到Python
什么是编程语言? 举一个例子: 如果我们不会英语,和一个不会中文的老外交流,怎么办?找个翻译. 电脑只懂0和1组成的机器语言. 用0和1告诉计算机做事很累:人类语言易了解,学习快,效率高. 如果定义一 ...