初认SpringMVC
目录
- 介绍Spring
- 介绍Spring Framework
- IOC 和AOP
- Spring MVC介绍
- Hello World
Spring
Spring Framework Spring框架(Spring:一般都是指这个)
Spring boot Spring快速开发框架
Spring Cloud Spring 微服务
Spring FrameWork 七大核心模块
- Spring Core : 核心容器提供与Spring 框架基本功能。核心容器的主要组件时BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(loc)
模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
- Spring Context:Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如 JNDL, EJB, 电子邮件,国际化,校验和调度功能。
- Spring AOP:通过配置管理特征,Spring AOP 模块直接将面向方面的编程功能集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何对象AOP。Spring
AOP 模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用Spring AOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。
- Spring DAO: JDBC DAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常结构层次简化了错误处理。并且
极大的降低了需要编写的异常代码数量(例如打开连接和关闭连接)。Spring DAO的面向JDBC的异常遵从通用的DAO异常层次结构。
- Spring ORM: Spring框架插入若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO,Hibernate和IBatis SQL Map。所有这些都遵从Spring的通用事务和DAO
异常层次结构。
- Spring Web:Web 上下文模块建立在应用程序上下文模块之上,为基于web的应用程序提供了上下文。所以,Spring框架支持与Jakarta Struts的集成。
WEB模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
- Spring Web MVC:mvc框架是一个全功能的构建Web应用程序的mvc的实现。通过策略接口,MVC框架变成为高度可配置的,MVC容纳了大量视图技术,其中包括JSP POL iText。
对应的JDK版本
- 适用于Spring Framework5.x的JDK8+
- 用于Spring Framework 4.x的JDK6+
- JDK 5+ for Spring Framework 3.x
IOC和AOP
- IOC,控制反转
不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务器连接,但在配置文件中描述哪一个组件需要那一项服务。容器(在Spring框架中是IOC容器)负责将这些联系在一起。
- AOP,面向切面编程
AOP是一种编程技术,它允许程序员在横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。
Spring Web MVC 是什么?
Spring Web MVC :是一种基于java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了mvc架构模式的思想,将web层进行职责解耦,基于请求驱动就是指的使用请求-响应模型,框架的目的就是帮我们简化开发,Spring Web MVC也就是要简化我们日常对WEB的开发
Spring Web MVC能帮我们做什么
- 让我们能非常简单的设计出干净的Web层和薄薄的Web层(web层就是controoler层)。
- 进行更简洁的Web层开发。
- 天生与Spring框架集成(如IOC容器,AOP等)。
- 提供强大的约定大于配置的锲约式的编程支持。
- 能简单的支持web层的单元测试。
- 支持灵活的URL到页面控制层的映射。
- 非常容易与其他视图集成,如Velocity. FreeMarker 等等,因为模型数据不放在特定的API里,而是放在一个Model里(Map数据结构化实现,因此很容易被其它框架使用)。
- 非常灵活的数据验证,格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定的框架API。
- 提供一套强大的JSP标签库,简化jsp开发。
- 支持的灵活本地化,主题等解析。
- 更加简单的异常处理。
- 对静态资源的支持。
- 支持Restful风格。
Web开发中的请求-响应模式
因此,在web的世界里:都是Web客户发起请求,Web服务器接受,处理并响应。
一般Web服务器是不能主动通知Web客户端更新内容。
虽然现在有些技术如服务器推(如Comet),还有现在的HEML5 ,websocket可以实现web服务器主动通知Web客户端。
SpringMVC 工作原理
上面这张图很重要,希望大家能好好看。
第一个例子 Hello World!
下载spring框架jar (我使用的版本是 4.x)
依赖jar包:
1》Spring框架框架依赖的jar包:需要添加Apache commons logging 日志,此处使用的是commons.logging-1.1.1.jar.
2》需要添加jstl标签库支持,此处使用的是jstl-1.1.2.jar.
百度网盘:链接:https://pan.baidu.com/s/1oEcAcTXs8dpRRPHpwz1LCw 提取码:4idj (包括依赖的jar也在里面)
代码:
1,新建一个web项目
在web.xml文件中配置
<servlet> <servlet-name>demo1</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo1</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
自此请求已交给Spring Web MVC 框架处理,因此我们需要配置Spring 的配置文件,默认DispatcherServlet 会加载WEB-INF/[DispatcherServlet 的servelt的名字 ]-servelt.xml配置文件。
本例子为 WEB-INF/demo1-servlet.xml。
在Spring配置文件中(demo1-servlet.xml)配置ViewResolver(视图解析器)demo1-servlet.xml文件需要放在WEB-INF下
<!-- ViewResolver 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <!-- 映射视图路径 --> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- 映射视图后缀 --> <property name="suffix" value=".jsp"/> </bean>
InternalResourceViewResolver :用于支持Servlet,jsp视图解析
viewClass:JstlView表示 JSP 模板页面需要使用 JSTL 标签库,classpath中必须包含jstl的相关jar包
(如果想换其他模板引擎,就修改这里,如:freemarker)
prefix和suffix:查找视图页面的前缀和后缀(前缀【逻辑视图名】后缀),比如传进来的逻辑视图名为hello,则该jsp视图页面应该存放在“WEB-INF/JSP/HELLO.JSP”.
开发处理器/页面控制器(也在demo1-servlet.xml中配置)
<!-- 配置处理器 --> <bean name="/hello" class="indi.xiaoen.demo1.web.HelloWorldController"/>
name:表示如果请求的URL为 “上下文/hello”,则将会交给该bean进行处理。
class:为自定义控制器的类路径。
控制器类:HelloWorldControoler
/** 控制器实现 Controller接口 */ public class HelloWorldController implements Controller { /** * 重写 handleRequest 方法 */ @Override public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception { //1、收集参数、验证参数 //2、绑定参数到命令对象 //3、将命令对象传入业务对象进行业务处理 //4、选择下一个页面 ModelAndView mv = new ModelAndView(); //添加模型数据 可以是任意的POJO对象 mv.addObject("message", "Hello World!"); //设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面 mv.setViewName("hello"); return mv; } }
开发视图页面
创建/WEB-INF/jsp/hello.jsp 视图界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello World</title> </head> <body> 是否获取到了Request 里的message :${requestScope.message}<br> 是否获取到了Session 里的message :${sessionScope.message} </body> </html>
ModelAndView.addObject 作用范围是:request
运行项目
- 地址栏输入:http://localhost:8080/demo1/hello
- 看是否看到hello world
ModelAndView
- 控制器处理方法的返回值如果结果为:ModelAndView,则其既包含视图信息,也包含模型数据信息。
- 添加数据模型:
ModelAndView addObject(String attributeName, Object attributeValue)
ModelAndView addAllObjects(Map<String, ?> modelMap)
- 设计视图
void setViewName(String viewName) void setView(View view)
运行步骤
1、 首先用户发送请求 http://localhost:8080/demo1/hello——>web 容器,web 容器根据“/hello”路径映射到 DispatcherServlet(url-pattern 为/)进行处理; 2、 DispatcherServlet——>BeanNameUrlHandlerMapping 进行请求到处理的映射,BeanNameUrlHandlerMapping 将 “/hello”路径直接映射到名字为“/hello”的 Bean 进行处理,即 HelloWorldController,BeanNameUrlHandlerMapping 将其包装为 HandlerExecutionChain(只包括 HelloWorldController 处理器,没有拦截器); 3、 DispatcherServlet——> SimpleControllerHandlerAdapter,SimpleControllerHandlerAdapter 将 HandlerExecutionChain 中的处理器(HelloWorldController)适配为 SimpleControllerHandlerAdapter; 4、 SimpleControllerHandlerAdapter — — > HelloWorldController 处理器 功 能 处 理 方 法 的 调 用 , SimpleControllerHandlerAdapter 将会调用处理器的 handleRequest 方法进行功能处理,该处理方法返回一 个 ModelAndView 给 DispatcherServlet; 5、 hello(ModelAndView 的逻辑视图名)——>InternalResourceViewResolver, InternalResourceViewResolver 使用 JstlView,具体视图页面在/WEB-INF/jsp/hello.jsp; 6、 JstlView(/WEB-INF/jsp/hello.jsp)——>渲染,将在处理器传入的模型数据(message=HelloWorld!)在视图中展示出 来; 7、 返回控制权给 DispatcherServlet,由 DispatcherServlet 返回响应给用户,到此一个流程结束。
POST中文乱码解决方案(wen.xml文件中配置)
<!--使用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>
ok ,希望大家好好看。然后有疑问可以评价或加我微信18179068936来咨询。谢谢大家!