SpringMVC实例分析

Spring的MVC模块

Spring提供了自己的MVC框架实现,相比Struts、WebWork等MVC模块,Spring的MVC模块显得小巧而灵活。Spring的MVC使用Controller处理用户请求,此处的Controller类似于Struts1.x中的Action。SpringMVC作为Spring框架的一部分,在进行框架整合时不需要像Struts1&2那样特意的去融合到Spring里面,其本身就在Spring里面。

先定义如下各层:

域模型层实体类Cat:

 1 package com.spring.mvc;
 2
 3 import java.util.Date;
 4
 5 import javax.persistence.Entity;
 6 import javax.persistence.GeneratedValue;
 7 import javax.persistence.GenerationType;
 8 import javax.persistence.Id;
 9 import javax.persistence.Table;
10 import javax.persistence.Temporal;
11 import javax.persistence.TemporalType;
12
13 @Entity
14 @Table(name = "tb_cat")
15 public class Cat {
16
17     @Id
18     @GeneratedValue(strategy = GenerationType.AUTO)
19     private Integer id;
20     private String name;
21     @Temporal(value = TemporalType.TIMESTAMP)
22     private Date createdDate;
23     public Date getCreatedDate() {
24         return createdDate;
25     }
26
27     public void setCreatedDate(Date createdDate) {
28         this.createdDate = createdDate;
29     }
30
31     public Integer getId() {
32         return id;
33     }
34
35     public void setId(Integer id) {
36         this.id = id;
37     }
38
39     public String getName() {
40         return name;
41     }
42
43     public void setName(String name) {
44         this.name = name;
45     }
46 }

业务逻辑层接口ICatService:

1 package com.spring.mvc;
2
3 import java.util.List;
4
5 public interface ICatService {
6     public void createCat(Cat cat);
7     public List<Cat> listCats();
8     public int getCatsCount();
9 }

业务逻辑层接口的实现类CatServiceImpl:

 1 package com.spring.mvc;
 2
 3 import java.util.List;
 4
 5 public class CatServiceImpl implements ICatService {
 6     private ICatDao catDao;
 7     public ICatDao getCatDao() {
 8         return catDao;
 9     }
10
11     public void setCatDao(ICatDao catDao) {
12         this.catDao = catDao;
13     }
14
15     public void createCat(Cat cat) {
16         if (catDao.findCatByName(cat.getName()) != null){
17             throw new RuntimeException("猫" + cat.getName() + "已经存在。" );
18         }
19         catDao.createCat(cat);
20     }
21
22     public int getCatsCount() {
23         return catDao.getCatsCount();
24     }
25
26     public List<Cat> listCats() {
27         return catDao.listCats();
28     }
29 }

数据库持久层接口ICatDao:

 1 package com.spring.mvc;
 2
 3 import java.util.List;
 4
 5 public interface ICatDao {
 6     public void createCat(Cat cat);
 7     public Cat findCatByName(String name);
 8     public List<Cat> listCats();
 9     public int getCatsCount();
10 }

数据库持久层实现类CatDaoImpl:

 1 package com.spring.mvc;
 2
 3 import java.util.List;
 4
 5 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
 6
 7 public class CatDaoImpl extends HibernateDaoSupport implements ICatDao {
 8
 9     public void createCat(Cat cat) {
10         this.getHibernateTemplate().persist(cat);
11     }
12
13     public Cat findCatByName(String name) {
14         List<Cat> catList = this.getHibernateTemplate().find(" select c from Cat c where c.name = ? ", name);
15         if (catList.size() > 0)
16             return catList.get(0);
17         return null;
18     }
19
20     public int getCatsCount() {
21         return (Integer) this.getSession(true).createQuery(" select count(c) from Cat c ").uniqueResult();
22     }
23
24     public List<Cat> listCats() {
25         return this.getHibernateTemplate().find(" select c from Cat c ");
26     }
27 }

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);

 1 package com.spring.mvc;
 2
 3 import java.util.Date;
 4 import java.util.List;
 5
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8
 9 import org.springframework.web.servlet.ModelAndView;
10 import org.springframework.web.servlet.mvc.AbstractController;
11
12 public class CatController extends AbstractController {
13
14     private ICatService catService;
15
16     @Override
17     protected ModelAndView handleRequestInternal(HttpServletRequest request,HttpServletResponse response) throws Exception {
18         String action = request.getParameter("action");
19         if ("add".equals(action)) {
20             return this.add(request, response);
21         }
22         return this.list(request, response);
23     }
24
25     protected ModelAndView list(HttpServletRequest request,HttpServletResponse response) throws Exception {
26         List<Cat> catList = catService.listCats();
27         request.setAttribute("catList", catList);
28         return new ModelAndView("cat/listCat");
29     }
30
31     protected ModelAndView add(HttpServletRequest request,HttpServletResponse response) throws Exception {
32         Cat cat = new Cat();
33         cat.setName(request.getParameter("name"));
34         cat.setCreatedDate(new Date());
35         catService.createCat(cat);
36         return new ModelAndView("cat/listCat", "cat", cat);
37     }
38
39     public ICatService getCatService() {
40         return catService;
41     }
42
43     public void setCatService(ICatService catService) {
44         this.catService = catService;
45     }
46 }

