整个项目分为三个层次:controller层、service层、mapper层,分别放在三个单独的文件夹中
除此之外还有pojo(Plain Old Java Object),也就是一般来说的对象,防止在pojo文件夹中
所有配置文件放在resource文件夹中
整体看起来的样子:
由于只是一个简单的demo,所以看起来并不复杂 ,开发中有需要的话还可以放置vo、util等文件夹。
然后分别展开:
resource文件夹:
可以看出,如果不使用注解的话,整个SpringMVC环境的搭建基本都是在围绕着配置配置文件的工作展开的,出错的几率非常高,使用起来非常的麻烦,这也是为什么人称 “配置地狱”了,也是因为这样才有后来的SpringBoot。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.lingroupId>
<artifactId>PersonalPageartifactId>
<version>1.0-SNAPSHOTversion>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.3.5version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13.2version>
<scope>testscope>
dependency>
<dependency>
<groupId>com.mchangegroupId>
<artifactId>c3p0artifactId>
<version>0.9.5.2version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.47version>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.2version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.7version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatis-springartifactId>
<version>2.0.2version>
dependency>
<dependency>
<groupId>org.aspectjgroupId>
<artifactId>aspectjweaverartifactId>
<version>1.9.6version>
dependency>
dependencies>
project>
在pom.xml文件的依赖后面加入,防止打包的时候静态资源文件不被识别
<build>
<resources>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>falsefiltering>
resource>
<resource>
<directory>src/main/resourcesdirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>falsefiltering>
resource>
resources>
build>
项目右击,添加web框架支持
在项目中多出的web文件加中找到WEB-INF/web.xml文件
未配置的样子:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
web-app>
每一个请求都会从这个Servlet经过,然后进行匹配处理,最终找到对应的controller分发出去。
<servlet>
<servlet-name>springmvcservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:ApplicationContext.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>springmvcservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
注意:不要讲路径/误写为/*,会导致出错
/会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
/ *会匹配所有url:路径型的和后缀型的url(包括/login,.jsp,.js和.html)等
<filter>
<filter-name>encodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
filter>
<filter-mapping>
<filter-name>encodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvcservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:ApplicationContext.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>springmvcservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<filter>
<filter-name>encodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
filter>
<filter-mapping>
<filter-name>encodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
web-app>
在src/main/resource文件夹下创建ApplicationContext.xml文件。resource文件主要用于存放一些静态资源(如,图片、jsp等) 和配置文件。
未配置的ApplicationContext.xml
可以用来注册bean,主要用于汇总其他配置文件。
其他配置文件最终都会导入这个文件中
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
beans>
先登陆自己的数据库,然后创建自己需要的数据库。
数据库中按照自己的需要去创建表
CREATE DATABASE personalPage;
选择自己的数据库类型
输入配置信息,输入完成后复制下面的URL,点击Apply 然后 OK
连接成功,因为暂时还没有数据,所以没有显示太多东西
同样在resource文件夹下创建database.properties文件.
用于放置连接数据库所必须的配置信息。
基本配置总共四种:
Driver:驱动
url:数据库地址 就是刚刚连接数据库时候复制的URL
后面需要拼接一些参数:
useSSL=false 不使用安全连接
useUnicode=true 使用unicode编码
characterEncoding=utf8 字符编码使用utf-8
Username:登陆数据库的用户名
password:登陆数据库的密码
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/personalPage?useSSl=false&useUnicode=true&characterEncoding=utf8;
jdbc.username=root
jdbc.password=199803040.0
在resource下创建spring-dao.xml文件
未配置的spring-dao.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
beans>
在这个配置文件中,我们主要需要做一下几点事情:
下面我们来逐一实现
<context:property-placeholder location="database.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxPoolSize" value="30"/>
<property name="minPoolSize" value="10"/>
<property name="autoCommitOnClose" value="false"/>
<property name="checkoutTimeout" value="10000"/>
<property name="acquireRetryAttempts" value="3"/>
bean>
获取sqlSessionFactory对象通常是构造SqlSession对象的重要一步,而Sqlsession又是使用Mybatis最重要的对象。
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config"/>
bean>
在resource文件夹下创建mybatis-config.xml文件,主要用于配置mybaitis
未配置的文件:
<configuration>
configuration>
这个文件中要做两件事情
在没有和spring整合之前,mybatis所有配置都需要在这个文件中进行,基本上写的是满满当当,和spring整合之后,由于注解等开发方式的介入,极大程度的减轻了配置文件的内容!
OK!我们现在还没有Mapper文件,那么我们需要去完善一下数据库和实体类!
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`username` varchar(30) NOT NULL,
`id` int NOT NULL,
`password` varchar(30) NOT NULL,
`age` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
SET FOREIGN_KEY_CHECKS = 1;
插入数据
INSERT INTO `personalPage`.`user` (`username`, `id`, `password`, `age`) VALUES ('小明', 1, 'woshixm', 23);
INSERT INTO `personalPage`.`user` (`username`, `id`, `password`, `age`) VALUES ('小红', 2, 'woshixh', 18);
INSERT INTO `personalPage`.`user` (`username`, `id`, `password`, `age`) VALUES ('小亮', 3, 'woshixl', 20);
INSERT INTO `personalPage`.`user` (`username`, `id`, `password`, `age`) VALUES ('小白', 4, 'woshixb', 18);
修改id为自增
ALTER TABLE user CHANGE id id INT( 10 ) NOT NULL AUTO_INCREMENT;
在src/main/java路径下创建文件夹com.** 这里的 ** 随便起,然后在其下创建结构如下的目录
controller主要负责程序逻辑的控制,
service和mapper主要负责业务和数据的处理
pojo主要放置实体类。
在pojo文件夹中创建User实体类,注意属性字段和数据库中的字段名一一对应
package com.lin.pojo;
public class User {
private int id ;
private int age;
private String username;
private String password;
public User() {
}
public User(int id, int age, String username, String password) {
this.id = id;
this.age = age;
this.username = username;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", age=" + age +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
在mapper文件夹中创建接口 UserMapper
package com.lin.mapper;
import com.lin.pojo.User;
import java.util.List;
public interface UserMapper {
//增加一个用户
int addUser(User user);
//通过id删除一个用户
int deleteUserById(int id);
//修改用户信息
int updateUser(User user);
//通过id查询一个用户
User queryUserById(int id);
//查询所有用户
List<User> queryAllUser();
}
在mapper文件夹中创建UserMapper.xml文件来实现这个接口
空文件头:
在其中绑定对应的mapper接口
<mapper namespace="com.lin.mapper.UserMapper">
<insert id="addUser" parameterType="com.lin.pojo.User">
insert into personalPage.user (username, id, password, age)
VALUES (#{username},#{id},#{password},#{age})
insert>
<delete id="deleteUserById" parameterType="int" >
delete from personalPage.user
where id = #{id}
delete>
<update id="updateUserById" parameterType="com.lin.pojo.User">
update personalPage.user
set username = #{username},
age = #{age},
password = #{password}
where id = #{id};
update>
<select id="queryUserById" resultType="com.lin.pojo.User">
select * from personalPage.user
where id = #{id};
select>
<select id="queryAllUser" resultType="com.lin.pojo.User">
select * from personalPage.user;
select>
mapper>
然后我们返回去将这个mapper.xml文件注册进 mybatis-config.xml文件中
<configuration>
<mappers>
<mapper class="com.lin.mapper.UserMapper"/>
mappers>
configuration>
再将spring-dao.xml文件完善,加入自动扫描mapper的配置
将下面的bean加入spring-dao.xml文件
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.lin.mapper"/>
bean>
在service文件夹下创建UserService接口和UserServiceImpl.java
分别编写接口和实现类如下:
package com.lin.service;
import com.lin.pojo.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserService {
//增加一个用户
int addUser(User user);
//通过id删除一个用户
int deleteUserById(@Param("id") int id);
//修改用户信息
int updateUser(User user);
//通过id查询一个用户
User queryUserById(@Param("id") int id);
//查询所有用户
List<User> queryAllUser();
}
package com.lin.service;
import com.lin.mapper.UserMapper;
import com.lin.pojo.User;
import java.util.List;
public class UserServiceImpl implements UserService{
UserMapper userMapper;
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
public int addUser(User user) {
return userMapper.addUser(user);
}
public int deleteUserById(int id) {
return userMapper.deleteUserById(id);
}
public int updateUser(User user) {
return userMapper.updateUser(user);
}
public User queryUserById(int id) {
return queryUserById(id);
}
public List<User> queryAllUser() {
return userMapper.queryAllUser();
}
}
在resource文件夹下创建spring-service.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
beans>
主要需要配置的功能有:
自动扫描service包
<context:component-scan base-package="com.lin.service"/>
将UserServiceImpl注册到Spring中进行托管
<bean id="bookServiceImpl" class="com.lin.service.UserServiceImpl">
<property name="userMapper" ref="userMapper"/>
bean>
声明事务
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
bean>
AOP实现事务支持
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
tx:attributes>
tx:advice>
<aop:config>
<aop:pointcut id="txPointCut" expression="execution(* com.lin.mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
aop:config>
最后 我们需要为整个项目配置springmvc-servlet.xml文件,保证整个项目在运行过程中,可以按照springmvc设计的流程正常运转
同样,我们将此文件创建在resource文件夹下
未配置的pringmvc-servlet文件
<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:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
beans>
我们需要做的事情有:
我们开始吧:
<context:component-scan base-package="com.lin.controller"/>
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
bean>
最后把spring-dao、spring-service、springmvc-servlet三个配置全部导入ApplicationContext.xml文件中
```xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="classpath:spring-dao.xml" />
<import resource="classpath:spring-service.xml" />
<import resource="classpath:springmvc-servlet.xml" />
beans>
package com.lin.controller;
import com.lin.pojo.User;
import com.lin.service.UserServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("user")
public class UserController {
UserServiceImpl userService;
@RequestMapping("/getUser")
public String getUserById(int id, Model model){
User user = userService.queryUserById(id);
model.addAttribute("user",user);
return "userInfo";
}
}
设置默认页面index.jsp,输入id进行查询一个用户
<%--
Created by IntelliJ IDEA.
User: liushanlin
Date: 2021/6/27
Time: 1:17 下午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
$Title$
设置查询结果页面 userInfo.jsp
<%--
Created by IntelliJ IDEA.
User: liushanlin
Date: 2021/6/27
Time: 4:56 下午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
${user.id}
${user.username}
${user.age}
${user.password}
在file–>project structure ---->module里面点击项目
可以看到配置文件的context设置
首先测试业务层查询逻辑
建立在test/java文件夹下建立test类
import com.lin.pojo.User;
import com.lin.service.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
UserServiceImpl userServiceImpl = context.getBean("userServiceImpl", UserServiceImpl.class);
User user = userServiceImpl.queryUserById(2);
System.out.println(user);
}
}
控制台输出:
User{id=2, age=18, username=‘小红’, password=‘woshixh’}
Process finished with exit code 0
启动Tomcat 在浏览器中方案http://localhost:8080/
不出意外应该得到上图所示的结果,输入查询的用户编号,点击查询
得到查询结果。
整个项目的前端页面只是为了验证项目的逻辑和环境的搭建是否成果,没有添加其他样式,看起来非常美观,但只要逻辑跑的通,前端的样式慢慢调整成自己喜欢的样子就好了!
解决:其中tx命名空间爆红是因为缺少maven依赖,导入后恢复正常
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>5.3.5version>
dependency>
org.springframeworl.jdbc.dataSource.DataSourceTranssactionManager不会提示,但直接全限定名输入,也不会报错。
太坑了!我一直以为自己哪里做的不对,反复检查对比!太坑爹了!
java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter
解决方法:maven reload 然后吧包重新添加到项目的artifact的lib里面
IOException parsing XML document from class path resource [ApplicationContext.xml];
!!!
之前在项目中创建了一个子模块,然后项目的自动升级为父模块,项目的pom.xml文件中自动多了一行
《packaging》pom《/packaging》
pom ---------> 父类型都为pom类型
jar ---------> 内部调用或者是作服务使用
war ---------> 需要部署的项目
打包为pom没有代码需要编译,也没有资源需要处理!
也就是说!
打包的文件里面没有xml,properties等配置文件!
当调用mapper查询数据的时候,接口找不到绑定的mapper.xml文件!
就会报错:绑定未生效!坑!!!!!!!