JAVAMVC框架之SPRINGMVC

欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系。本系列教程希望您能站在上帝的角度去观察(了解)Java体系。使Java的各种后端技术在你心中模块化;让你在工作中能将Java各个技术了然于心;能够即插即用。本章我们来一起了解Java的MVC框架之SpringMVC。

Java语言现在应用比较多的MVC框架有SpringMVC,Struts2两种。本章我们就来讲解SpringMVC,对于本篇SpringMVC本篇不会介绍其详细知识点及具体应用,Spring系列详细使用和高级应用相关知识都在第四章:Spring专栏进行讲解,本篇将会介绍SpringMVC的基础相关概念,这些基础概念是很重要的,它就如同盖房子的基石。本章示例源码下载

什么是MVC?

不可免俗地我还是想在本章开始与大家一起回顾一下什么是MVC?MVC其实就是一种软件的设计模式。在开发中并没有强制我们必须去遵循这种设计模式,但是遵循MVC模式会使我们系统层次更清晰;职责更明确;扩展性更强;耦合度降低。

什么是SpringMVC?

SpringMVC就是一个严格遵循MVC设计模式的框架。说其是一个框架,那么SpringMVC框架中就应该有与Model,View,Controller相对应的组件;分别是Model模型对象,视图解析器,Controller控制器。

Spring MVC属于SpringFrameWork的后续产品,SpringMVC对于构建WEB项目而言是可选的,如果你使用Spring框架,你可以选择使用SpringMVC或者集成其他MVC框架。同时Spring MVC分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制。

为什么使用SpringMVC?

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

SpringMVC请求流程

  1. 用户发起请求到DispatchServlet
  2. Handler Mapping匹配请求信息的Handler(匹配条件:请求路径,方法,header信息)
  3. HandlerMapping向DispatchServlet返回handler,返回过程执行拦截器链(一系列拦截器Interceptor)
  4. 请求HandlerAdapter执行Handler
  5. HandlerAdapter根据Handler类型执行不同的Handler(处理器)
  6. Handler执行完毕返回给HandlerAdapter(处理器适配器)ModelAndView对象
  7. HandlerAdapter将ModelAndView返回给DispatchServlet
  8. DispatchServlet请求ViewResolver解析ModelAndView
  9. ViewResolver向DispatchServlet返回View
  10. DispatchServlet将View和模型数据进行视图渲染
  11. DispatchServlet向用户响应结果

SpringMVC常用组件

前端控制器DispatcherServlet

接受请求,响应结果,相当于转发器,中央处理器,减少了与其他组件之间的耦合度

处理器映射器HandlerMapping

根据规则查找需要执行的Handler

处理器适配器HandlerAdapter

根据Handler类型,寻找相应处理器执行Handler

处理器 Handler

可以实际处理请求的方法,如被@RequestMapping标注的方法

视图解析器 ViewResolver

进行视图解析,根据逻辑视图名解析成真正的视图(view)

视图View

View是一个接口,实现类支持不同的view类型(jsp,framemark,pdf…)

文件上传解析器MultipartResolver

 用于处理上传请求

配置SpringMVC

典型的XML配置方式

复制代码

<?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>

复制代码

从Servlet3.0开始,可以完全脱离XML对SpringWeb项目进行配置

复制代码

/**
 * @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校验。

Spring Validator参数校验Spring Validator参数示例源码下载

复制代码

    @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校验源码下载

Spring在3.1的时候增加了对JSP-303 Bean Validation规范的支持,不仅可以对SpringMVC进行校验,还可以对Hibernate的对象存储进行校验,是一个通用的校验框架,在开发中我们都是用JSP-303 Bean Validation进行校验,也是个人推荐使用的。

hibernate-validator依赖

复制代码

<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>

复制代码

在接收参数时使用@Valid进行校验

复制代码

    @RequestMapping("sayhello")
    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);
        }
    }

复制代码

使用下面注解对参数进行约束Bean Validation 中内置的 constraint

注解

作用

@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

计算合法性

来源:https://www.cnblogs.com/jimisun/p/9720684.html

郑州不孕不育哪家好

郑州最好的人流医院

郑州男性医院哪家好

郑州最好的人流医院

猜你喜欢

转载自blog.csdn.net/qq_42606051/article/details/82897966