第一个ssm项目
结束spring,springMVC,mybatis的学习之后,将期末的java项目通过ssm框架进行复写,本章内容是基于ssm框架的门店维修管理系统,实现数据的增删改查。
目标:用ssm框架将原来的java项目进行复写,保证项目的正常运行,巩固学习
目标效果:
开发环境:
idea:2023
jdk:1.8
mysql:8
tomcat:9
maven:3.9
数据库代码:(数据库的名称自建)
CREATE TABLE tb_task(
task_id INT PRIMARY KEY AUTO_INCREMENT,
task_no VARCHAR(20) UNIQUE,
task_item VARCHAR(20),
cus_name VARCHAR(20),
cus_phone VARCHAR(20),
task_status INT
)
CREATE TABLE tb_fit(
fit_id INT PRIMARY KEY AUTO_INCREMENT,
fit_no VARCHAR(20) COMMENT '编号',
fit_name VARCHAR(20) COMMENT '名称',
fit_qty INT COMMENT '数量',
fit_city VARCHAR(20) COMMENT '产地'
)
基本环境搭建
项目结构:
项目搭建:
1.新建一个maven工程,然后添加以下依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.9</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.1</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>3.0.12.RELEASE</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency>
2.在main目录下新建目录webapp 和 资源目录resources
在项目结构里部署web.xml
修改部署路径 (添加src\main\webapp)
3.在web.xml里面进行配置
<!--配置spring的编码过滤器-->
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置处理请求方法的过滤器-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置springmvc的前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<!--将DispatcherServlet的初始化时间提前到服务器启动时-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--spring的监听器 在服务器启动时加载spring的配置文件-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--设置spring配置文件自定义的位置和名称-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</context-param>
4.在resources目录下新建spring,springmvc,mybatis,数据库连接的配置文件
springMVC.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:mvc="http://www.springframework.org/schema/mvc"
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 http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--扫描控制层组件-->
<context:component-scan base-package="com.wbu.ssm.mvc.controller"></context:component-scan>
<!--视图解析器-->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8"/>
</bean>
</property>
</bean>
</property>
</bean>
<!--默认的Servlet处理静态资源-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--开启mvc的注解驱动-->
<mvc:annotation-driven/>
<!--视图控制器-->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!-- <mvc:view-controller path="custom_view" view-name="custom_view"></mvc:view-controller>-->
<!--文件上传视图解析器-->
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"/>
<!--异常处理-->
</beans>
spring.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"
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">
<context:component-scan base-package="com.wbu.ssm.mvc"></context:component-scan>
</beans>
mybatis-config.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>
<properties resource="jdbc.properties"/>
<!-- environments:配置多个连接数据库的环境
属性:
default:设置默认使用的环境的id
-->
<!-- 类型别名 不区分大小写
typeAliases:设置某个类型的别名
属性:
type:设置需要设置别名的类型
alias:设置某个类型的别名
-->
<typeAliases>
<package name="com.wbu.ssm.mvc.bean"/>
</typeAliases>
<environments default="development">
<!-- environment:配置某个具体的环境
属性:
id:表示连接数据库的环境的唯一标识,不能重复
-->
<environment id="development">
<!-- transactionManager: 设置事务管理方式
属性:
type="JDBC||MANAGED"
JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事务的提交或回滚需要手动处理
MANAGED:被管理,例如Spring
-->
<transactionManager type="JDBC"/>
<!-- DataSource:配置数据源
属性:
type:设置数据源的类型
type="POOLED|UNPOOLED|JNDI"
POOLED:表示使用数据库连接池缓存数据库连接
UNPOOLED:表示不适用数据库连接池
JNDI:表示使用上下文中的数据源
-->
<dataSource type="POOLED">
<!-- JDBC 驱动-->
<property name="driver" value="${jdbc.driver}"/>
<!-- url数据库的 JDBC URL地址。-->
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--引入映射文件-->
<package name="com.wbu.ssm.mvc.mapper"/>
</mappers>
</configuration>
jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=
jdbc.username=
jdbc.password=
5.在webapp目录下新建静态资源目录存放js和css文件
6.前端代码
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
<script th:src="@{/static/jquery-3.6.4.js}"></script>
<script th:src="@{/static/bootstrap.js}"></script>
<script th:src="@{/static/vue2.js}"></script>
<script th:src="@{/static/axios.js}"></script>
<link rel="stylesheet" th:href="@{/static/bootstrap.css}">
<link rel="shortcut icon" th:href="@{/static/favicon.ico}">
<style>
button{
margin-left:5px;
}
</style>
<body>
<div class="container" id="app">
<div class="row">
<div class="col-md-3" style="margin-top: 50px;">
<div class="list-group">
<a href="#" class="list-group-item active">华为门店维修接待管理系统</a>
<a href="#" @click="show_manager(1)" class="list-group-item">客户接待</a>
<a href="#" @click="show_manager(2)" class="list-group-item">维修管理</a>
<a href="#" @click="show_manager(3)" class="list-group-item">配件查询</a>
</div>
</div>
<div class="col-md-9" style="margin-top:50px ;">
<div v-if="cus_view" class="panel panel-primary">
<div class="panel-heading">客户办理业务信息列表</div>
<div class="panel-body">
<p>
<form class="form-inline">
<div class="form-group">
<label>客户名</label>
<input type="text" style="width:80px" class="form-control" id="cus_name" placeholder="请输入姓名">
</div>
<div class="form-group">
<label>客户电话</label>
<input type="number" class="form-control" id="cus_phone" placeholder="请输入电话号码">
</div>
<div class="form-group">
<label>维修项目</label>
<select class="form-control" id="task_item">
<option>电池</option>
<option>外屏</option>
<option>内屏</option>
<option>摄像头</option>
<option>主板</option>
</select>
</div>
<button type="button" @click="save_task()" class="btn btn-danger">接待客户</button>
</form>
</p>
</div>
<table class="table table-bordered table-striped table-hover">
<thead>
<tr align="center" style="font-weight: bold;">
<td>任务编号</td>
<td>姓名</td>
<td>联系电话</td>
<td>业务项目</td>
<td>状态</td>
<td>操作</td>
</tr>
</thead>
<tbody align="center" class="ttr">
<tr v-for="task in task_list">
<td>{{task.task_no}}</td>
<td>{{task.cus_name}}</td>
<td>{{task.cus_phone}}</td>
<td>{{task.task_item}}</td>
<td>{{task.task_status==0?"录单完成":task.task_status==1?"维修中":"取机"}}</td>
<td>
<button class="btn btn-warning">查看</button>
<button class="btn btn-primary" @click="removeTask(task.task_no)">删除</button>
</td>
</tr>
</tbody>
</table>
</div>
<div class="panel panel-primary" v-if="service_view">
<div class="panel-heading">维修信息列表</div>
<table class="table table-bordered table-striped table-hover">
<thead>
<tr align="center" style="font-weight: bold;">
<td>任务编号</td>
<td>姓名</td>
<td>联系电话</td>
<td>业务项目</td>
<td>状态</td>
<td>操作</td>
</tr>
</thead>
<tbody class="ttr" align="center">
<tr v-for="service in service_list">
<td>{{service.task_no}}</td>
<td>{{service.cus_name}}</td>
<td>{{service.cus_phone}}</td>
<td>{{service.task_item}}</td>
<td>{{service.task_status==0?"录单完成":service.task_status==1?"维修中":"取机"}}</td>
<td>
<button v-if="service.task_status==0" @click="change_status(service.task_no,'',1)" class="btn btn-warning">开始维修</button>
<button v-if="service.task_status==1" @click="change_status(service.task_no,service.task_item,2)"class="btn btn-primary">完成维修</button>
</td>
</tr>
</tbody>
</table>
</div>
<div v-if="fit_view" class="panel panel-primary">
<div class="panel-heading">库存配件信息列表</div>
<div class="panel-body">
<table class="table table-bordered table-striped table-hover">
<thead>
<tr align="center" style="font-weight: bold;">
<td>配件编号</td>
<td>配件名称</td>
<td>库存数量</td>
<td>产地</td>
</tr>
</thead>
<tbody class="ttr" align="center">
<tr v-for="fit in fit_list">
<td>{{fit.fit_no}}</td>
<td>{{fit.fit_name}}</td>
<td>{{fit.fit_qty}}</td>
<td>{{fit.fit_city}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div>
<a th:href="@{/custom_view}" target="_blank">点这里</a>
</div>
</div>
<script type="text/javascript">
Vue.config.productionTip=false
new Vue({
el:'#app',
data(){
return{
task_list:[],
service_list:[],
fit_list:[],
cus_view:true,
service_view:false,
fit_view:false
}
},
mounted(){//当Vue加载时执行
this.query_all()
},
methods:{
query_all:function (){
var that = this
$.post("http://localhost:8080/ssm/index?name=query_all",function (data){
that.task_list=data
})
},
query_all_service:function (){
var that = this
$.post("http://localhost:8080/ssm/index?name=query_all",function (data){
that.service_list=data
})
},
query_all_fit:function(){
var that = this;
$.post("http://localhost:8080/ssm/index?name=query_all_fit",function(data){
that.fit_list=data;
});
},
change_status:function(task_no,task_item,task_status){
var that = this;
if(confirm("确认修改["+task_no+"]?")){
$.post("http://localhost:8080/ssm/index?name=edit_status",{
"task_no":task_no,
"task_item":task_item,
"task_status":task_status
},function(data){
that.query_all_service();
});
}
},
removeTask:function(task_no){
var that = this;
// this.task_no=task_no;
if(confirm("确认删除["+task_no+"]?")){
$.post("http://localhost:8080/ssm/index?name=remove_task",{
"task_no":task_no
},function(data){
that.query_all();
});
}
},
show_manager:function(flag){
if(flag==1){
this.cus_view=true;
this.service_view=false;
this.fit_view=false;
// this.query_all;
}else if(flag==2){
this.cus_view=false;
this.service_view=true;
this.fit_view=false;
this.query_all_service();
}else if(flag==3){
this.cus_view=false;
this.service_view=false;
this.fit_view=true;
this.query_all_fit();
}
},
save_task:function(){
var cus_name = $("#cus_name").val();
var cus_phone = $("#cus_phone").val();
var task_item = $("#task_item").val();
var that = this;
$.post("http://localhost:8080/ssm/index?name=save_task",{
"cus_name":cus_name,
"cus_phone":cus_phone,
"task_item":task_item
},function(data){
that.query_all();
$("#cus_name").val("");
$("#cus_phone").val("");
$("#task_item").val("");
});
}
}
})
</script>
</body>
</html>
custom_view.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script th:src="@{/static/jquery-3.6.4.js}"></script>
<script th:src="@{/static/bootstrap.js}"></script>
<script th:src="@{/static/vue2.js}"></script>
<script th:src="@{/static/axios.js}"></script>
<link rel="stylesheet" th:href="@{/static/bootstrap.css}">
<link rel="shortcut icon" th:href="@{/static/favicon.ico}">
<style>
.ttr tr{
height: 25px;
text-align: center;
}
.ttr1 tr{
height: 60px;
text-align: center;
}
</style>
</head>
<body>
<div class="container" style="margin-top: 100px;" id="app">
<div class="row">
<div class="col-md-9">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">业务处理进度</h3>
</div>
<div class="panel-body">
<table class="table">
<tbody class="ttr1">
<tr align="center" v-for="task in service_list">
<td>{{task.task_no}}</td>
<td style="width: 65%;">
<div class="progress">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100"
:style="'width:'+(task.task_status==0?'20':task.task_status==1?'60':'100')+'%'">
{{task.task_status==0?'20':task.task_status==1?'60':'100'}}%
</div>
</div>
</td>
<td>{{task.task_status==0?"录单完成":task.task_status==1?"维修中":"取机"}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-md-3">
<div class="panel panel-primary">
<div class="panel-heading">任务条目</div>
<table class="table table-bordered table-hover table-striped">
<thead>
<tr align="center" style="font-weight: bold;">
<td>任务编号</td>
<td>项目</td>
</tr>
</thead>
<tbody class="ttr warning">
<tr :class="task.task_status==2?'info':''" v-for="task in service_list">
<td>{{task.task_no}}</td>
<td>换{{task.task_item}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<script>
new Vue({
el:"#app",
data(){
return{
service_list:[]
}
},
mounted(){
this.loadData()
var that = this
setInterval(function (){
that.loadData()
},3000)
},
methods:{
loadData:function (){
var that = this
axios({
method:'post',
url:'http://localhost:8080/ssm/custom_view?name=query_all'
}).then(function (response){
that.service_list=response.data;
})
// var that = this
// $.post("http://localhost:8080/ssm/custom_view?name=query_all",function (data){
// that.service_list=data
// })
}
}
})
</script>
</body>
</html>
7.根据前端代码开始java代码的编写
实体层
Fit.class
package com.wbu.ssm.mvc.bean;
/**
* @auther aqing
*/
import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;
@Component
@Setter
@Getter
public class Fit {
private int fit_id;
private String fit_no;
private String fit_name;
private int fit_qty;
private String fit_city;
public Fit() {
}
public Fit(int fit_id, String fit_no, String fit_name, int fit_qty, String fit_city) {
this.fit_id = fit_id;
this.fit_no = fit_no;
this.fit_name = fit_name;
this.fit_qty = fit_qty;
this.fit_city = fit_city;
}
@Override
public String toString() {
return "Fit{" +
"fit_id=" + fit_id +
", fit_no='" + fit_no + '\'' +
", fit_name='" + fit_name + '\'' +
", fit_qty=" + fit_qty +
", fit_city='" + fit_city + '\'' +
'}';
}
}
Task.class
package com.wbu.ssm.mvc.bean;
/**
* @auther aqing
*/
import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;
@Component
@Setter
@Getter
public class Task {
private int task_id;
private String task_no;
private String task_item;
private String cus_name;
private String cus_phone;
private int task_status;
public Task() {
}
public Task(int task_id, String task_no, String task_item, String cus_name, String cus_phone, int task_status) {
this.task_id = task_id;
this.task_no = task_no;
this.task_item = task_item;
this.cus_name = cus_name;
this.cus_phone = cus_phone;
this.task_status = task_status;
}
@Override
public String toString() {
return "Task{" +
"task_id=" + task_id +
", task_no='" + task_no + '\'' +
", task_item='" + task_item + '\'' +
", cus_name='" + cus_name + '\'' +
", cus_phone='" + cus_phone + '\'' +
", task_status=" + task_status +
'}';
}
}
控制层
IndexController
package com.wbu.ssm.mvc.controller;
/**
* @auther aqing
*/
import com.wbu.ssm.mvc.bean.Fit;
import com.wbu.ssm.mvc.bean.Task;
import com.wbu.ssm.mvc.dao.TaskDao;
import com.wbu.ssm.mvc.mapper.FitDaoMapper;
import com.wbu.ssm.mvc.mapper.TaskDaoMapper;
import com.wbu.ssm.mvc.utils.CodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
public class IndexController {
@Autowired
private TaskDaoMapper taskDaoMapper;
@Autowired
private FitDaoMapper fitDaoMapper;
@RequestMapping(value = "/index",params = "name=query_all")
@ResponseBody
public List<Task> taskList(){
return taskDaoMapper.queryAllTask();
}
@RequestMapping(value = "/index",params = "name=query_all_fit")
@ResponseBody
public List<Fit> fitList(){
return fitDaoMapper.findAllFit();
}
@RequestMapping(value = "/index",params = "name=edit_status")
@ResponseBody
public int change_status(String task_no,String task_item,int task_status){
return taskDaoMapper.editTaskStatus(task_no,task_status);
}
@RequestMapping(value = "/index",params = "name=remove_task")
@ResponseBody
public int remove_task(String task_no){
return taskDaoMapper.removeTask(task_no);
}
@RequestMapping(value = "index",params = "name=save_task")
@ResponseBody
public int save_task(String cus_name,String cus_phone,String task_item){
return taskDaoMapper.saveTask(CodeUtils.getCode(),cus_name,cus_phone,task_item);
}
}
CustomController
package com.wbu.ssm.mvc.controller;
/**
* @auther aqing
*/
import com.wbu.ssm.mvc.bean.Task;
import com.wbu.ssm.mvc.mapper.TaskDaoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
public class CustomController {
@Autowired
private TaskDaoMapper taskDaoMapper;
@RequestMapping("/custom_view")
public String custom(){
return "custom_view";
}
@RequestMapping(value = "/custom_view",params = "name=query_all")
@ResponseBody
public List<Task> test(){
return taskDaoMapper.queryAllTask();
}
}
dao层
TaskDao.class
package com.wbu.ssm.mvc.dao;
/**
* @auther aqing
*/
import com.wbu.ssm.mvc.bean.Task;
import com.wbu.ssm.mvc.mapper.TaskDaoMapper;
import com.wbu.ssm.mvc.utils.CodeUtils;
import com.wbu.ssm.mvc.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class TaskDao implements TaskDaoMapper {
@Test@Override
public List<Task> queryAllTask() {
SqlSession sqlSession = SqlSessionUtil.getSession();
TaskDaoMapper mapper = sqlSession.getMapper(TaskDaoMapper.class);
List<Task> tasks = mapper.queryAllTask();
return tasks;
}
@Test@Override
public int saveTask(String task_no, String cus_name, String cus_phone, String task_item) {
SqlSession sqlSession = SqlSessionUtil.getSession();
TaskDaoMapper mapper = sqlSession.getMapper(TaskDaoMapper.class);
int saveTask = mapper.saveTask(CodeUtils.getCode(),cus_name,cus_phone,task_item);
System.out.println(saveTask);
return saveTask;
}
@Test@Override
public int removeTask(String task_no) {
SqlSession sqlSession = SqlSessionUtil.getSession();
TaskDaoMapper mapper = sqlSession.getMapper(TaskDaoMapper.class);
int removeTask = mapper.removeTask(task_no);
System.out.println(removeTask);
return removeTask;
}
@Test@Override
public int editTaskStatus(String task_no, int status) {
SqlSession SqlSession = SqlSessionUtil.getSession();
TaskDaoMapper mapper = SqlSession.getMapper(TaskDaoMapper.class);
int editTaskStatus = mapper.editTaskStatus(task_no,status);
System.out.println(editTaskStatus);
return editTaskStatus;
}
}
FitDao.class
package com.wbu.ssm.mvc.dao;
/**
* @auther aqing
*/
import com.wbu.ssm.mvc.bean.Fit;
import com.wbu.ssm.mvc.mapper.FitDaoMapper;
import com.wbu.ssm.mvc.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class FitDao implements FitDaoMapper {
@Test
@Override
public List<Fit> findAllFit() {
SqlSession sqlSession = SqlSessionUtil.getSession();
FitDaoMapper mapper = sqlSession.getMapper(FitDaoMapper.class);
List<Fit> allFit = mapper.findAllFit();
System.out.println(allFit);
return allFit;
}
@Test@Override
public int changeQty(String task_item) {
SqlSession sqlSession = SqlSessionUtil.getSession();
FitDaoMapper mapper = sqlSession.getMapper(FitDaoMapper.class);
int changeQty = mapper.changeQty(task_item);
System.out.println(changeQty);
return changeQty;
}
}
工具层
CodeUtils.class (返回的是任务编号)
package com.wbu.ssm.mvc.utils;
/**
* @auther aqing
*/
import java.text.SimpleDateFormat;
import java.util.Date;
public class CodeUtils {
public static String getCode(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss");
// System.out.println(sdf.format(new Date()));
return "T-"+sdf.format(new Date())+"\n";
}
}
SqlSessionUtil.class
package com.wbu.ssm.mvc.utils;
/**
* @auther aqing
*/
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SqlSessionUtil {
public static SqlSession getSession(){
SqlSession sqlSession = null;
try {
InputStream rs = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory build = sqlSessionFactoryBuilder.build(rs);
sqlSession = build.openSession(true);
} catch (IOException e) {
throw new RuntimeException(e);
}
return sqlSession;
}
}
mapper 层
FitDaoMapper.class
package com.wbu.ssm.mvc.mapper;
/**
* @auther aqing
*/
import com.wbu.ssm.mvc.bean.Fit;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
public interface FitDaoMapper {
@Select("SELECT * FROM tb_fit")
List<Fit> findAllFit();
@Update("UPDATE tb_fit SET fit_qty = fit_qty-1 WHERE fit_name = #{task_item}")
int changeQty(@Param("task_item") String task_item);
}
TaskDaoMapper.class
package com.wbu.ssm.mvc.mapper;
/**
* @auther aqing
*/
import com.wbu.ssm.mvc.bean.Task;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface TaskDaoMapper {
@Select("select * from tb_task")
List<Task> queryAllTask();
@Insert("insert into tb_task(task_no,cus_name,cus_phone,task_item,task_status) values(#{task_no},#{cus_name},#{cus_phone},#{task_item},0)")
int saveTask(@Param("task_no") String task_no, @Param("cus_name") String cus_name, @Param("cus_phone") String cus_phone, @Param("task_item") String task_item);
@Delete("delete from tb_task where task_no = #{task_no}")
int removeTask(@Param("task_no") String task_no);
@Update("update tb_task set task_status = #{status} where task_no = #{task_no}")
int editTaskStatus(@Param("task_no") String task_no,@Param("status") int status);
}
最后补充一点就是不小心忘了部署Tomcat
最后点击应用确定
当需要程序跑起来的时候 点击调试Tomcat就可以 也就是将项目部署到tomcat上面,等待程序执行
最后做个总结
使用ssm框架确实是要比纯Java代码写要更加方便简单,以本项目为例,我们看看不使用框架的时候需要怎么去做
在main函数里添加端口监听,创建执行上下文,然后实现TestHandler()
HttpServer server = HttpServer.create(new InetSocketAddress(80),0);
server.createContext("/task",new TestHandler());
server.start();
然后对之后的数据处理做一些准备
public void handle(final HttpExchange exchange) {
//为了加快处理速度 每来一个请求就新建一个线程来处理
new Thread(new Runnable() {
@Override
public void run() {
try {
// 获得查询字符串(get)
String queryString = exchange.getRequestURI().getQuery();
Map<String, String> queryStringInfo = formData2Dic(queryString);
System.out.println(queryStringInfo);
// 获得表单提交数据(post)
@SuppressWarnings("deprecation")
String postString = IOUtils.toString(exchange.getRequestBody());
System.out.println(postString);
Map<String, String> postInfo = formData2Dic(postString);
//用来处理响应的类型 =========================================json
exchange.getResponseHeaders().add("Content-Type", "application/json");
//用来处理跨域==================================================所有人都可以访问
exchange.getResponseHeaders().add("Access-Control-Allow-Origin", "*");
//设置响应码 200 OK
exchange.sendResponseHeaders(200, 0);
//取得输出流
OutputStream os = exchange.getResponseBody();
//业务处理
String response = "{}";
//取得浏览器请求过来的方式
String method = exchange.getRequestMethod();
if (method.equals("POST") || method.equals("GET")) {
if (queryStringInfo.get("name").equals("query_all")) {//查询所有的业务
//调用Dao层查询
List<Task> taskList=dao.queryAllTask();
//将集合转成JOSN
String jsonList=gson.toJson(taskList);
response = jsonList;
}if(queryStringInfo.get("name").equals("query_all_fit")) {
List<Fit> fitList = fitDao.findAllFit();
String jsonList = gson.toJson(fitList);
response = jsonList;
}else if(queryStringInfo.get("name").equals("save_task")) {
String cus_name = postInfo.get("cus_name");
String cus_phone = postInfo.get("cus_phone");
String task_item = postInfo.get("task_item");
// System.out.println(cus_name);
// System.out.println(cus_phone);
// System.out.println(task_item);
int row = dao.saveTask(cus_name, cus_phone, task_item);
response=String.valueOf(row);
}else if(queryStringInfo.get("name").equals("query_one")) {
response="";
}else if(queryStringInfo.get("name").equals("remove_task")) {
String task_no = postInfo.get("task_no");
int row = dao.removeTask(task_no);
response=String.valueOf(row);
}else if(queryStringInfo.get("name").equals("edit_status")) {
String task_no = postInfo.get("task_no");
String task_item = postInfo.get("task_item");
int task_status = Integer.parseInt(postInfo.get("task_status"));
int row = dao.editTaskStatus(task_no, task_status);
if(row==1&&task_status==2) {
fitDao.changeQty(task_item);
}
response=String.valueOf(row);
}else if(queryStringInfo.get("name").equals("Login")) {
System.out.println("成功登录");
}
}
//输出 将内容转成字符数据输出 编码
os.write(response.getBytes("UTF-8"));
os.close();
} catch (IOException ie) {
ie.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
解析网页提交的数据
/**
* 专用于解析网页提交过来的数据 转成map类型
* @param formData
* @return
*/
public static Map<String, String> formData2Dic(String formData) {
final Map<String, String> result = new HashMap<>();
if (formData == null || formData.trim().length() == 0) {
return result;
}
final String[] items = formData.split("&");
//stream终止操作 将一个数组转换成一个流
Arrays.stream(items).forEach(item -> {
final String[] keyAndVal = item.split("=");
if (keyAndVal.length == 2) {
try {
final String key = URLDecoder.decode(keyAndVal[0], "utf8");
final String val = URLDecoder.decode(keyAndVal[1], "utf8");
result.put(key, val);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
});
return result;
}
在springMVC中通过@RequestMapping注解就可以实现上述的操作,不难看出ssm框架方便我们去写代码,但是一些底层原理还是要掌握的。