SpringMVC 思想介绍
MVC 思想简介
博客园好像不支持发布markdown的时序图, 如果你会markdown并且不太熟悉Springmvc执行流程, 照着图在Markdown上面敲一遍执行流程,这是我经历过的最快的记忆和熟悉方式!
1.分为三层 Model(模型层) Controller(控制层) View(视图层)
最基本的MVC思想结构
2. Mvc架构特点
1.1 三层架构,分工明确,相比于传统的五层架构来说,Mvc将数据层和业务逻辑层都囊括在了模型层中
1.2 SpringMvc的优势
Spring 框架提供了一整套MVC设计模式的所需组件--Spring Mvc
Spring Mvc 提供了一个DispatcherServlet ,用作前端控制器用来控制请求,同事提供灵活的配置处理**程序映射**,**视图解析**,**语言环境**,**主题解析**,**文件上传**.
Spring Mvc 还包含多种视图技术,例如**Java Server Pages(JSP)**,**Velocity**,**iText**,和**POI**等;
3. SpringMvc的优点
- 拥有强大的灵活性,非侵入性,和可配置性;
- 提供了一个前端控制器DispatcherServlet ,开发者不用再开发控制器;
- 分工明确,包括 控制器,验证器,命令对象,模型对象,处理程序映射视图解析器,等,每一个功能实现由一个专门的对象负责,低耦合;
- 自动解析,它可以自动绑定用户输入,并且转换输入类型,如:自动解析前端字符串,并自动将其解析为映射对象所需要的类型;
- 数据传输模式是Map类型,前端JSON获取;
- 支持国际化,支持更具用户区域显示多国语言,并且国际化的配置非常简单;
- 支持多种视图技术;
4. SpringMVC框架流程图
但是在开发中,我们需要做的没有这么多,只需要开发MVC部分,其他组件由SpringMVC提供
- SpringMVC框架提供: 中央控制器,处理适配器,处理映射器,视图解析器
- 其他组件: 浏览器,数据库,模型层,视图层,控制器由我们开发
5. 开发流程
5.1. 配置中央控制器(DispatcherServlet)
- 这一层直接和浏览器接触,需要对浏览器发出的请求进行处理
- 它最主要,整个spring框架依赖它来启动,所以需要将它设置成在服务器启动时加载
- 在web.xml中配置中央控制器
<!--中央处理器,最最最最最最最重要的部分-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化就素要去读取spring的配置文件,用来初始化-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--拦截所有以av结尾的请求-->
<url-pattern>*.av</url-pattern>
</servlet-mapping>
5.2 配置全局过滤器
- 用于过滤要进入中央控制器的请求
<filter>
<filter-name>encodingFilter</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>
<!--加强参数-->
<!--强制设置请求request和响应response的数据信息为encoding-->
<!--无论客户端是否有指定编码,到了这边全是encoding的编码-->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
- 注意 : web.xml中的配置信息是有顺序要求的, 详见2.3.dtd
5.3 配置DispatcherServlet的必须组件
三大接口是必须的,通常根据不同需求选择他们中的不同实现
- 处理映射器(HandlerMapping)
- BeanNameUrlHandlerMapping
- 如果使用这个映射器,那么就需要实现Controller接口来完成请求分发
- BeanNameUrlHandlerMapping
- 处理适配器(HandlerAdapter)
- SimpleControllerHandlerAdapter
- 视图解析器(ViewResolver)
- InternalResourceViewResolver
<!--配置处理器映射器-->
<!--这大哥-->
<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>
- 方式二 处理映射器和处理适配器要配套使用
<bean id="hello2Action" class="com.lyuweigh.action.Hello2Action"/>
<!--处理映射器-->
<!--SimpleUrlHandlerMapping 通过Controller的id来找-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!--请求的url对应Controller的Bean对象-->
<prop key="/demo">hello2Action</prop>
</props>
</property>
</bean>
<!--处理适配器-->
<!--Controller需要实现HttpRequestHandler-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<!--视图解析器,不需要配套使用-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
作用的话留待补充
6. 开发具体的功能控制器Action(Controller)
- 开发Controller层,这一层主要功能是请求分发和适配
public class HelloAction implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//可以同时返回视图+数据
ModelAndView mv = new ModelAndView();
mv.setViewName("/index.jsp");
return mv;
}
}
7. moudle层,让mybatis做
6. 使用注解和XML混合配置SpringMVC
- web.xml 的配置是死的,不用改变
6.1 基于注解的处理映射器和处理适配器
老样子,视图解析器不变 还是InternalResourceViewResolver
<!--注解的配置方案-->
<!--注解映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--注解适配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
- 并且,这注解的配置方按,有简单的方式可以替换手动配置的映射器,适配器
6.2 Controller的配置方式
@Controller
@RequestMapping("hello.do")
public class Hello3Action {
//方法可自定义
@RequestMapping("/demo")
public ModelAndView helloWorld(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.addObject("demo", "lyuweigh3");
mv.setViewName("/index.jsp");
return mv;
}
}
- @RequestMapping()
- 可以配置在方法上表示该方法的请求路径
- 也可以配置在类名上表名该模块的请求路径
可以每个方法都加上一个URL和方法对应
7. Controller/Action自定义方法设置
- 注解配置的方法有两种返回方式
- String
- ModelAndView
- 返回的ModelAndView中,返回字符串前面加上
- redirect: ->表示重定向
- forward: ->表示转发
- 返回字符串的方式就和直接了,处理直接弄成JSON格式
7.1 传值
功能方法之间的传值(c-c)
- request
- session
- cache(分布式缓存)
从具体功能方法到页面(c-v)
- MoudleAndView 的 addObject()
- String
从页面到功能方法(v-c)
- request.getParmeter()
一共是五种传参方式:
一:直接将请求参数名作为Controller中方法的形参
举例:public String login (String username,String password) :
解释:括号中的参数必须与页面Form 表单中的name 名字相同二:使用@RequestParam 绑定请求参数参数值
举例:public String login(RequestParam ("username") String name) :
解释:双引号中的username 必须与页面vlaue名字相同,String name 中的name可以随便写三:用注解@RequestMapping接收参数的方法
- 如果后面参数里面的字符串前没有"/",那么会默认加上字符串
@RequestMapping(value="/login/{username}/{password}")
public String login(@PathVariable("username") String name,@PathVariable("password") String name)
解释:上面的 @RequestMapping(value="/login/{username}/{password}") 是以注解的方式写在方法上的。注解上的usernname和 password 必须好页面上value 相同
- 四:使用Pojo对象(就是封装的类,类中封装的字段作为参数)绑定请求参数值,原理是利用Set的页面反射机制找到User对象中的属性
举例:
@ReauestMapping(value=/login”)
public String login(User user){
}
解释:就是把封装的一个类当成一个参数放在方法中,封装类中的属性就是就是参数。
- 五:使用原生的Servlet API 作为Controller 方法的参数
举例:
public String login(HttpServletRequest request){
String usernma=Request.getParameter("username");
}
解释:使用request 请求页面参数的方式获取从页面传过来的参数
SpringMVC 思想介绍的更多相关文章
- SpringMVC Controller介绍
SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...
- SpringMVC Controller介绍(转)
SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...
- c++学习笔记---01---C++语言与OO思想介绍
C++语言与OO思想介绍 C++的特点与OO思想 C语言有一个优点,即它的速度可以很快.写出来的程序可以很精练.简单.小巧,不用为了解决某个问题环绕太平洋一大圈. 但如果将C和C++相比较,C++就经 ...
- Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍
本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: htt ...
- [转]SpringMVC Controller介绍及常用注解
一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...
- SpringMVC Controller 介绍
一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...
- Ext学习-基础概念,核心思想介绍
1.目标 本阶段的目标是通过学习一些基础知识来对EXTJS有个整体的了解,知道EXTJS的基础语法,核心设计思想等等 2.内容 1.基础部分学习 2.EXTJS类系统介绍 3.EXTJ ...
- [Python学习] 简单网络爬虫抓取博客文章及思想介绍
前面一直强调Python运用到网络爬虫方面很有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简介下Python是怎样爬去网络数据的,文章知识很easy ...
- 深入理解springMVC思想
转载:http://elf8848.iteye.com/blog/875830 深入理解Spring MVC 思想 目录 一.前言二.spring mvc 核心类与接口三.spring mvc ...
随机推荐
- type为number的input标签输入小数的方法
纠结了一段时间都没找出方法,最后灵光一现想出这个方法,没想到测试下果然成功了! 看目前网上几乎很难找到相对应的解决方法,所以这里分享出来,如果有更佳方法欢迎提出. 方法如下: <input ty ...
- stl_queue.h
stl_queue.h // Filename: stl_queue.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http:/ ...
- oracle数据库规划建议
之前负责的项目有用到oracle的,oracle dba给过一些建议,自己整理了一下,写再这里做个备忘 数据库需求分析: 1. 创建的数据库名称为maildb,并且字符集为UTF8. 2. 提供可连接 ...
- ACM学习历程—HDU 5512 Pagodas(数学)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5512 学习菊苣的博客,只粘链接,不粘题目描述了. 题目大意就是给了初始的集合{a, b},然后取集合里 ...
- ACM学习历程—HDU 5025 Saving Tang Monk(广州赛区网赛)(bfs)
Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great Classi ...
- 向vivi中加入命令
在vivi的lib/command.c中添加自己的命令 核心数据结构user_command. typedef struct user_command { const char *name; ...
- Operating System-Thread(4) 线程的调度激活机制(Scheduler Activations)
本文主要介绍线程的调度激活机制(Scheduler Activations),主要内容: 调度激活机制简介 上行调用(upcall) 中断处理(Interrupt) 一. 调度激活机制简介 上一篇文章 ...
- 获得Azure订阅LoadBalancer的脚本
有客户希望可以通过一条命令获得一个Azure订阅中所有的负载均衡器. 目前在Azure的powershell中是没有这中命令的.但我们可以通过脚本的方式实现. 下面就是获得所有负载均衡的脚本: par ...
- poj3414Pots(倒水BFS)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13231 Accepted: 5553 Special J ...
- redis多机集群部署文档
redis多机集群部署文档(centos6.2) (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下 ...