软件开发中的MVC设计模式
软件开发的目标是减小耦合,让模块之前关系清晰.
MVC模式在软件开发中经常和ORM模式一起应用,主要作用是将(数据抽象,数据实体传输和前台数据展示)分层,这样前台,后台,数据库三层分离,减小耦合.
1)Model : 负责抽象并存储数据库数据
2)Controller : 负责数据的转化和传输
3)View : 负责展示数据
注意 : ORM框架一般都会将数据库数据封装存储至Model类中,所以MVC框架其实只做了一件事,开发者需要做三件.
MVC框架 : 前台数据与实体数据的互为转化
开发者 : 配置框架,编写业务代码,前台数据展示页面
SpringMVC简介
Spring 框架提供了MVC模块,主要作用也是将前台数据和实体数据进行转化,先来看看.
上述为一张自制的Spring MVC工作流程图,从上面的环节可以很清晰地明白SpringMVC的工作关系,上面的方法是DispatcherServlet的方法.由上可见,在SpringMVC中承担主要工作的是DispatcherServlet,而所有部分除了ModelAndView之类基本就是Controller层的组成部分.
SpringMVC入门案例(XML配置版)
由上图指导,我们可以清晰地知道我们需要怎么配置这个框架
1)导入支持包,Spring core,Spring web,Spring aop这三个模块的包,并且应用了Servlet,所以servlet支持包,以及log4j这种包.应用jsp技术需要导入standard,jstl等包.
2)在web.xml中配置DispatcherServlet
<servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>
web.xml
3)编写Controller类
/** * 控制器 * @author AdminTC */ public class HelloAction implements Controller{ /** * 业务方法 */ public ModelAndView handleRequest(HttpServletRequest requqest,HttpServletResponse response) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message","这是我的第一个springmvc应用程序"); modelAndView.setViewName("/jsp/success.jsp"); return modelAndView; } }
HelloAction.java
4)编写页面,在/WebRoot/下创建jsp/success.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>这是我的第一个springmvc应用程序</title> </head> <body> success.jsp<br/> ${message} </body> </html>
success.jsp
5)在/WEB-INF/创建DispatcherServlet-servlet.xml配置文件,xml头部信息与spring.xml相同
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd "> <!-- 注册控制器(程序员) --> <bean name="/hello.action" class="com.harry.mvc.HelloAction"></bean> <!-- 映射器(框架) --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> <!-- 适配器(框架) --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean> <!-- 视图解析器(框架) --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean> </beans>
DispatcherServlet-servlet.xml
注意 : 可以在web.xml中修改DispatcherServlet-servlet.xml文件名及其路径
<!-- 注册springmvc框架核心控制器 --> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:com.harry.mvc.config.spring.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>
web.xml
映射器-适配器-视图解析器-控制器
映射器(映射什么请求交给什么控制器)
1) org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping(核心)
作用:将开发者定义的Controller(Action)所定义的<bean>标签中的name属性作为请求路径
<!-- 注册控制器(程序员) --> <bean name="/hello.action" class="com.harry.mvc.HelloAction"></bean> <!-- 映射器(框架) --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
DispatcherServlet-servlet.xml
2) org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
作用:将多个路径映射至同一个Controller(Action)
<!-- 注册控制器(开发者) --> <bean id="userActionID" class="com.harry.mvc.UserAction"></bean> <!-- 注册映射器(handler包)(框架) --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/delete.action">userActionID</prop> <prop key="/update.action">userActionID</prop> <prop key="/find.action">userActionID</prop> </props> </property> </bean>
DispatcherServlet-servlet.xml
适配器(在多个Controller中寻找对应的Controller)
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
视图解析器(指定逻辑名的前后缀)
org.springframework.web.servlet.view.InternalResourceViewResolver
作用是解析视图逻辑路径名称对应的真实路径
<!-- 视图解析器(框架) --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
DispatcherServlet-servlet.xml
控制器 (开发者编写加入其他业务代码的入口)
public class EmpAction implements Controller{ public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception { System.out.println("EmpAction::handleRequest"); request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message",username); modelAndView.setViewName("/jsp/success.jsp"); return modelAndView; } }
实现Controller接口
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 UserController extends MultiActionController{ public ModelAndView home(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView model = new ModelAndView("home"); model.addObject("message", "Home"); return model; } public ModelAndView add(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView model = new ModelAndView("user"); model.addObject("message", "Add"); return model; } public ModelAndView remove(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView model = new ModelAndView("user"); model.addObject("message", "Remove"); return model; } }
继承多动作控制器,能够同时绑定多个方法
注意 : Spring MVC中前面三者配置方式方法众多,但它们做的事情差不多,所以理解了后完全可以自己查找文档.
常见问题
日期转换
在默认情况下,springmvc不能将String类型转成Date类型,必须自定义类型转换器
public class AdminAction extends MultiActionController{ @Override protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception { binder.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true)); }
编码转换
由于提交数据的规范是使用POST方法,所以Spring提供了解决中文乱码问题的方案
<!-- 编码过滤器 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
web.xml
框架应用:Spring framework (五) - Spring MVC技术的更多相关文章
-
【Spring Framework】Spring入门教程(三)使用注解配置
本文主要介绍四个方面: (1) 注解版本IOC和DI (2) Spring纯注解 (3) Spring测试 (4) SpringJDBC - Spring对数据库的操作 使用注解配置Spring入门 ...
-
【Spring Framework】Spring 入门教程(一)控制反转和依赖注入
参考资料 Spring 教程 说在前面 什么样的架构,我们认为是一个优秀的架构? 判断准则:可维护性好,可扩展性好,性能. 什么叫可扩展性好? 答:在不断添加新的代码的同时,可以不修改原有代码,即符合 ...
-
spring boot(五)Spring data jpa介绍
在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...
-
【Spring Framework】Spring入门教程(五)AOP思想和动态代理
本文主要讲解内容如下: Spring的核心之一 - AOP思想 (1) 代理模式- 动态代理 ① JDK的动态代理 (Java官方) ② CGLIB 第三方代理 AOP概述 什么是AOP(面向切面编程 ...
-
spring入门(五) spring mvc+hibernate
核心是让SessionFactory由Spring管理 1.引入依赖 <!-- https://mvnrepository.com/artifact/org.springframework/sp ...
-
【Spring Framework】Spring入门教程(八)Spring的事务管理
事务是什么? 事务:指单个逻辑操作单元的集合. 在操作数据库时(增删改),如果同时操作多次数据,我们从业务希望,要么全部成功,要么全部失败.这种情况称为事务处理. 例如:A转账给B. 第一步,扣除A君 ...
-
【Spring Framework】Spring入门教程(六)Spring AOP使用
Spring的AOP 动态代理模式的缺陷是: 实现类必须要实现接口 -JDK动态代理 无法通过规则制定拦截无需功能增强的方法. Spring-AOP主要弥补了第二个不足,通过规则设置来拦截方法,并对方 ...
-
【Spring Framework】Spring入门教程(二)基于xml配置对象容器
基于xml配置对象容器--xml 标签说明 alias标签 作用:为已配置的bean设置别名 --applicationContext.xml配置文件 <?xml version="1 ...
-
【Spring Framework】Spring IOC详解及Bean生命周期详细过程
Spring IOC 首先,在此之前,我们就必须先知道什么是ioc,ioc叫做控制反转,也可以称为依赖注入(DI),实际上依赖注入是ioc的另一种说法, 1.谁控制谁?: 在以前,对象的创建和销毁都是 ...
随机推荐
-
[OAuth]基于DotNetOpenAuth实现Client Credentials Grant
Client Credentials Grant是指直接由Client向Authorization Server请求access token,无需用户(Resource Owner)的授权.比如我们提 ...
-
使用AFNetWorking读取JSON出现NSCocoaErrorDomain Code=3840的解决方法
最近在使用AFNetworkWorking读取JSON时,出现了NSCocoaErrorDomain Code=3840的错误.这种错误应该是服务器端返回JSON格式不对造成的.通过Google搜到这 ...
-
oracle11g服务项及其启动顺序
oracle安装完成后共七个服务,含义分别为: 1. Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Ser ...
-
AOE网上的关键路径(最长路径 + 打印路径)
题目描述 一个无环的有向图称为无环图(Directed Acyclic Graph),简称DAG图. AOE(Activity On Edge)网:顾名思义,用边表示活动的网,当然它也是DAG ...
-
css 背景图片拉伸[转]
http://www.jeasyuicn.com/css-background-image-stretching.html background-image:url(bg.png); -moz-bac ...
-
POJ 1176 Party Lamps (DFS)
对于一束灯光.提供四种改变彩灯状态(ON<=>OFF)的操作:a.改变全部彩灯状态:b.改变奇数彩灯状态.c.改变偶数彩灯状态:d.改变3k+1号彩灯状态(1,4,7,10...). 给定 ...
-
redis bind连不上的坑
由于需要在内网其他服务器上连接redis服务器(192.168.1.110),本想直接在redis配置文件中加上目标的IP地址: bind 192.168.1.166 就可以了,实际上不正确. red ...
-
[Android] 获取系统顶部状态栏(Status Bar)与底部导航栏(Navigation Bar)的高度
Android一些设备都有上下两条bar,我们可以获取这些bar的信息.下面放上获取高度的代码.代码注释和其他方法有空再放. 原文地址请保留http://www.cnblogs.com/rossone ...
-
MD5类(MD5Helper)
项目中经常需要使用到MD5来进行加密 代码: namespace MyProject.Common { public class MD5Helper { /// <summary> /// ...
-
CentOS 7 Apache服务的安装与配置
原文出处:http://blog.51cto.com/13525470/2070375 一.Apache简介 Apache 是一个知名的开源Web服务器.早期的Apache服务器由Apache Gro ...