vlambda博客
学习文章列表

基于XML的springMVC大致开发流程

程Sir小课堂推荐搜索
Spring配置
SpringMVC
xml配置
SpringMVC开发

        Spring的执行本质是和servlet是一致的,SpringMVC的主要的角色就是起整个过程的调度。那么整个流程的开发,我们就可以基于Servlet的开发流程,以及工程流水线式的作用进行配置与理解。

准备工作:

        Spring-mvc.xml文件、Spring-dao.xml文件。(整合配置文件可以一个也可以多个,为了比较明确体现其配置文件的用途,分开配置);使用这两个文件,需要对文件中特有的xmlns即:命名空间做个简单的说名,xmlns(XML Namespaces的缩写)是一个属性,是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: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/Shanghaidriver=com.mysql.cj.jdbc.Driverusername=rootpassword=rootinitialSize=10maxActive=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>