概述
- 是Spring为展示层提供的基于MVC设计理念的Web框架,经过一套MVC注解,让POJO成为处理请求的控制器,而无需实现任何接口
- 支持REST风格的URL请求
- 采用松散耦合的可插拔组件结构,比其余MVC框架更具扩展性和灵活性
- SpringMVC的IOC容器是Spring的IOC容器的子容器,故而可引用Spring的IOC中的bean,反之则不行
运行流程
- 当前端发出请求时,首先进入到DispatcherServlet(中央控制器),把请求的地址传给HandlerMapping处理器映射器中进行比对(Handler即包含了咱们请求的Controller类和Method方法的对象)
- 未找到则表示静态资源,进入defaultServlet处理器,返回前端
- 找到则表示动态资源,调用AdapterMap数据适配器,获取该资源的执行列表(目标方法,拦截器方法),并返回处理器执行链(HandlerExecutionChain)给中央控制器
- 中央控制器将结果交给HandlerAdapter处理器适配器,依次执行执行列表的方法,返回逻辑视图ModelAndView给中央控制器
- 将结果交给ViewResolver视图解析器,遍历生成具体的View物理视图
- 中央控制器调用render方法渲染视图,即将数据文件转化成可视化界面返回前端
步骤
- 导入jar包,在web.xml中配置中央控制器DispatcherServlet,加入SpringMVC配置文件
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置中央控制器的初始化参数:配置文件的位置和名称 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 默认为WEB-INF/<servlet-name>-servlet.xml -->
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<!-- 配置servlet被加载的前后顺序 -->
<!-- 为负数或者没有设置,则容器会当Servlet被请求时再加载 -->
<!-- 为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet -->
<!-- 值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会本身选择顺序来加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- 编写处理请求的处理器并标识@Controller,编写视图
- 使用@RequestMapping("/地址") //映射请求的URL,可放在类与方法上,方法返回值进入视图解析器(使用@GetMapping("/地址")响应get请求,@PostMapping("/地址")响应post请求)
<!--注解驱动,以使得访问路径与方法的匹配能够经过注解配置-->
<mvc:annotation-driven />
<!-- 在配置dispatchServlet时配置<url-pattern>/</url-pattern>拦截全部请求,这时候dispatchServlet彻底取代了default servlet,将不会再访问容器中原始默认的servlet,而对静态资源的访问就是经过容器默认servlet处理的,故而这时候静态资源将不可访问,使用下列标签访问静态资源 -->
<mvc:default-servlet-handler/>
- 在SpringMVC配置文件中配置要扫描的包,配置视图解析器
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/响应地址前缀/"></property>
<property name="suffix" value=".后缀"></property>
</bean>
REST
- 资源表现层状态转换,是一种互联网软件架构
- 资源:网络上的一个实体即一个具体信息,可为一段文字,一张图片,一种服务,总之是一个具体的存在,能够用URI指向它,每种资源对应一个特定的URI,访问URI可获取这个资源
- 表现层:把资源具体呈现出来的形式,就为表现层,如txt、json、html、二进制等
- 状态转化:每发出一次请求,就表明客户端和服务器的一次交互过程,http为无状态协议,全部的状态保存在服务器中,所以要想操做服务器,必须经过某种手段,让服务器发生状态转化。Http协议里有四种基本操做:GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源
注解
-
@RequestMappinghtml
- 为控制器指定可处理那些请求,进而肯定执行那个方法
- 定义类上:提供初步的请求映射信息
- 定义方法上:提供细分的映射信息
- 属性
- value:请求url
- method:请求方法(RequestMethod.get,RequestMethod.post)多值用数组
- params:请求参数
- 值可以使用简单表达式,例!p表示请求参数不能包含p
- params={“name”,“age!=10”} 参数age不为10
- heads:请求头
- 值可以使用简单表达式,heads={“Accept-Language=en-US,zh”}
- 可联合使用,使请求更加精确化
- 支持Ant风格匹配符
- 匹配文件名中的一个字符 ?
- 匹配文件名中的任意字符 *
- 匹配多层路径 **
- @PathVariable 用来将URL中的占位符参数绑定到目标方法的参数中
- @RequestMapping("/a/{id}")
- HiddenHttpMethodFilter 过滤器将请求转换为标准的http方法,使浏览器form表单支持put,delete请求
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- CharacterEncodingFilter 过滤器用于处理中文
<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>
- @RequestParam
- 用来映射url中请求参数
- 定义在方法形参前,给形参赋值
- 属性
- value:请求参数的参数名
- required:该参数是否必须,默认为true
- defaultValue:请求参数默认值
- @RequestHeader
- 映射请求头信息
- 将请求报头的属性值绑定处处理方法的形参中
- 请求头包含若干属性,服务器可据此获知客户端信息
- 属性
- @CookieValue
- 映射Cookie信息
- 属性与RequestParam相同
- @ResponseBody
- 标注在方法上
- 将java对象转为json格式的数据
- 将controller的方法返回的对象经过适当的转换器转换为指定的格式以后,写入到response对象的body区,一般用来返回JSON或XML数据(用于异步获取数据)
- 在使用此注解以后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于经过response对象输出指定格式的数据
- 所需jar包:jackson-annotations-2.9.0.pr2.jar,jackson-core-2.9.0.pr2.jar,jackson-databind-2.9.0.pr2.jar
- 使用fastJSON.jar 对象转json:JSON.toJSONString(对象)
- 使用fastJSON.jar json转对象:JSON.parseObject(json,对象.class)
- @RequestBody
- 标注在形参上
- 将前台发送过来的JSON或XML数据封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter 进行解析,而后封装到形参上
- GET、POST方式提交
- 表单属性 enctype
- 可选 application/x-www-form-urlencoded
- 不能处理 multipart/form-data 格式的数据
- 必须 application/json,application/xml 格式的数据
- PUT方式提交
- 表单属性 enctype
- 必须 application/x-www-form-urlencoded
- 不能处理 multipart/form-data 格式的数据
- @initBinder
- 提供数据绑定,可对WebDataBinder对象进行初始化
- 标注方法不能有返回值
- @NumberFormat
- @DateTimeFormat
- 对日期类型属性格式化
- pattern属性:yyyy-MM-dd hh:mm:ss
处理器参数
POJO
- 普通Java类,具备一部分getter/setter方法的那种类就能够称做POJO,实际意义就是普通的JavaBeans(简单的实体类),特色就是支持业务逻辑的协助类
- SpringMVC会按请求参数名与pojo属性名进行自动匹配,自动填充属性值。且支持级联属性
servlet原生API
- HttpServletRequest
- HttpServletResponse
- HttpSession
- java.security.Principal
- Locale
- InputStream
- OutputStream
- Reader
- Writer
处理器处理模型数据
Map,Model或ModelMap类型
- 使用org.springframework.ui.Model接口存储模型数据
- 过程:在调用方法前会建立一个隐含的模型对象做为存储容器,若是参数是Map或Model类型,则将模型的引用传递给参数,从而经过参数对象访问模型中的数据或向模型中添加新属性数据
- 添加Map.put(“对象名”,对象值)、Model.addAttribute(“对象名”,对象值)
- 返回String类型
ModelAndView类型
- 包含视图与模型信息
- ModelAndView ret = new ModelAndView(); //实例化
- ret.add(“对象名”,对象值) //添加数据到ModelAndView中
- SpringMVC会把ModelAndView的Model中的数据放到request域对象中
- 返回ModelAndView类型
@SessionAttributes
- 用于在多个请求之间公用某个模型属性数据
- 标注在控制器类上,使属性暂存在HttpSession中,属性就可在session中获取
- 属性
- value={属性名}
- types={属性类型.class}
@ModelAttribute
- 标注在方法上,使每一个目标方法执行以前被SpringMVC调用将标注方法的属性赋值给对应参数
- 标注在pojo类型形参前,使形参为被@ModelAttribute标注的方法的属性
- 注:在标注方法中放入map中的键与目标方法形参一致(首字母小写)
视图解析器
- 对于返回String,View,ModeMap等类型,SpringMVC会在内部将它们装配成一个ModelAndView对象,包含逻辑名和模型对象的视图,借助视图解析器最终获得视图对象View
- 视图的做用是渲染模型数据,将模型里的数据以某种形式呈现给客户
- 视图对象由视图解析器负责实例化。因为视图是无状态的,因此他们不会有线程安全的问题。所谓视图是无状态的,是指对于每个请求,都会建立一个View对象
- JSP是最多见的视图技术,结合JSTL使用
- 经常使用视图解析器实现类
- BeanNameViewResolver:将逻辑视图解析为一个bean,bean的id等于逻辑视图名,自动根据咱们的视图名找到对应的视图Bean进行解析
- InternalResourceViewResolver:将视图名解析为一个url文件,会把 Controller 处理器方法返回的模型属性都存放到对应的 request 属性中,而后经过 RequestDispatcher 在服务器端把请求 forword 重定向到目标 URL
- 多个解析器可经过order属性来指定优先级,越小优先级越高
转向与重定向
- 通常状况下控制器方法返回字符串类型的值会被视图解析器处理
- 若返回字符串带有前缀,则作特殊处理,把其后字符串做为url
- 重定向:在返回值前加redirect:
- 转向:在返回值前加forward:
配置文件标签
- <mvc:annotation-driven/> //注解驱动
- 自动注册 RequestMappingHandlerMapping,RequestMappingHandlerAdapter 与 ExceptionHandlerExceptionResolver 三个bean(3.1以上)
- 自动为咱们将扫描到的@Component,@Controller,@Service,@Repository等注解标记的组件注册到工厂中,来处理咱们的请求,而<context:component-scan/>标签是告诉Spring 来扫描指定包下的类,并注册被上述注解标记的组件
- <mvc:default-servlet-handler/>
- 会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,若是发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,若是不是静态资源的请求,才由DispatcherServlet继续处理
- 通常Web应用服务器默认的Servlet名称是"default",所以DefaultServletHttpRequestHandler能够找到它。若是你全部的Web应用服务器的默认Servlet名称不是"default",则须要经过default-servlet-name属性显示指定
- <mvc:view-controller>
- 发送的请求不想经过controller,只想直接地跳转到目标页面
- path=“访问的路径”(至关于RequestMapping(“访问的路径”))
- view-name=“跳转的视图” (至关于return “跳转的视图”)
- 必须配置 <mvc:annotation-driven />
- 与处理器相同则失效
文件上传
-
所需jar包:commons-fileupload-1.3.2.jar,commons-io-2.5.jar前端
-
SpringMVC经过即插即用的MultipartResolver接口实现,实现类为CommonsMultipartResolverjava
-
CommonsMultipartResolver配置web
- defaultEncoding必须与jsp页面pageEncoding属性一致
- jsp页面表单属性enctype 必须 enctype=“multipart/form-data”
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<!--文件大小限定-->
<property name="maxUploadSize" value="5242880"></property>
</bean>
-
controller层形参类型为MultipartResolverspring
-
获取上传文件名方法:getOriginalFilename()sql
-
获取文件输入流:getInputStream()json
-
将文件写入磁盘:transferTo(路径)数组
-
获取随机数 UUID uuid=UUID.randomUUID()浏览器
- 定义为上传文件名String filePreName=uuid.toString().replaceAll("-", “”)
文件下载
- 1.可经过连接直接下载特定的后缀的文件
- 2.经过附件方式
- 建立一个文件输入流 InputStream is=new FileInputStream(文件路径)
- 转成字符数组 byte[] data=new byte[is.available()]
- 写入流 is.read(data);
- 实例化头部对象 HttpHeaders headers=new HttpHeaders()
- 转码 String name=new String(readFileName.getBytes(“UTF-8”),“ISO8859-1”)
- 设置附件 headers.setContentDispositionFormData(“attachment”, name)
- 设置资源类型headers.setContentType(MediaType.APPLICATION_OCTET_STREAM)
- 数据加入到附件中 ResponseEntity<byte[]> entity=new ResponseEntity<byte[]>(data, headers, HttpStatus.OK)
拦截器
- 与过滤器不一样的是拦截器拦截动态资源,即全部被@RequestMapping,@GetMapping ,@PostMapping标注的资源
- 实现HandlerInterceptor接口
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) //目标方法以前执行,返回true表示放行
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) //目标方法执行结束以后执行
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) //页面销毁时执行
- 拦截器配置
<mvc:interceptors>
<!--自定义拦截器-->
<bean class="拦截器类路径"></bean>
<!--选择拦截-->
<mvc:interceptor>
<!--拦截路径,**表明路径及子路径-->
<mvc:mapping path="/**"/>
<!--不拦截路径-->
<mvc:exclude-mapping path="/路径"/>
<bean class="拦截器类路径"></bean>
</mvc:interceptor>
</mvc:interceptors>
异常处理
- 经过HandlerExceptionResolver接口处理异常,包括Handler映射,数据绑定以及目标方法执行发生的异常
- ExceptionHandlerExceptionResolver实现类经过<mvc:annotation-driven/>加载
- @ControllerAdvice //标注在自定义处理异常类上
- 先找当前Handler中的@ExceptionHandler,若未找到匹配的异常类,则去ControllerAdvice标记的类中查找
- @ExceptionHandler({异常类.class}) //标注在异常方法上发生此异常类自动执行方法处理异常,处理内部异常
- ResponseStatusExceptionResolver实现类
- @ResponseStatus //标注在继承此类的类上或发生异常的方法上
- DefaultHandlerExceptionResolver实现类处理特殊异常,例请求方法异常
- SimpleMappingExceptionResolver实现类
- 可将不一样的异常映射到不一样的jsp页面(经过exceptionMappings属性的配置),同时咱们也能够为全部的异常指定一个默认的异常
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义默认的异常处理页面,当该异常类型的注册时使用 -->
<property name="defaultErrorView" value="error"></property>
<!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->
<property name="exceptionAttribute" value="ex"></property>
<!-- 定义须要特殊处理的异常,用类名或彻底路径名做为key,异常也页名做为值 -->
<property name="exceptionMappings">
<props>
<prop key="IOException">error/ioexp</prop>
<prop key="java.sql.SQLException">error/sqlexp</prop>
</props>
</property>
</bean>
导入其余配置文件
- 1.经过<import resource=“文件”/>导入
- 2.在web.xml中引入
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:文件路径</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
最后
感谢你看到这里,看完有什么的不懂的能够在评论区问我,以为文章对你有帮助的话记得给我点个赞,天天都会分享java相关技术文章或行业资讯,欢迎你们关注和转发文章!安全