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实例分析的更多相关文章

  1. RPC原理及RPC实例分析

    在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...

  2. java基础学习05(面向对象基础01--类实例分析)

    面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过set ...

  3. (转)实例分析:MySQL优化经验

    [IT专家网独家]同时在线访问量继续增大,对于1G内存的服务器明显感觉到吃力,严重时甚至每天都会死机,或者时不时的服务器卡一下,这个问题曾经困扰了我半个多月.MySQL使用是很具伸缩性的算法,因此你通 ...

  4. sql注入实例分析

    什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...

  5. 实例分析ELF文件静态链接

    参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第4章 静态链接 开发平台: [thm@tanghuimin static_link]$ uname ...

  6. 用实例分析H264 RTP payload

    用实例分析H264 RTP payload H264的RTP中有三种不同的基本负载(Single NAL,Non-interleaved,Interleaved) 应用程序可以使用第一个字节来识别. ...

  7. nodejs的模块系统(实例分析exprots和module.exprots)

    前言:工欲善其事,必先利其器.模块系统是nodejs组织管理代码的利器也是调用第三方代码的途径,本文将详细讲解nodejs的模块系统.在文章最后实例分析一下exprots和module.exprots ...

  8. Android Touch事件原理加实例分析

    Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...

  9. Camera图像处理原理及实例分析-重要图像概念

    Camera图像处理原理及实例分析 作者:刘旭晖  colorant@163.com  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rg ...

随机推荐

  1. 关于cookie 取不到值的问题

    当前我们设置cookie时,跨路径的话,我们会取不到设置的cookie的值 我们要添加上path路径的值,就可以啦.(经过验证) path 的设置方法:path=/; function setcook ...

  2. 2016年中国大学生程序设计竞赛(合肥)-重现赛1008 HDU 5968

    异或密码 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  3. js中排序问题总结

    js的排序中通常使用到sort函数,可以用冒泡排序,插入排序,快速排序,希尔排序,系统方法等方法,本文结束后分享一个用着排序算法的链接,感兴趣可以了解了解. 1.常见的对一般数组进行排序,代码如下: ...

  4. 第七章:LED将为我闪烁:控制发光二极管

        在之前章节了解到Linux驱动程序可以控制软硬件,可以实现软硬件之间的交互.在这章我们学习LED驱动的实现原理.Linux内核提供了多个与I/O内存交互的函数可以实现控制硬件.    编写LE ...

  5. 汇编语言进阶和Makefile进阶---第二天

    摘要: 原创博文:转载请标明出处:http://www.cnblogs.com/zxouxuewei 首先加载启动代码: ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序装载地 ...

  6. Ruby 方法

    Ruby 方法 Ruby 方法与其他编程语言中的函数类似.Ruby 方法用于捆绑一个或多个重复的语句到一个单元中. 方法名应以小写字母开头.如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常 ...

  7. spring访问静态资源出错,No mapping found for HTTP request with URI xxx/resources/js/jquery.min.js...

    问题:spring访问静态资源出错,No mapping found for HTTP request with URI xxx/resources/js/jquery.min.js... web.x ...

  8. 前端学习 第二弹: JavaScript中的一些函数与对象(1)

    前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...

  9. MSXML使用教程

    在DOM接口规范中,有四个基本的接口:Document,Node,NodeList以及NamedNodeMap.在这四个基本接口中,Document接口是对文档进行操作的入口,它是从Node接口继承过 ...

  10. (转) The major advancements in Deep Learning in 2016

    The major advancements in Deep Learning in 2016 Pablo Tue, Dec 6, 2016 in MACHINE LEARNING DEEP LEAR ...