1. 创建项目
创建Maven Project,勾选Create a simple project,Group id为cn.tedu.spring,Artifact id为SpringMVC-02,Packaging选择war。
当项目创建出来后,先生成web.xml文件;对项目点击右键设置属性,勾选Targeted Runtimes中的Tomcat;在pom.xml中添加spring-webmvc的依赖(建议使用4.2或以上版本https://blog.youkuaiyun.com/qq_37669050/article/details/102384613);在前序项目中复制Spring的配置文件到当前新项目中(https://blog.youkuaiyun.com/qq_37669050/article/details/102594279)。
2. 配置DispatcherServlet
首先,需要在web.xml中配置DispatcherServlet,其基本配置如下:
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param><!-- param:参数 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-ajax.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 解决SpringMVC中文乱码问题的过滤器 -->
<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>
SpringMVC框架是基于Spring的,后续还会在Spring的配置文件(spring-mvc.xml)中进行配置,则希望项目启动时,就加载Spring的配置文件。可以:在以上配置中,为DispatcherServlet配置初始化参数contextConfigLocation,该参数的值是Spring配置文件的位置,一旦配置了该参数,当DispatcherServlet被初始化时,就会自动加载Spring的配置文件!然后,将DispatcherServlet配置为默认启动的,即Tomcat启动时,就会初始化DispatcherServlet,进而导致spring-mvc.xml被读取并加载。
则补充配置为:
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
注意:以上配置的和节点是区分先后顺序的!
如果需要测试以上配置是否成功,可以先在spring-mvc.xml中配置组件扫描:
<!-- 组件扫描 -->
<context:component-scan base-package="cn.tedu.spring"/>
然后,在被扫描的包下创建任意类,为类添加Compontent注解,自定义构造方法,输出某个字符串,例如:
package cn.tedu.spring;
import org.springframework.stereotype.Component;
@Component
public class User {
public User() {
System.out.println("创建了User类的对象!");
}
}
最后,启动项目,在Eclipse的控制台中应该可以看到构造方法中输出的内容!
3. 通过控制器接收用户提交的请求
通过@RequestMapping注解,可以设置请求路径与处理请求的方法的映射关系,所以,在实际编程时,并不需要显式的使用HandlerMapping。
所以,可以直接创建cn.tedu.spring.HelloController控制器类,并为类添加@Controller注解,这样,Spring框架才会创建该控制器类的对象,最终,被SpringMVC框架所识别并使用。
然后,在控制器类中添加处理请求的方法,关于方法的设计:
- 应该使用public权限;
- 暂时使用String作为返回值类型;
- 方法名称可以自定义;
- 方法的参数列表暂时为空。
则可以添加方法:
public String showHello() {
return null;
}
需要在方法之前使用@RequestMapping以配置映射关系,则:
@RequestMapping("hello.do")
public String showHello() {
System.out.println("HelloController.showHello()");
return null;
}
注意:以上控制器类必须放在cn.tedu.spring包中,因为此前设置组件扫描就是这个包!通常,控制类应该使用Controller单词作为名称的后缀。控制器类只能使用@Controller注解,不可以使用@Component或另几个注解。
完成后,重新启动项目,打开浏览器,通过http://localhost:8080/SpringMVC-02/hello.do进行测试,正确的结果应该是:在Eclipse的控制台中,可以看到以上方法输出的内容!而页面尚未处理,可能出现404错误。
4. 显示页面
默认情况下,控制器中的方法如果返回String类型的数据,表示“视图名称”,框架需要根据视图名称来确定由哪个视图组件负责最终响应时的显示。则需要在spring-mvc.xml中进行配置:
<!-- 模版解析器:ServletContextTemplateResolver -->
<!-- 配置ServletContextTemplateResolver时,HTML文件应该以webapp文件夹为参考 -->
<!-- 配置ClassLoaderTemplateResolver时,HTML文件应该以项目的resources文件夹为参考 -->
<bean id="templateResolver"
class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
<property name="prefix"
value="/WEB-INF/templates/" />
<property name="suffix"
value=".html" />
<property name="characterEncoding"
value="utf-8" />
<property name="templateMode"
value="HTML" />
<property name="cacheable"
value="false" />
</bean>
<!-- Spring模版引擎:SpringTemplateEngine -->
<bean id="templateEngine"
class="org.thymeleaf.spring4.SpringTemplateEngine">
<property name="templateResolver"
ref="templateResolver" />
</bean>
<!-- 视图解析器:ThymeleafViewResolver -->
<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
<property name="templateEngine"
ref="templateEngine" />
</bean>
然后,将控制器中处理请求的方法的返回值改为"hello"。
最后,在webapp/WEB-INF/templates/文件夹下创建hello.html,并在HTML中自行设计页面内容。通过http://localhost:8080/SpringMVC-02/hello.do进行测试。
创建Maven Project,Group Id使用cn.tedu.mybatis,Artifact Id使用MyBatis,Packaing选择war(也可以选择jar)。
MyBatis
项目创建出来后,需要:生成web.xml文件;在pom.xml中添加依赖;从前序项目中复制spring-mvc.xml到当前项目;添加Tomcat运行环境(此案例可以不需要);打开前序项目的web.xml,将DispatcherServlet和CharacterEncodingFilter的配置复制到当前项目中。
本次另外需要添加依赖:
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!-- MyBatis整合Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>
<!-- SpringJDBC -->
<!-- 注意:与当前项目使用的其它spring依赖保持相同的版本号 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<!-- mysql连接 -->
<!-- 可选版本号:8.0.12~8.0.16,5.1.4~5.1.6 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
然后,将spring-mvc.xml复制一份,得到spring-dao.xml,删除spring-dao.xml文件内的配置!
- 数据库连接
在src/main/resources下创建db.properties文件,用于配置数据库连接的相关信息:
url=jdbc:mysql://localhost:3306/tedu_ums?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
driver=com.mysql.cj.jdbc.Driver
username=root
password=root
initialSize=2
maxActive=10
在配置driver属性时,需要注意所使用的mysql-connector-java的版本,如果使用的5.x版本,该属性值应该是com.mysql.jdbc.Driver,如果使用的是6.x或更高版本,该属性值应该是com.mysql.cj.jdbc.Driver,如果不确定到底应该用哪个值,可以展开mysql-connector-java的jar包文件来观察!另外,在该jar包中还有META-INF/services/java.sql.Driver文件,该文件内记录的就是使用该jar包时应该使用的Driver类。
如果使用的是6.x或以上版本的mysql-connector-java,在配置连接数据库的URL时,还必须显式的设置serverTimezone参数的值!在中国大陆地区可使用的值有Asia/Shanghai和Asia/Chongqing。
需要在spring-dao.xml中添加配置,读取以上db.properties中的配置信息:
<util:properties id="config" location="classpath:db.properties" />
然后,连接数据库时,使用到的数据源将是BasicDataSource,则需要将以上读取到的数据库连接信息注入到BasicDataSource的属性中去:
<!-- 配置数据源,保证其能够连接数据库 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="#{config.url}" />
<property name="driverClassName" value="#{config.driver}" />
<property name="username" value="#{config.username}" />
<property name="password" value="#{config.password}" />
<property name="initialSize" value="#{config.initialSize}" />
<property name="maxActive" value="#{config.maxActive}" />
</bean>
然后,可以在测试类中,编写并执行单元测试,以检查配置是否正确:
public class Tests {
ClassPathXmlApplicationContext ac;
@Before
public void doBefore() {
ac = new ClassPathXmlApplicationContext(
"spring-dao.xml");
}
@After
public void doAfter() {
ac.close();
}
@Test
public void getConnection() throws SQLException {
BasicDataSource dataSource = ac.getBean("dataSource", BasicDataSource.class);
Connection conn = dataSource.getConnection();
System.out.println(conn);
}
}
- 接口与抽象方法
暂定目标:使用MyBatis向数据表中插入新的用户数据。
使用MyBatis时,需要定义各功能对应的抽象方法,这些抽象方法必须定义在接口中!
首先,应该创建cn.tedu.mybatis.UserMapper接口文件,然后,在接口中定义“插入用户数据”的抽象方法,关于抽象方法的设计原则:
- 如果需要执行的是增、删、改类型的操作,则使用Integer作为方法的返回值,将表示“受影响的行数”,可用于判断操作成功与否,也可以设计为int,还可以设计为void表示不关心受影响的行数;
- 方法名称可以自定义,不可以重载;
- 参数列表根据所需要的参数来决定,可以参考此前学习JDBC时,SQL中有哪些问号,就写哪些参数。
此次“插入用户数据”需要执行的SQL语句大致是:
insert into (username, password, age, phone, email) values (?,?,?,?,?)
则抽象方法需要写5个参数,如果后续该数据表增加了更多的字段,则需要写更多参数,这种做法是有缺陷的,应该将这些参数封装到cn.tedu.mybatis.User类中:
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
private String email;
}
则抽象方法可以设计为:
Integer insert(User user);
接下来,需要配置“接口文件在哪里”,以保证后续MyBatis框架工作时,能找到该接口:
<!-- 配置MapperScannerConfigurer -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置接口文件在哪里 -->
<property name="basePackage"
value="cn.tedu.mybatis" />
</bean>
- 配置SQL映射
从http://doc.tedu.cn/config/mybatis-mapper.zip下载编写配置文件的XML文件压缩包。
在src/main/resources下创建名为mappers的文件夹,并将压缩包中的SomeMapper.xml复制到该文件夹下。
注意:在MyBatis中用于配置SQL语句的XML文件必须包括以下声明,否则将无法正常使用!
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
在配置该XML文件时,首先,需要添加根节点,且必须配置namespace属性,该属性值表示对应哪个接口文件:
<!-- namespace:对应哪个接口 -->
<mapper namespace="cn.tedu.mybatis.UserMapper">
</mapper>
然后,根据所需要执行的SQL语句的种类,从、、、中选择子级节点,节点的id属性就是抽象方法的名称,然后,在节点内容编写需要执行的SQL语句,参数部分使用#{}格式的占位符,占位符内部的名称是方法的参数User类中的属性名:
<!-- id:抽象方法的名称 -->
<insert id="insert">
INSERT INTO t_user (
username, password,
age, phone,
email
) VALUES (
#{username}, #{password},
#{age}, #{phone},
#{email}
)
</insert>
然后,还需要配置“XML文件在哪里”,及框架执行时,“使用哪个数据源连接数据库”!所以,需要在spring-dao.xml中添加配置:
<!-- 配置SqlSessionFactoryBean -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置XML文件在哪里 -->
<property name="mapperLocations"
value="classpath:mappers/*.xml" />
<!-- 配置使用哪个数据源连接数据库 -->
<property name="dataSource"
ref="dataSource" />
</bean>
最后,编写并执行单元测试:
@Test
public void insert() {
User user = new User();
user.setUsername("zhaoqi");
user.setPassword("888999");
user.setPhone("010-88888888");
Integer rows = userMapper.insert(user);
System.out.println("rows=" + rows);
}