本溪建网站,网站建设常州青之峰,上海网站建设索王道下拉,常见的网络营销方法第3章-第6节
一、知识点
理解MVC三层模型、理解什么是SpringMVC、理解SpringMVC的工作流程、了解springMVC和Struts2的区别、学会使用SpringMVC封装不同请求、接收参数
二、目标 理解MVC三层模型 理解什么是SpringMVC 理解SpringMVC的工作流程 学会使用SpringMVC封装请求…第3章-第6节
一、知识点
理解MVC三层模型、理解什么是SpringMVC、理解SpringMVC的工作流程、了解springMVC和Struts2的区别、学会使用SpringMVC封装不同请求、接收参数
二、目标 理解MVC三层模型 理解什么是SpringMVC 理解SpringMVC的工作流程 学会使用SpringMVC封装请求
三、内容分析 重点 理解MVC三层模型 理解什么是SpringMVC 理解SpringMVC的工作流程 学会使用SpringMVC封装请求 难点 理解SpringMVC的工作流程 学会使用SpringMVC封装请求
四、内容
1、MVC模型
1.1 MVC的概念
MVC全名Model View Controller模型视图控制器的缩写。是一种用于设计创建Web应用程序表现层的模式。
mvc是一种架构模型本身并没有新功能只是对项目的一种规范方便后期进行维护mvc架构将模型M视图V)和控制C割离开这么做可以提高代码书写的效率和后期维护
1.2 MVC详解 M即model模型是指模型表示业务规则。在MVC的三个部件中模型拥有最多的处理任务。被模型返回的数据是中立的模型与数据格式无关这样一个模型能为多个视图提供数据由于应用于模型的代码只需写一次就可以被多个视图重用所以减少了代码的重复性。通常指数据模型作用一般情况下用于封装数据。 V即View视图是指用户看到并与之交互的界面。比如由html元素组成的网页界面或者软件的客户端界面。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生它只是作为一种输出数据并允许用户操作的方式。通常指jsp或者html用来展示数据的。视图依据模型创建。 C即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求然后再确定用哪个视图来显示返回的数据。处理用户交互部分用来处理程序逻辑
1.3 MVC的框架(了解即可) struts2 Struts2是一个基于MVC设计模式的Web应用框架它本质上相当于一个servlet在MVC设计模式中Struts2作为控制器(Controller)来建立模型与视图的数据交互。 SpringMVC Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架本质上相当于 Servlet。 一个好的框架要减轻开发者处理复杂问题的负担内部有良好的扩展并且有一个支持它的强大用户群体恰恰 Spring MVC 都做到了。 Spring MVC 角色划分清晰分工明细。由于 Spring MVC 本身就是 Spring 框架的一部分可以说和 Spring 框架是无缝集成。性能方面具有先天的优越性是当今业界最主流的 Web 开发框架最热门的开发技能。 区别 Struts2是类级别的拦截 一个类对应一个request上下文SpringMVC是方法级别的拦截 一个方法对应一个request上下文而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现 restful url,而struts2的架构实现起来要费劲因为Struts2中Action的一个方法可以对应一个url 而其类属性却被所有方法共享这也就无法用注解或其他方式标识其所属方法了。 SpringMVC的方法之间基本上独立的独享request response数据请求数据通过参数获取 处理结果通过ModelMap交回给框架方法之间不共享变量而Struts2搞的就比较乱虽然方法之间也是独立的 但其所有Action变量是共享的这不会影响程序运行却给我们编码 读程序时带来麻烦 每次来了请求就创建一个Action一个Action对象对应一个request上下文。 Struts2需要针对每个request进行封装把requestsession等servlet生命周期的变量封装成一个一个Map 供给每个Action使用并保证线程安全所以在原则上是比较耗费内存的。 拦截器实现机制上Struts2有以自己的interceptor机制SpringMVC用的是独立的AOP方式 这样导致Struts2的配置文件量还是比SpringMVC大。 SpringMVC的入口是servlet而Struts2是filter这里要指出filter和servlet是不同的。 以前认为filter是servlet的一种特殊这就导致了二者的机制不同这里就牵涉到servlet和filter的区别了。 SpringMVC集成了Ajax使用非常方便只需一个注解ResponseBody就可以实现然后直接返回响应文本即可 而Struts2拦截器集成了Ajax在Action中处理时一般必须安装插件或者自己写代码集成进去 使用起来也相对不方便。 SpringMVC验证支持JSR303处理起来相对更加灵活方便而Struts2验证比较繁琐感觉太烦乱。 SpringMVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高 当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果但是需要xml配置的地方不少。 SpringMVC开发效率和性能高于Struts2。 SpringMVC可以认为已经100%零配置
2、SpringMVC
2.1 主要组件 前端控制器DispatcherServlet 用户请求达到前端控制器它就相当于mvc模式的cdispatcherServlet是整个流程控制的中心由它调用其他组件处理用户请求dispatcherServlet的存在降低了组件之间的耦合性 请求处理器映射HandlerMapping 根据用户请求找到Handler即处理器SpringMVC提供了不同的映射器实现不同的映射方式例如配置文件方式实现接口方式注解方式等 处理器适配HandlerAdapter 通过HandlerAdapter对处理器进行执行这是适配器模式的应用通过扩展适配器可以对更多类型的处理器进行执行 处理器Handler 开发中要编写的具体业务控制器由DispatcherServlet把用户请求转发到Handler由Handler对具体的用户请求进行处理 视图解析器ViewResolver ViewResolver负责将处理结果生成view视图。首先根据逻辑视图名解析成物理视图名即具体的页面地址再生成View视图对象最后对View进行渲染将处理结果通过页面展示给用户 视图View SpringMVC提供了很多view视图类型的支持包括jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
2.2 工作流程 用户通过浏览器发起 HttpRequest 请求到前端控制器 (DispatcherServlet)前端控制器是所有请求的入口但前端控制器不能处理业务请求它只是一个请求的转发。 谁来处理业务请求呢Handler处理器来真正处理业务请求那么问题来了前端控制器如何来找到这个Handler处理器呢处理器映射器记录的就是请求的url和处理的方法之间的映射关系这个映射关系是怎么建立起来的呢就是通过RequestMapping这个注解来建立起来的这个映射关系就相当于一个Map(key-value这种形式)key就是请求的urlvalue就是处理的Handler。现在DispatcherServlet 将用户请求发送给处理器映射器 (HandlerMapping) 处理器映射器会根据你请求的url来找对应的处理器找不到就会报错如果找到之后这时它就会返回一个处理器执行链这个处理器执行链里面除了有Handler之外还有拦截器(这儿我们可以开发自己的拦截器)然后返回给前端控制器。 前端控制器依然不能处理这个业务请求它这时做的还有另外一件事情因为返回Handler它也不知道这个Handler是什么类型因为在spring mvc中Handler除了可以是注解形式的之外其实还可以是非注解形式的(非注解形式我们一般不用)前端控制器并不知道这个Handler到底是什么类型的那就没办法执行它那总得找个东西执行这时它就会把这个事交给另外一个组件来处理这个组件就叫处理器适配器这个处理器适配器就是来适配不同类型的Handler。它就会根据你不同类型的Handler来选择不同类型的适配器来执行它。 假如当前Handler是注解形式的那么它就会选择注解形式的处理器适配器来执行这个Handler。Handler就执行了也就是说我们Controller类中的那个方法就执行了方法执行之后里面的业务就处理了。 业务处理之后最后返回一个ModelAndView。处理器适配器拿到这个结果是没有用的它的作用就是执行这个Handler把这个Handler执行完之后它的事就做完了。 做完之后拿到这个返回结果那么它会原封不动地把这个返回结果扔给前端控制器这时处理器适配器的事就做完了。 前端控制器拿到这个ModelAndView它还是没有办法处理它还是不能返回html这时它要找到相应的jsp因为ModelAndView即包含模型又包含视图这个视图指定我们要用谁来渲染这个数据。我们要渲染数据这时它就要找一个视图解析器来解析这个视图由于这个视图也有很多种(我们最常见的视图是jsp除了jsp其实还有其他的比如说还可以是报表还可以是pdf还可以是freemaker等)它会找不同的视图解析器来处理。因为现在我们最常用的视图是jsp所以它就找到jsp对应的视图解析器。 找到这个视图解析器它来把这个视图解析解析完了之后它会返回一个View对象。 最后我们再调用这个视图解析器的渲染视图这个过程渲染视图这个过程其实就是对于我们的jsp来说就是把这个数据渲染成html。 最终渲染成html之后就响应给用户。
3、SpringMVC的使用
3.1 引入依赖
!-- https://mvnrepository.com/artifact/org.springframework/spring-context --
dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.1.11.RELEASE/version
/dependency
!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --
dependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.9.6/version
/dependency
!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --
dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.1.11.RELEASE/version
/dependency
!-- https://mvnrepository.com/artifact/org.springframework/spring-web --
dependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion5.1.11.RELEASE/version
/dependency
!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --
dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.1/versionscopeprovided/scope
/dependency
!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --
dependencygroupIdjavax.servlet.jsp/groupIdartifactIdjavax.servlet.jsp-api/artifactIdversion2.3.3/versionscopeprovided/scope
/dependency
3.2 配置web.xml
!DOCTYPE web-app PUBLIC-//Sun Microsystems, Inc.//DTD Web Application 2.3//ENhttp://java.sun.com/dtd/web-app_2_3.dtd
web-appdisplay-nameArchetype Created Web Application/display-name!-- 配置spring mvc的核心控制器 --servletservlet-nameSpringMVCDispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class!-- 配置初始化参数用于读取SpringMVC的配置文件 --init-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:springmvc.xml/param-value/init-param!-- 配置servlet的对象创建的时间点应用加载时创建。如果该元素的值为负数或者没有设置则容器会当servlet被请求的时候加载。如果值为正整数时或者0时表示容器在应用启动时就加载并初始化这个servlet值越小servlet的优先级越高越先被加载--load-on-startup1/load-on-startup
/servlet!-- 所有的请求都会执行对应的这个方法 --servlet-mappingservlet-nameSpringMVCDispatcherServlet/servlet-nameurl-pattern//url-pattern/servlet-mapping
/web-app
3.3 配置springmvc.xml
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
!-- 配置创建 spring 容器要扫描的包 --context:component-scan base-packagecom.company/context:component-scan
!-- 配置视图解析器 --bean classorg.springframework.web.servlet.view.InternalResourceViewResolverproperty nameprefix value/WEB-INF/pages//propertyproperty namesuffix value.jsp/property/bean
/beans 学习后端服务器语言
1.怎么配置接口路径 √
2.怎么编写请求方法 √
3.怎么获取参数 √
4.怎么响应数据 √ 3.4 编写controller RequestMapping注解 建立请求URL和处理方法之间的对应关系 作用到类上第一级访问路径 作用到方法上第二级访问路径
// 当用户请求路径的时候对应的方法就会被执行
// 路径的匹配方式是一级路径二级路径
Controller
RequestMapping(/user) // 配置一级路径
public class UserController {RequestMapping({/queryAll}) // 配置二级路径public void queryAll() {System.out.println(getClass().getName() queryAll);}
RequestMapping(/create)public void create() {System.out.println(getClass().getName() create);}
RequestMapping() // 二级路径也可以不写public void user() {System.out.println(getClass().getName() user);}
}
3.5 请求类型设置
3.5.1 GET请求 GetMapping GetMapping(/delete) RequestMapping的method属性(也可以不配置默认就是GET) RequestMapping(value /update, method RequestMethod.GET)
public void update() {System.out.println(getClass().getName() update);
}
3.5.2 POST请求 PostMapping PostMapping(/delete) RequestMapping的method属性 RequestMapping(value /update, method RequestMethod.POST)
public void update() {System.out.println(getClass().getName() update);
}
3.6 获取参数
3.6.1 配置过滤器解决post请求中文乱码 web.xml
!--配置解决中文乱码过滤器--
filterfilter-namecharacterEncodingFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class!--初始化参数--init-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-param
/filter
filter-mappingfilter-namecharacterEncodingFilter/filter-nameurl-pattern/*/url-pattern
/filter-mapping
3.6.2 通过HttpServletRequest参数获取
GetMapping
public void query(HttpServletRequest req) {System.out.println(req.getParameter(name));
}
3.6.3 直接在方法上定义形参
参数要和前端传的参数名一样
GetMapping(/create)
public void query(String name, Integer age) {System.out.println(name);System.out.println(age);
}
// 也可以手动指定
// 如果RequestParam指定的参数默认是必须传的如果没有会报错需要加上个requiredfalse
GetMapping(/create)
public void query(String name, RequestParam(value sex, required false) Integer age) {System.out.println(name);System.out.println(age);
}
3.6.4 使用实体类接收
参数名和属性名匹配会自动赋值
PostMapping(/update)
public void query(Student s) {System.out.println(s.getName());System.out.println(s.getId());System.out.println(s.getSex());
}
3.6.5 从路径获取
GetMapping(/delete/{name}) // 表示一个动态的值
public void query(PathVariable String name) {System.out.println(name);
}
3.7 Restful风格规范
Restful 一种软件架构风格、设计风格而不是标准只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁更有层次更易于实现缓存等机制
增、删、改、查分别和POST、DELETE、PUT、GET 传统写法 增xxx/user/create post 删xxx/user/delete get 改xxx/user/update post 查xxx/user/query post/get Restful风格 增xxx/user post 删xxx/user delete 改xxx/user put 查xxx/user get GetMapping()
public void user() {}
PutMapping()
public void update() {}
DeleteMapping()
public void delete() {}
4、小结
本章节我们学习了MVC三层模型、理解了什么是SpringMVC、SpringMVC的工作流程、学会使用SpringMVC封装不同请求、接收参数可以发现使用SpringMVC写一个接口可以使用javaWeb方便多了所以这也是为什么SSM比较流行的一个原因之一了。
下移章节我们将会对SpringMVC的后续内容继续学习掌握SpringMVC的开发方式。