SpringMVC新版本(Spring 5.3.0)官网详解(一)

56 篇文章 3 订阅
6 篇文章 0 订阅

前言

Spring MVC是Spring框架中一个非常基础又核心的理念。笔者相信大多数同学都用过,但是如果被深究起来恐怕还是说不出来什么具体的东西。这篇文章将会统一的说下什么是Spring MVC,以及在较新版本中一个Spring MVC的框架应该怎么去搭建。本篇将会给大家带来一篇纯Java版本的Spring MVC教程。更多Spring内容进入【Spring解读系列目录】

MVC 和 Spring MVC

为了照顾新人,就先说一下MVC和Spring MVC的区别。MVC是模型(model)-视图(view)-控制器(controller)的缩写,可以说是一个非常经典的软件设计的概念。Spring MVC是这种概念的一个实现,Spring公司基于这种MVC的概念开发出来Spring MVC用于形成一个规范,并提供相应的API和Plugin完成Spring公司定义的MVC模型,不得不说Spring MVC这个实现确实非常的厉害。曾经风靡一时的Struts 2也是MVC的模型之一,只不过慢慢的被Spring MVC替代掉了。一个是概念,一个是具体的实现。

Spring MVC的依赖

既然说到Spring MVC就必然少不了Spring公司提供的各种依赖包。下面就是搭建一个Spring MVC必要的maven依赖。只要这三个在porm.xml里就够了,因为Maven会自动把其他的依赖导入进来。

<!--Spring 上下文包,核心包之一-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>
<!--Spring web依赖,DispatcherServlet就在这个里面-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>
<!--servlet依赖,为了在编译时期让Spring获取Servlet,很重要-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

老版本环境配置基于XML

在老版本中,搭建一个Spring MVC一般需要在web.xml中配置DispatcherServlet对请求URL进行解析。为了让Spring能够感知到DispatcherServlet我们一般还会配置一个ContextLoaderListener,在这个之后一般还有一个Filter,其实从这个配置顺序也能看出来整个Web项目的启动顺序:ContextLoaderListener>Filter>DispatcherServlet。大概类似于下面【官网】上的配置。

