共计 9796 个字符,预计需要花费 25 分钟才能阅读完成。
概述
- 是 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 用来删除资源
注解
-
@RequestMapping
- 为控制器指定可解决那些申请,进而确定执行那个办法
- 定义类上:提供初步的申请映射信息
- 定义方法上:提供细分的映射信息
-
属性
- 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}”)
- @PathVariable(“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
- 映射申请头信息
- 将申请报头的属性值绑定到解决办法的形参中
- 申请头蕴含若干属性,服务器可据此获知客户端信息
-
属性
- value:申请头参数的参数名
-
@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 接口实现,实现类为 CommonsMultipartResolver
-
CommonsMultipartResolver 配置
- 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 层形参类型为 MultipartResolver
- 获取上传文件名办法:getOriginalFilename()
- 获取文件输出流:getInputStream()
- 将文件写入磁盘: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 // 标注在继承此类的类上或产生异样的办法上
- value:状态码
- reason:信息
-
- 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 相干技术文章或行业资讯,欢送大家关注和转发文章!
正文完