JavaMVC框架之SpringMVC
欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系。本系列教程希望您能站在上帝的角度去观察(了解)Java体系。使Java的各种后端技术在你心中模块化;让你在工作中能将Java各个技术了然于心;能够即插即用。本章我们来一起了解Java的MVC框架之SpringMVC。
Java语言现在应用比较多的MVC框架有SpringMVC,Struts2两种。本章我们就来讲解SpringMVC,对于本篇SpringMVC本篇不会介绍其详细知识点及具体应用,Spring系列详细使用和高级应用相关知识都在第四章:Spring专栏进行讲解,本篇将会介绍SpringMVC的基础相关概念,这些基础概念是很重要的,它就如同盖房子的基石。本章示例源码下载
什么是MVC?


为什么使用SpringMVC?
- 学习门槛低,容易上手
- SpringMVC继承了Spring框架的灵活性,容易扩展
- Spring将控制器,模型对象,过滤器等分离,使组件之间松耦合
- 支持多种视图
- 轻松使用Spring生态下的其他组件

- 用户发起请求到DispatchServlet
- Handler Mapping匹配请求信息的Handler(匹配条件:请求路径,方法,header信息)
- HandlerMapping向DispatchServlet返回handler,返回过程执行拦截器链(一系列拦截器Interceptor)
- 请求HandlerAdapter执行Handler
- HandlerAdapter根据Handler类型执行不同的Handler(处理器)
- Handler执行完毕返回给HandlerAdapter(处理器适配器)ModelAndView对象
- HandlerAdapter将ModelAndView返回给DispatchServlet
- DispatchServlet请求ViewResolver解析ModelAndView
- ViewResolver向DispatchServlet返回View
- DispatchServlet将View和模型数据进行视图渲染
- DispatchServlet向用户响应结果
|
前端控制器DispatcherServlet
|
接受请求,响应结果,相当于转发器,中央处理器,减少了与其他组件之间的耦合度
|
|
处理器映射器HandlerMapping
|
根据规则查找需要执行的Handler
|
|
处理器适配器HandlerAdapter
|
根据Handler类型,寻找相应处理器执行Handler
|
|
处理器 Handler
|
可以实际处理请求的方法,如被@RequestMapping标注的方法
|
|
视图解析器 ViewResolver
|
进行视图解析,根据逻辑视图名解析成真正的视图(view)
|
|
视图View
|
View是一个接口,实现类支持不同的view类型(jsp,framemark,pdf…)
|
|
文件上传解析器MultipartResolver
|
用于处理上传请求
|
配置SpringMVC
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!--加载数据字典-->
<context:property-placeholder location="classpath:resource.properties"/> <!--配置默认的Servlet作为静态资源的Handler-->
<mvc:default-servlet-handler/> <!-- 注解驱动:作用:替我们自动配置最新版的注解的处理器映射器和处理器适配器-->
<mvc:annotation-driven/> <!-- 配置@Controller注解扫描 -->
<context:component-scan base-package="com.jimisun.controller"></context:component-scan> <!--配置InternalResourceViewResolver视图解析器解析返回数据-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="cache" value="false"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
<property name="contentType" value="text/html;charset=UTF-8"/>
</bean> <!--配置自定义exceptionResolver异常解析器处理异常-->
<bean id="exceptionResolver" class="com.jimisun.exception.MyExceptionResolver"/> <!--配置文件上传-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="104857600"/>
<property name="maxInMemorySize" value="4096"/>
<property name="defaultEncoding" value="UTF-8"></property>
</bean> <!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截路径规则-->
<mvc:mapping path="/user/**"/>
<!--排除路径-->
<mvc:exclude-mapping path="/user/login.html"></mvc:exclude-mapping>
<mvc:exclude-mapping path="/user/register.html"></mvc:exclude-mapping>
<bean id="viewLoginInterceptor" class="com.jimisun.interceptor.ViewLoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors> </beans>
/**
* @Author:jimisun
* @Description:
* @Date:Created in 19:42 2018-09-28
* @Modified By:
*/
public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
} @Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
} @Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
SpringMVC单元测试 单元测试示例源码下载
/**
* @Author:jimisun
* @Description:
* @Date:Created in 07:58 2018-09-25
* @Modified By:
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath:SpringMvc.xml",
})
public class TestControllerTest { @Autowired
private TestService testService; @Test
public void sayhello() {
String test = testService.sayHelloService("test");
System.out.println(test);
}
}
验证Web请求参数
对于Controller接收到的参数,几乎在所有情况下我们都需要验证,SpringMVC开发中常用的验证方法有两种,Spring框架定义Validator校验和JSP-303 Bean Validation校验。
@RequestMapping("sayhello")
public void sayhello(@Validated User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
System.out.println(bindingResult.getFieldError().getDefaultMessage());
} else {
String s = testService.sayHelloService(user.getUsername());
System.out.println(s);
}
JSP-303 Bean Validation校验 Bean Validation校验源码下载
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.4.Final</version>
</dependency>
相关配置
<mvc:annotation-driven validator="validator"/>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名 -->
<property name="basename" value="classpath:validationMessages"/>
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="fileEncodings" value="GBK"/>
<property name="defaultEncoding" value="GBK"/>
<property name="cacheSeconds" value="120"/>
</bean>
public void sayhello(@Valid User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
System.out.println(bindingResult.getFieldError().getDefaultMessage());
} else {
String s = testService.sayHelloService(user.getUsername());
System.out.println(s);
}
}
使用下面注解对参数进行约束
|
注解
|
作用
|
|
@Valid
|
被注释的元素是一个对象,需要检查此对象的所有字段值
|
|
@Null
|
被注释的元素必须为 null
|
|
@NotNull
|
被注释的元素必须不为 null
|
|
@AssertTrue
|
被注释的元素必须为 true
|
|
@AssertFalse
|
被注释的元素必须为 false
|
|
@Min(value)
|
被注释的元素必须是一个数字,其值必须大于等于指定的最小值
|
|
@Max(value)
|
被注释的元素必须是一个数字,其值必须小于等于指定的最大值
|
|
@DecimalMin(value)
|
被注释的元素必须是一个数字,其值必须大于等于指定的最小值
|
|
@DecimalMax(value)
|
被注释的元素必须是一个数字,其值必须小于等于指定的最大值
|
|
@Size(max, min)
|
被注释的元素的大小必须在指定的范围内
|
|
@Digits (integer, fraction)
|
被注释的元素必须是一个数字,其值必须在可接受的范围内
|
|
@Past
|
被注释的元素必须是一个过去的日期
|
|
@Future
|
被注释的元素必须是一个将来的日期
|
|
@Pattern(value)
|
被注释的元素必须符合指定的正则表达式
|
Hibernate Validator 附加的 constraint
|
注解
|
作用
|
|
@Email
|
被注释的元素必须是电子邮箱地址
|
|
@Length(min=, max=)
|
被注释的字符串的大小必须在指定的范围内
|
|
@NotEmpty
|
被注释的字符串的必须非空
|
|
@Range(min=, max=)
|
被注释的元素必须在合适的范围内
|
|
@NotBlank
|
被注释的字符串的必须非空
|
|
@URL(protocol=,
host=, port=,
regexp=, flags=)
|
被注释的字符串必须是一个有效的url
|
|
@CreditCardNumber
|
被注释的字符串必须通过Luhn校验算法,
银行卡,信用卡等号码一般都用Luhn
计算合法性
|
Java开发之上帝之眼系列教程其他文章
勘误&感谢
本系列文章资料来源很多出自于互联网和在下本身的见解,受限于个人技术能力水平和其他相关知识的限制,相关见解错误或者资料引用错误请各位帮助留言校正!引用资料多来自于互联网,在下在引用前会遵循各位前辈或者博主的引用说明表示感谢,但互联网资料多是转发再转发或存在遗漏请原作者内信联系指正。
JavaMVC框架之SpringMVC的更多相关文章
- Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World(转发)
[JSP]Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World 来源:http://blog.csdn.net/zhshulin/article/de ...
- Struts2框架和SpringMvc框架的区别
Struts2框架和SpringMvc框架的区别 一.拦截机制的不同 Struts2是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域 ...
- [JSP]Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World
来源:http://blog.csdn.net/zhshulin/article/details/37956105?utm_source=tuicool&utm_medium=referral ...
- Apache Shiro权限框架在SpringMVC+Hibernate中的应用
在做网站开发中,用户权限必须要考虑的,权限这个东西很重要,它规定了用户在使用中能进行哪 些操作,和不能进行哪些操作:我们完全可以使用过滤器来进行权限的操作,但是有了权限框架之后,使用起来会非常的方便, ...
- web框架之Spring-MVC环境搭建
spring框架配置 1.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app ...
- web框架之Spring-MVC环境搭建(转)
spring框架jar包 1.下载spring源包spring地址:http://www.springsource.org/download我下的是spring-framework-3.1.0.REL ...
- 《经久不衰的Spring框架:SpringMVC 统括》
前言:经久不衰的Spring 这几年,前端技术更新换代速度之快,每一年"最火的前端技术"排行榜都会换一番场景,本当に信じかねる.是"只闻新人笑不见旧人哭",还是 ...
- 整合最优雅SSM框架:SpringMVC + Spring + MyBatis
我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配 ...
- 最优雅SSM框架:SpringMVC + Spring + MyBatis
在写代码之前我们先了解一下这三个框架分别是干什么的? 相信大以前也看过不少这些概念,我这就用大白话来讲,如果之前有了解过可以跳过这一大段,直接看代码! SpringMVC:它用于web层,相当于con ...
随机推荐
- USB2.0学习笔记连载(三):通用USB驱动程序解析
对于USB驱动的开发,读者可以使用Windows DDK.DriverStudio等多种开发工具来实现USB的驱动,但是驱动程序的开发过程都比较复杂,而且很容易致使USB主机内存泄露而死机.那么对于笔 ...
- linux 打包 解压 tar zip tgz
.tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)------------------------- ...
- e668. 在一组像素中创建缓冲图像
This example demonstrates how to convert a byte array of pixel values that are indices to a color ta ...
- Ubuntu adb devices : no permissions 解决方法
ntun下USB连接Android手机后,使用adb devices 出现如下: List of devices attached ???????????? no permissions 同时在DDM ...
- CentOS 6.5 下Vim 配置图解
分享个CentOS 6.5 下Vim 配置图文详解,希望对大家有所帮助. 1. 登录并进入你常用的用户名下,查看其主目录 命令: # su xxx $ cd xxx $ ls -a 2.查看并建立目录 ...
- 【Java面试题】4 静态变量和实例变量的区别?详细解析
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加.在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量.静态变 ...
- CSS导入使用及引用的两种方法
方法一<link rel="stylesheet" type="text/css" href="test.css"> 方法二&l ...
- 编写Unity3D着色器的三种方式
不管你会不会写Unity3D的shader,估计你会知道,Unity3D编写shader有三种方式,这篇东西主要就是说一下这三种东西有什么区别,和大概是怎样用的. 先来列一下这三种方式: fixed ...
- 关于NoSQL与SQL的区别
简单说来:sql是关系型数据库的结构化查询语言,而nosql,一般代指菲关系型数据库,sql语句就不能用来,不过有些有leisql的查询语言,且nosql数据库没有统一的查询语言. 相关参考文章阅读: ...
- go语言的time.Sleep
首先:time.sleep单位为:1ns (纳秒) 转换单位: 1纳秒 =1000皮秒 1纳秒 =0.001 微秒 1纳秒 =0.000 001毫秒 1纳秒 =0.0 ...