<!--以下内容来自官网-->
<web-app>  
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/app-context.xml</param-value>
</context-param>
    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/app/*</url-pattern>
    </servlet-mapping>
</web-app>

那么项目里配置的ContextLoaderListener是干嘛用的呢?就是用于解析Spring.xml,就是上面的app-context.xml。对应在Java程序中使用的解析器就是ClassPathXmlApplicationContext,利用classpath下面的xml初始化应用程序的上下文。如果使用的是注解那么就是AnnotationConfigApplicationContext,利用注解的配置去初始化应用程序的上下文。当Spring环境被实例化以后,才会执行DispatcherServlet

新版环境配置基于Java

新版SpringMVC官网中已经对此做了更新的解读,以下英文部分摘自官网。

Spring MVC, as many other web frameworks, is designed around the front controller pattern where a central Servlet, the DispatcherServlet, provides a shared algorithm for request processing, while actual work is performed by configurable delegate components. This model is flexible and supports diverse workflows.

Spring MVC也是围绕着前端Controller模式设计的,它的中心控制器(也就是DispatcherServlet)为请求处理提供了一个分享算法,实际的工作是由配置的委托组件坐的。还支持不同的工作流。

The DispatcherServlet, as any Servlet, needs to be declared and mapped according to the Servlet specification by using Java configuration or in web.xml. In turn, the DispatcherServlet uses Spring configuration to discover the delegate components it needs for request mapping, view resolution, exception handling, and more.

根据Servlet的规范,DispatcherServlet需要被声明并且映射到Java配置文件或者web.xml里面。然后DispatcherServlet 就能够使用Spring配置去完成发现委托组件去完成请求映射,视图解析,异常处理等等功能。

The following example of the Java configuration registers and initializes the DispatcherServlet, which is auto-detected by the Servlet container (see Servlet Config):

上面废话了一堆,终于到了实用的地方了。一个官方提供的Java Sample来展示怎么样使用一个Java的配置去完成DispatcherServlet的注册和初始化的,而且可以自动被Servlet容器探测到:

public class MyWebApplicationInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) {
        // Load Spring web application configuration
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(AppConfig.class);
        // Create and register the DispatcherServlet
        DispatcherServlet servlet = new DispatcherServlet(context);
        ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
        registration.setLoadOnStartup(1);
        registration.addMapping("/app/*");
    }
}

简单来说,新的Spring官网希望用户自己写一个初始化类并且实现WebApplicationInitializer里面的onStartup()方法去完成一个Spring-Web项目的初始化。也就是说当实现onStartup()的时候,Spring容器会自动把所有的Web环境调用起来。

Spring MVC Sample

既然Spring已经把话放出来了,那么就写一个例子去验证下怎么用的,根据官网介绍和以前的经验我们应该有如下的事情要做。

  1. 初始化Spring Context。
  2. 添加一个 DispatcherServlet。

根据以往经验和刚刚学习的知识,添加DispatcherServlet有下面三种方法。

  • a. 在web.xml中添加。
  • b. @WebServlet,直接在Servlet添加这个注解,就会被认为是一个Servlet。
  • c. 直接new添加DispatcherServlet扔给Tomcat,本篇博客主要介绍的内容。

WebApplicationInitializer

既然知道要创建这个类,那么就把它创建出来。

public class MyWebApplicationInitial implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
	    //这里注意是WebApplicationContext,和之前的博客里的类不一样了
        AnnotationConfigWebApplicationContext anno=new AnnotationConfigWebApplicationContext();
        //稍后在创建配置类AppConfig
        anno.register(AppConfig.class);
        anno.refresh();
        //new出来DispatcherServlet,并且把上下文传给DispatcherServlet
        DispatcherServlet servlet=new DispatcherServlet(anno);
        //构建一个动态注册器
        ServletRegistration.Dynamic registration = servletContext.addServlet("myDS", servlet);
        //配置load-on-startup大于等于0即可
        registration.setLoadOnStartup(1);
        //添加一个mapping
        registration.addMapping("/");
    }
}

AppConfig

做完了以后,根据官网所说,还需要添加一个AppConfig的配置类,顺带把视图解析器一起配置进去。

@ComponentScan("com.demo")
@Configuration
public class AppConfig {
    @Bean //配置视图解析器
    public InternalResourceViewResolver internalResourceViewResolver(){
        InternalResourceViewResolver internalResourceViewResolver=new InternalResourceViewResolver();
        //配置前缀
        internalResourceViewResolver.setPrefix("/");
        //配置后缀
        internalResourceViewResolver.setSuffix(".jsp");
        return internalResourceViewResolver;
    }
}

测试用Controller

@Controller
public class IndexController {
    @RequestMapping("/index")
    public String index(){
        System.out.println("------------");
        return "index";
    }
}

构建一个Controller用来测试搭建的Spring MVC是否可用。为什么这里写index是因为,创建Maven-Web项目会自带一个index.jsp文件。

配置运行环境

既然要测试至少要有一个服务器吧,所以直接加载内置的就可以了,porm文件添加Tomcat插件。

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
</plugin>

配置好运行器Configurations。
在这里插入图片描述
启动Tomcat,访问http://localhost:8080/项目名字/index,完成Spring MVC的配置。
在这里插入图片描述

总结

到目前为止Spring MVC纯Java配置就完成了,也顺便解析了为什么以往的项目中为什么要配置ContextLoaderListenerDispatcherServlet以及其里面的内容。如果各位同学读过前几版的Spring官网,其实可以看到Spring公司一直在进行着去XML的过程。其实还有一个问题,那就是为什么Tomcat启动后会执行Spring中的onStartup()方法对整个外部项目进行初始化?这对于这个问题会在下一篇【SpringMVC新版本(Spring 5.3.0)官网详解(二)源码探究】中从源码中探究这个问题。

附:load-on-startup的作用

上面Java程序中,配置load-on-startup大于等于0,代表着是否需要启动时实例化并加载这个Servlet,可能伴随着调用初始化方法init()。等价于下面在xml中配置的<servlet>标签。

<servlet>
		<servlet-name>myDS</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param/>
		<load-on-startup>1</load-on-startup>
</servlet>

load-on-startup的值一般是整数,当其>=0时代表启动时加载这个Servlet;当<0或者没有配置,表示当前Servlet只有被使用时才会去加载。数值代表着优先级,数字越小代表优先级越高。优先级越高代表着Servlet被越早的加载出来。要注意的是,这里不是加载时间而是加载的顺序。一般情况下可以用这个参数去调整整个项目的Servlet的加载顺序,由于目前大多数的Web开发使用Springboot,相当于把这些内容交给Spring容器去管理。这里是为了展示Spring MVC知识点才会涉及到,实际编程很可能看不到这些配置。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC是一种基于MVC设计模式的轻量级Java框架,而Spring Security是一个专门用于身份验证和授权的安全框架。将Spring MVC项目集成Spring Security可以为项目提供更强大的安全性。 在Spring MVC项目中集成Spring Security的步骤如下: 1. 添加Spring Security依赖:在项目的pom.xml文件中添加Spring Security的依赖项,以便在项目中使用Spring Security的功能。 2. 配置Spring Security:创建一个SecurityConfig类,用于配置Spring Security的相关设置。可以在其中配置用户认证方式、权限管理和安全规则等。 3. 自定义用户认证:可以实现UserDetailsService接口,并重写loadUserByUsername方法来提供自定义的用户认证逻辑。也可以使用自定义的AuthenticationProvider来验证用户的身份。 4. 配置安全规则:可以通过配置AntMatchers来定义不同URL路径的访问权限。可以设置哪些角色或权限可以访问某个URL路径。 5. 配置登录和注销页面:创建登录和注销的控制器,并配置登录表单的提交地址和注销地址。可以为登录页面自定义视图,并对登录请求进行处理。 6. 使用安全注解:可以在控制器或方法上使用Spring Security提供的安全注解,如@PreAuthorize和@Secured,来对方法或URL进行细粒度的授权。 7. 使用Spring Security的标签库:可以使用相应的标签库来在JSP页面中展示用户信息、权限信息等。也可以通过标签来控制页面上的内容是否展示。 通过以上步骤,就可以在Spring MVC项目中成功集成Spring Security。集成后,项目将具备强大的身份验证和授权功能,能够有效保护项目的安全性,并对不同用户或角色进行权限控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值