记账项目是SSM学习完之后的一个学习总结,用于帮助掌握SSM框架。
项目描述:
需求分析:
1:在主页面用户可以根据账单类型和账单起止时间进行搜索。
2:搜索出的内容包括账单标题,记账时间,类别,金额,说明,操作。
3:账单类型的下拉框包括:不限,支出,收入,转账,借出,借入,还入,还出。
4:金额需要根据账单类型显示“+”或者“-”号。
5:表格底部有首页,上一页,下一页,尾页四个按钮,并且显示当总页数和总条数。
6:没有搜索出数据时需要给出相应的提示信息。
7:点击记账按钮进入记账界面,可以新建账单。
8:点击删除按钮可以删除账单。
9:点击修改按钮可以修改账单信息。
完成过程:
1.创建数据库
2:环境搭建
2.0:配置web.xml文件
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>Archetype Created Web Application</display-name>
<!--1.配置前端控制器-->
<servlet>
<servlet-name>aa</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>aa</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--2.处理post乱码-->
<filter>
<filter-name>bb</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>bb</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
2.1:添加依赖包
创建pom.xml文件,添加依赖包
通过 ${springversion}标签控制所有的spring版本。
<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>
<groupId>com.kkb</groupId>
<artifactId>ssm_project</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<springversion>5.0.8.RELEASE</springversion>
</properties>
<dependencies>
<!-- 加入ServletAPI -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- MySQL依赖 start -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- 加入MyBatis 依赖 start -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!-- 引入Spring(包含SpringMVC) 依赖 start -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springversion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${springversion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${springversion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springversion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${springversion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springversion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${springversion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springversion}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${springversion}</version>
</dependency>
<!-- 引用插件依赖:MyBatis整合Spring,如果mybatis版本在3.4及以上版本
mybatis-spring的版本要在1.3以上 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 德鲁伊数据连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<!-- pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.6</version>
</dependency>
<!--处理json-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<!--javaee-->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!--文件上传下载-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
<build>
<finalName>ssm_project</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<!--配置文件的路径-->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2.2:创建空的包的目录
2.3:创建spring.xml文件
一共有8个步骤:
配置数据源
创建sqlSessionFactory
创建MapperScannerConfigurer,用于省略dao的实现类
配置事务
启用springmvc注解
配置视图解析器
扫描注解包
配置静态资源访问
完成这八个步骤之后需要在resources文件夹下创建一个mapper文件夹
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
">
<!-- 1.配置数据源-->
<bean id="db" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf-8"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
<!--2.创建sqlSessionFactory-->
<bean id="fac" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="db"></property>
<property name="configLocation" value="classpath:mybatis.xml"></property> <!--指定mybatis的配置文件路径-->
<property name="mapperLocations" value="classpath:mapper/*.xml"></property><!--指定mybatis的mapper文件路径-->
</bean>
<!--3.创建MapperScannerConfigurer,用于省略dao的实现类-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="fac"></property>
<property name="basePackage" value="com.kkb.dao"></property><!--接口所在包的路径-->
</bean>
<!--4.配置事务-->
<bean id="mytx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="db"></property>
</bean>
<tx:annotation-driven transaction-manager="mytx"></tx:annotation-driven>
<!--5.启用springmvc注解-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--6.配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"></property>
</bean>
<!--7.扫描注解包-->
<context:component-scan base-package="com.kkb"></context:component-scan>
<!--8.配置静态资源访问-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
</beans>
2.4:配置mybatis.xml文件
主要用于给类起别名和配置分页插件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<package name="com.kkb.bean"></package>
</typeAliases>
<plugins>
<!-- PageHelper4.1.6 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
</plugin>
</plugins>
</configuration>
2.5:配置generatorConfig.xml文件
需要注意的内容:
1:数据库的链接信息需要修改。
2:生成实体类,生成SQLmapper文件,生成Dao文件的三个部分需要指定包名和路径。
3:表的部分需要根据数据库修改一下表名
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!--配置生成器-->
<generatorConfiguration>
<!--数据库驱动.jar-->
<classPathEntry location="F:\maven\apache-maven-3.3.3\maven_repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar"/>
<context id="MyBatis" targetRuntime="MyBatis3">
<!--去除注释-->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库连接-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mytest"
userId="root"
password="123456">
</jdbcConnection>
<!--生成实体类,指定包名,以及生成的地址-->
<javaModelGenerator targetPackage="com.kkb.bean"
targetProject="F:\IDEA\ssm_project\src\main\java">
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--生成SQLmapper文件-->
<sqlMapGenerator targetPackage="mapper"
targetProject="F:\IDEA\ssm_project\src\main\resources">
</sqlMapGenerator>
<!--生成Dao文件,生成接口-->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.kkb.dao"
targetProject="F:\IDEA\ssm_project\src\main\java">
</javaClientGenerator>
<table tableName="bills" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false">
</table>
<table tableName="billtype" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
2.6:添加maven:mybatis
指令为mybatis-generator:generate -e
添加之后运行,开始反向生成。
生成以下几个文件
至此环境搭建完毕。
值得注意的是方向生成的话XML文件建议删除重建,如果方向生成错误最好删除干净重新生成。不然会出现之前bug记录中1中出现的500错误。
3:查询数据部分
index.jsp
在起始页面index.jsp输入以下,让页面在加载的时候就发送请求,去向后台要数据展示已经收录的账单信息。
创建controller
用于处理index页面发来的请求
记得加@Controller和@RequestMapping注解
随后从controller层跳转到show页面
创建一个show页面待使用
由需求可以看出需要从数据库中获得账单信息和账单类型信息这两个对象,所以需要创建对应该controller层的service层用来调用数据。
先创建两个接口,接口需要有查询所有账单和查询账单类型的两个方法。
查询账单
BillsService
查询账单类型
BillTypesService
创建实现类实现service接口中的方法
BillsServiceImpl
BillTypesServiceImpl
将这两个方法分别添加在BillsMapper.xml和BilltypeMapper.xml文件里
BillsMapper.xml:
BilltypeMapper.xml:
随后开始进行逐层调用
先回到controller层
创建账单和账单类型两个对象
然后创建集合来接收调用service层方法传来的数据
在service层对应的实现类中添加注解和给属性赋值
BillsServiceImpl
BillTypesServiceImpl
来到dao层
此时的方法没有绑定sql语句所以有报错
前往BillsMapper.xml添加sql语句
BillTypesMapper.xml同样操作
回到controller,传值给前台
方式用的是ModelMap
前往show页面做一个简单的符合需求的前端页面
先添加标签库,在下拉框中添加选项,用循环从数据库中拿出除了“不限”的选项
之后做一个简单的时间输入框和按钮
整体放入一个form表单中用来提交
添加fmt标签库
在表单下方添加一个table表格来展示数据
至此可以先进行测试,show页面初步完成
由于要进行两表联查,所以去实体类中添加对应的对象。
Bills是多方,因为一个类型可以有多个账单信息,而一个账单信息只能有一个类型。是多个账单对应一个账单类型。
多方有一方的对象,一方有多方的集合
创建Billtype实体类,并且为其生成getter和setter方法
同样的在一方创建多方的集合billList
以及getter和setter方法
然后就可在BillsMapper.xml文件中添加两表联查的结果映射
单表的内容可以直接复制之前生成的部分,多表的association部分名称要和bean包内对应
随后把show页面中的类别修改一下
重新启动服务器测试
这里可以发现类别已经显示出来了
之后实现金额列“+”和“-”号的显示
在show页面中将原本的price改成如下,判断是否为增加或者减少金额再进行显示
结果
回到show页面
为form表单添加post请求,下拉框添加名称
在controller层添加方法处理请求
添加参数用于传递前端页面发来的数值
同样给service层的接口和实现类添加参数
实现类,将参数都封装起来传递
在dao层的BillMapper添加参数
回到controller
将参数添加进去
回到BillsMapper.xml文件,添加一些判断的sql语句
用于之后判断前端页面传来的账单类型和时间
在controller层接收数据,并且传给前台
启动服务器进行测试
日期也可以正常筛选
实现数据回显
回到controller层,将需要的起止时间和账单类型回传给前端页面
前端页面
回显时间
类别
用一个三目运算符进行判断,如果当前类型id和传来的id是相同的就选中当前的类型,如果不是则为空
测试
时间已经成功回显了
然而类型在搜索后不见了
在controller界面中将类别信息也添加进去,返回给前台
完善了
没有借入的数据,这里需要一个提示无数据的信息
在show页面用if进行一下判断,有值就正常显示
没有值就合并所有单元格然后显示无数据
刷新页面,完成
处理分页功能
先写几条应该有的功能
在service层添加相应参数
实现类
controller
新建一个util文件夹,创建一个PageUtil接口,为每页显示的总条数提供一个固定值
controller层添加每页的条数
使用分页插件,依赖包在最初已经添加,
把原来的List集合改成info
service层也改一下
controller层
show页面中接收的参数bills也需要修改成info.list
分页部分用来跳转页面的值
由于service层没有使用包装类,所以为了防止空指针,给typeid提供一个默认值。
当然最好使用包装类
添加一下分页的判断 如果是第一页或者最后一页则不能继续跳转
再添加一下模糊查询筛选之后的页数信息
测试,成功
4:添加数据部分
在show页面添加请求
controller页面处理请求,给前端add页面传值
新建一个add页面,按照需求添加对应的内容
启动服务器看一眼
show页面加一个请求名
在service层添加一个insert方法
实现类里也添加一下
controller页面接收从service层传来的数据
由于是使用对象来接受参数,要求页面里变量的名称和属性名一致
在show页面中添加title,price,billtime,explain这几个名称
tid也改成typeid
补全controller层的insert
此外在实现类中应该添加一个 @Transactional注解,因为在springMVC用的是注解型事务
补充一下数据源的防乱码
测试
完成
5:修改数据部分
在show页面中添加请求
在service接口添加方法
实现类
在controller层添加处理请求的方法
创建一个update.jsp,先直接照搬insert方法的界面,把几个show页面需要显示的值都添加一下
controller补充一下需要传的值
测试
和查询差不多的操作,也是都能显示成功,说明查询可行
修改一下请求名
老样子,先service层添加方法
实现类
controller层补全处理请求的方法
由于是用的对象传递参数,所以要保持名称一致,这里是直接复制的新增,其他都一致,还少一个主键查询的主键id
这里就使用隐藏域把id一起传递过来,有安全隐患,不建议用
controller层,添加一个if进行判断,传值成功就跳转
6:删除数据部分
show页面开始,添加请求
service接口添加方法
实现类
controller处理请求
这里和其他不一样是因为需要提示是否删除成功,给一个弹窗来作为提醒
补充一下
增删改应该都添加一下事务@Transactional
测试
至此项目就完成了。
总结
这个项目主要是熟悉SSM框架的使用,写的过程中就一直需要进行逐层调用的操作,所以每一层之间的值得传递需要注意。此外在项目过程中遇到的一些bug也已经写入笔记。有一个bug卡了很久是因为一个字母打错了,前前后后都检查了无数遍最后才发现。项目比较简单这个是作为学习的复习,同时也是做个备忘。希望自己找实习和工作顺利8~