基于XML的springMVC大致开发流程
Spring的执行本质是和servlet是一致的,SpringMVC的主要的角色就是起整个过程的调度。那么整个流程的开发,我们就可以基于Servlet的开发流程,以及工程流水线式的作用进行配置与理解。
准备工作:
Spring-mvc.xml文件、Spring-dao.xml文件。(整合配置文件可以一个也可以多个,为了比较明确体现其配置文件的用途,分开配置);使用这两个文件,需要对文件中特有的xmlns即:命名空间做个简单的说名,xmlns(XML Namespaces的缩写)是一个属性,是XML(标准通用标记语言的子集)命名空间。作用是赋予命名空间一个唯一的名称。下面们之所以能够用一些特殊的标签进行相关应用的配置,依附于上门做的命名空间的配置。(这些内容仅需了解)
<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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
</beans>
Spring-mvc.xml的作用是配置MVC开发过程中需要应用到的组件、环境;
需要配置的内容:
<!-- 1.组件扫描 base-package属性:被扫描的根包-->
<context:component-scan base-package="cn.tedu.controller"></context:component-scan>
<!-- 2.配置模版解析器 -->
<!-- ClassLoaderTemplateResolver:当把模版页面放在src/main/resources下时使用.
ServletContextTemplateResolver:当把模版页面放在webapp下时,必须使用这个模版解析器 -->
<!-- 注入prefix属性:配置前缀 -->
<!-- 注入suffix属性:配置后缀 -->
<!-- 前缀 + 处理请求的方法的返回值 + 后缀 必须对应html文件的位置 -->
<bean id="templateResolver"
class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
<property name="prefix" value="/pages/tables/"></property>
<property name="suffix" value=".html"></property>
<property name="characterEncoding" value="utf-8"></property>
<!--是否执行缓存,false表示否-->
<property name="cacheable" value="false"></property>
<property name="templateMode" value="HTML"></property>
</bean>
<!-- 3.配置模版引擎 -->
<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver"></property>
</bean>
<!-- 4.配置Thymeleaf视图解析器 -->
<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
<property name="templateEngine" ref="templateEngine"></property>
<property name="characterEncoding" value="utf-8"></property>
</bean>
对比基于注解的配置,在其配置类中完成的内容是完全一样的,只是体现的形式是不同而已,<context:component-scan>标签实现对指定包的扫描,等价于注解@Component;还有视图解析器->spring的模板引擎->模板解析器的配置,和注解定时如出一辙,可以做对比学习。
Spring-dao.xml的作用就是配置数据库相关的组件和环境。
需要配置的内容:
<!-- 1.读取jdbc.properties -->
<util:properties id="jdbc" location="classpath:jdbc.properties"></util:properties>
<!-- 2.配置数据源:BasicDataSource ,还可以使用阿里巴巴提供的druid-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="#{jdbc.url}"></property>
<property name="driverClassName" value="#{jdbc.driver}"></property>
<property name="username" value="#{jdbc.username}"></property>
<property name="password" value="#{jdbc.password}"></property>
<property name="initialSize" value="#{jdbc.initialSize}"></property>
<property name="maxActive" value="#{jdbc.maxActive}"></property>
</bean>
<!-- 3.配置MapperScannerConfigurer -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- basePackage属性:指定接口文件所在的包 -->
<property name="basePackage" value="cn.tedu.dao"></property>
</bean>
<!-- 4.SqlSessionFactoryBean: 整合sql和数据源 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定配置SQL语句的XML文件在哪里 -->
<property name="mapperLocations" value="classpath:mappers/*.xml"></property>
<!-- 指定连接数据库时使用的数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
其中,jdbc.properties文件内容:
url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
driver=com.mysql.cj.jdbc.Driver
username=root
password=root
initialSize=10
maxActive=50
SpringMVC相关的配置已经配置好了,但是确实客户端与SpringMVC间连接的配置。回想Servlet中,客户端发送请求如login.do到服务器,首先服务器是从web.xml中去查询是否有此请求请求对应的Servlet,找到了就会交给此Servlet进行处理,没有就会发送404响应状态码给客户端。
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
那么,SpringMVC处理过程也是一样的,在里面不仅指定了初始化加载的配置文件,还可以设置过滤器来解决乱码问题,并且也可以设置拦截器,对需要进行拦截的资源进行拦截(黑名单),若要设置放行的资源(白名单),同样是在web.xml中完成,一起来围观下:
<!-- 处理器 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化参数,contextConfigLocation是其上servlet类的属性,
表示需要在servlet初始化时就需要去加载的内容的位置,
也就是刚才做个两个配文件置。(注意,两个文件时可以合并成一个的。)-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-mvc.xml,
classpath:spring-dao.xml
</param-value>
</init-param>
<!--值越小,该servlet的优先级越高-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 过滤器 -->
<!-- 请求处理的过程会有乱码问题,设置过滤器来解决-->
<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>
<!-- 拦截器 -->
<!-- 不是必须要配置的,只有当涉及到了权限管理时可进行配置-->
<!-- 配置拦截器, 多个拦截器,顺序执行 -->
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
<mvc:interceptor>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<mvc:mapping path="/**"/>
<!-- 配置需要放行的资源,一般就是静态资源-->
<mvc:exclude-mapping path="/resources/**"/>
<!-- 自定义的拦截器bean -->
<bean class="cn.teud.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
<!-- 当设置多个拦截器时,先按顺序调用preHandle方法,
然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/resources/**"/>
<!-- 自定义拦截器文件的路径 -->
<bean class="**cn.teud.interceptor.MessageInterceptor**"></bean>
</mvc:interceptor>
</mvc:interceptors>
写在最后:
使用XML方式和注解方式都是可以完成springMVC的开发,下面我们总结下两种方式的优缺点,以便于大家在开发的选型的过程中,按需进行框架的搭建。
(1)xml开发优势:
a. spring的xml开发方式便于集中管理,与源代码实现解耦;
b. 有利于业务逻辑较为复杂的功能的开发,像整合mybatis时的多表联合查询
c. 由于xml是可扩展的,所以xml可以描述来自多种应用程序的数据
(2)xml开发劣势:
a. 开发速度比较慢
b. 配置的代码太多,不够简洁,不利于查看
(3)注解开发优势:
a. 开发速度快,可读性强
b. 代码利于查看且轻巧简便
d. 采用注解开发便于学习与理解(个人感受)
(4)注解开发劣势:
a. 不利于代码维护,与源代码耦合
b. 不利于业务逻辑功能的扩展,所有的修改和添加需要动源代码。这就需要源代码重新编译,不方便
d. 整合其他框架存在局限性,如整合mybatis时,注解不方便多表联合查询
GameOver!
附注:SpringMVC开发过程中需要的jar包依赖
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- Spring JDBC依赖,必须与其它Spring依赖使用完全相同的版本 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- Mybatis框架 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<!-- MyBatis整合Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>
<!-- Thymeleaf -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<!-- Thymeleaf整合Spring -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<!-- 连接MySQL数据库的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- javaEE开发相关的API,如果适配了Tomcat默认提供的操作javaEE的API
就不需要导入此包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--日志依赖-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>