多业务分发器

如果一个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()方法。

 1 package com.spring.mvc;
 2
 3 import java.util.Date;
 4 import java.util.List;
 5
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8
 9 import org.springframework.web.servlet.ModelAndView;
10 import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
11
12 public class CatMultiController extends MultiActionController {
13
14     private ICatService catService;
15
16     public ICatService getCatService() {
17         return catService;
18     }
19
20     public void setCatService(ICatService catService) {
21         this.catService = catService;
22     }
23
24     @SuppressWarnings("unchecked")
25     public ModelAndView add(HttpServletRequest request,HttpServletResponse response) {
26         Cat cat = new Cat();
27         cat.setName(request.getParameter("name"));
28         cat.setCreatedDate(new Date());
29         catService.createCat(cat);
30         return this.list(request, response);
31     }
32
33     @SuppressWarnings("unchecked")
34     public ModelAndView list(HttpServletRequest request,HttpServletResponse response) {
35         List<Cat> catList = catService.listCats();
36         request.setAttribute("catList", catList);
37         return new ModelAndView("cat/listCat");
38     }
39
40 }
时间: 2024-11-02 14:24:39

SpringMVC实例分析的相关文章

【OpenGL】Shader实例分析(七)- 雪花飘落效果

转发请保持地址:http://blog.csdn.net/stalendp/article/details/40624603 研究了一个雪花飘落效果.感觉挺不错的.分享给大家,效果例如以下: 代码例如以下: Shader "shadertoy/Flakes" { // https://www.shadertoy.com/view/4d2Xzc Properties{ iMouse ("Mouse Pos", Vector) = (100,100,0,0) iChan

Apache漏洞利用与安全加固实例分析

Apache 作为Web应用的载体,一旦出现安全问题,那么运行在其上的Web应用的安全也无法得到保障,所以,研究Apache的漏洞与安全性非常有意义.本文将结合实例来谈谈针对Apache的漏洞利用和安全加固措施. Apache HTTP Server(以下简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,是最流行的Web服务器软件之一.虽然近年来Nginx和Lighttpd等Web Server的市场份额增长得很快,但Apache仍然是这个领

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

面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过setter和getter设置和取得4.如果需要可以加入若干构造方法 5.再根据其它要求添加相应的方法6.类中的所有方法都不要直接输出,而是交给被调用处调用 Demo 定义并测试一个名为Student的类,包括属性有"学号"."姓名"以及3门课程"数学".

第十七篇:实例分析(3)--初探WDDM驱动学习笔记(十)

续: 还是记录一下, BltFuncs.cpp中的函数作用: CONVERT_32BPP_TO_16BPP 是将32bit的pixel转换成16bit的形式. 输入是DWORD 32位中, BYTE 0,1,2分别是RGB分量, 而BYTE3则是不用的 为了不减少color的范围, 所以,都是取RGB8,8,8的高RGB5, 6, 5位, 然后将这16位构成一个pixel. CONVERT_16BPP_TO_32BPP是将16bit的pixel转换成32bit的形式 输入是WORD 16BIT中

第十七篇:实例分析(4)--初探WDDM驱动学习笔记(十一)

感觉有必要把 KMDDOD_INITIALIZATION_DATA 中的这些函数指针的意思解释一下, 以便进一步的深入代码. DxgkDdiAddDevice 前面已经说过, 这个函数的主要内容是,将BASIC_DISPLAY_DRIVER实例指针存在context中, 以便后期使用, 支持多实例. DxgkDdiStartDevice 取得设备信息, 往注册表中加入内容, 从POST设备中获取FRAME BUFFER以及相关信息(DxgkCbAcquirePostDisplayOwnershi

实例分析Robots.txt写法

题意:经典八数码问题 思路:HASH+BFS #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 500000; const int size = 1000003; typedef int State[9]; char str[30]; int state[9],goal[9]={

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

Camera图像处理原理及实例分析 作者:刘旭晖  [email protected]  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rgbbones.googlepages.com/ 做为拍照手机的核心模块之一,camera sensor 效果的调整,涉及到众多的参数,如果对基本的光学原理及 sensor 软/硬件对图像处理的原理能有深入的理解和把握的话,对我们的工作将会起到事半功倍的效果.否则,缺乏了理论的指导,只能是凭感觉和经

HTTP的上传文件实例分析

HTTP的上传文件实例分析 由于论坛不支持Word写文章发帖. 首先就是附件发送怎么搞,这个必须解决.论坛是php的.我用Chrome类浏览器跟踪请求,但是上传的文件流怎么发过去没找到,估计流可能多或者什么的不好显示,只知道发送了文件名字.需要实际了解下post文件,不能只会后台或界面不了解前台数据处理和协议怎么传送数据. 图中:有些相关文章 HTTP请求中的form data和request payload的区别 AJAX POST请求中参数以form data和request payload

实例分析ELF文件静态链接

1.ELF文件格式概貌 readelf -h 查看elf文件头部信息可以看到Type值有三种:REL,EXEC,DYN. REL文件是只被编译没有被链接过的文件,其格式属于左边一种,elf header+section1,2,3...+section header table,每个section对应一个section header table entry,section header table为各个section提供索引.没有被链接过的文件没有program header,不能被加载到内存中运