SSM即Spring、Spring MVC、Mybatis的组合,是java web项目开发中比较流行的组合。而java的开发框架比较典型的也就是各种XML文件配置,而在配置的过程中主要发现以下一些问题。
1、web.xml 相关的配置
它是java web项目中比较原始、基础的一个配置文件,我们主要是在此文件里面配置我们的DispatcherServlet,配置成spring mvc的调度器,以达到接管Servlet的目的。典型的配置节也并不难,对于我们本次的项目来讲,也没出什么错误。
<web-app>
<display-name>FamilyEdu</display-name>
<!--1.servlet指定为spring mvc的调度器-->
<servlet>
<servlet-name>FamilyEduDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--1.1. 接下来的init-param标签主要用作一些初始化设置,比如这里就是用来指定spring 对应的配置文件位置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
</servlet>
<!--2.servlet-mapping指定上面 servlet-name所代表的处理 使用哪些路径匹配,换言之就是只要满足下面的url-pattern规则,就会将对应的请求转交给对应的Servlet处理器处理,比如此处就是spring mvc-->
<servlet-mapping>
<servlet-name>FamilyEduDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--3.欢迎文件-->
<welcome-file-list>
<welcome-file>/WEB-INF/jsp/home.jsp</welcome-file>
</welcome-file-list>
</web-app>
2、spring的配置文件(名字自取,没有强行规定,大多数情况可选applicationContext.xml作为其名称)
该配置文件是spring、spring mvc的核心配置,我们Spring mvc的项目运行起来报各种奇奇怪怪的错误,主要就是该文件未配置正确,比如包扫描的位置没有配置正确,就会直接导致找不到Controller、各种Autowired无效(无法自动注入所需依赖)的问题。我们本次项目,这个配置文件的纠错所花的时间比较多。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 用于指定本配置文件里面所引用的properties配置文件的路径,比如本次我们数据相关的配置就存放在jdbc.properties里面 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 用于指定spring 扫描组件所在的包,比如这里配置一个通配符他就可以扫描下面所有的组件比如Controller、Service、DAO、Mapper什么的 -->
<context:component-scan base-package="com.yangquanyao.familyedu.*"/>
<!-- 用于开启spring MVC的相关注解,不然@Controller之类的注解不会生效,就会导致无法访问到具体页面的问题 -->
<mvc:annotation-driven>
<!-- 用于开启spring MVC输出JSON时转换器,不然在使用@ResponseBody将我们的DAO实体输出到JSON会失败,说找不到可以转化的类 -->
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<mvc:default-servlet-handler/>
<beans>
<!-- 用于指定spring MVC视图解析器,不然在Controller里面返回视图路径,回报找不到文件的问题 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 用于指定Mybatis的数据源,或者说要连接的目标数据库,这个配置可以在mybatis-config.xml中配置,只是写法略微不同 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 用于指定Mybatis的配置文件(mybatis-config.xml)的路径以及Mapper和Mapper.xml中的路径对应关系,我一般习惯将Mapper.xml放到Resource目录下,这样比较好写路径,就以classpath:开头 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations">
<array>
<value>classpath:mapper/*.xml</value>
</array>
</property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<!-- 用于指定Mybatis Mapper所在的包 不然Mapper会注入失败-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.yangquanyao.familyedu.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
</beans>
</beans>
配置该文件时,发现的问题比较多:
1.不配置视图解析器(InternalResourceViewResolver),导致MVC页面无法打开。
2.容易把Mybatis配置错误,比如已经在此页面配置Mapper.xml文件的扫描和对应,然后在mybatis-config里面也配置了mappers导致重复配置,解析时报错误。
3.配置文件*.properties/*.yml、Mapper文件、mybatis-config这些文件没有扩展名,以及路径不对,没有扩展名肯定是错误的,然后配置文件的路径,,我都推荐放到Resource目录下,方便找结构又清晰。
4.没有把Mybatis的配置文件配置正确,导致Mybatis各种错误,比如具体的Mapper.xml找不到,语句定义重复什么的。
Mybatis的配置文件
在此处,Mybatis的配置文件里面真正起作用的很少,因为已经在Spring的配置文件中配置过了,但运行起来的时候就发现一个比较令人头疼的问题,那就是枚举值的处理,所以还需要在他的配置文件里面给出Handler
<configuration>
<!-- 引入外部资源文件 -->
<properties resource="jdbc.properties"></properties>
<!-- 设置驼峰匹配 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeHandlers>
<!-- 如果使用此方法来解决枚举值的问题,则每种类型都需要在此处添加 -->
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.yangquanyao.familyedu.dao.UserType"/>
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.yangquanyao.familyedu.dao.UserState"/>
</typeHandlers>
<!-- 配置环境:可以配置多个环境,default:配置某一个环境的唯一标识,表示默认使用哪个环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 配置连接信息 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件:用来配置sql语句和结果集类型等 -->
<!-- <mappers>-->
<!-- <mapper resource="mapper/UserMapper.xml"/>-->
<!-- </mappers>-->
</configuration>
在此处需要比较注意的,写了对应的handler在写Mapper.xml文件时需要手工编写一下ResultMap。本项目中此配置文件主要是为了解决在Mybatis中使用枚举的问题。不然可以不要这个配置文件。
Mapper相关的问题
有些比较习惯将Mapper.xml和对应的Mapper.java放在一个目录,但实操发现,放在和java代码一起的时候不好书写路径,导致找不到对应的文件。所以这个还是推荐放到Resource目录下。
pom.xml项目本身的问题
当我们在前面的步骤中,各种配置文件都是正确的情况下,出现了无法连接数据库的问题,提示不能创建数据库连接。但通过调试断点的方式发现我们的数据库相关配置是没问题的,比如IP地址、用户名、密码什么的都没问题,但就是报错,最终才发现,由于是我们Mysql数据库的版本比较高(8.0),但Pom.xml里面配置的还是5.x的mysql driver,导致连接不上,故还需要修改mysql drive的版本:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
然后jdbc.properties中的jdbc.driverClass也需要修改为:com.mysql.cj.jdbc.Driver。
为了输出JSON,我们不仅仅使用@ResponseBody注解,还需要在POM文件中引入jackson相关的包
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<jackson.version>2.9.9</jackson.version>
</properties>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
此处有个问题就是他的版本与Spring MVC自带的jackson的包存在版本冲突,但选择高版本的jackson版本就可以解决,比如本项目现在选择的是2.9.9。到此本项目终于从站点本身-》MVC-》依赖注入-》访问数据库-》返回JSON的所有问题解决完毕,接来下就是编写对应的数据访问和业务逻辑就可以完成项目的开发了。
网友评论