部門管理
- 實體類
- dao接口與映射文件
- biz接口與其實現類
- 控制器
- 頁面
實體類
部門
public class Department {
private String sn;
private String name;
private String address;
//set和get
}
員工
public class Employee {
private String sn;
private String password;
private String name;
private String departmentSn;
private String post;
//get和set
}
處理記錄
//處理記錄
public class DealRecord {
private Integer id;
private Integer claimVoucherId;
private String dealSn;
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm")
private Date dealTime;
private String dealWay;
private String dealResult;
private String comment;
//get和set
}
報銷單
//報銷單
public class ClaimVoucher {
private Integer id;
private String cause;
private String createSn;
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm")
private Date createTime;
private String nextDealSn;
private Double totalAmount;
private String status;
//get和set
}
報銷單明細
public class ClaimVoucherItem {
private Integer id;
private Integer claimVoucherId;
private String item;
private Double amount;
private String comment;
//set和get
}
dao接口與映射文件
DepartmentDao
package com.imooc.oa.dao;
import com.imooc.oa.entity.Department;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository("departmentDao")
public interface DepartmentDao {
void insert(Department department);
void update(Department department);
void delete(String sn);
Department select(String sn);
List<Department> selectAll();
}
resources/com.imooc.oa.dao/DepartmentDao.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.4//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.imooc.oa.dao.DepartmentDao">
<resultMap id="department" type="Department">
<id property="sn" column="sn" javaType="String"/>
<result property="name" column="name" javaType="String"/>
<result property="address" column="address" javaType="String"/>
</resultMap>
<insert id="insert" parameterType="Department">
insert into department values(#{sn},#{name},#{address})
</insert>
<update id="update" parameterType="Department">
update department set name=#{name},address=#{address} where sn=#{sn}
</update>
<delete id="delete" parameterType="String">
delete from department where sn=#{sn}
</delete>
<select id="select" parameterType="String" resultMap="department">
select * from department where sn=#{sn}
</select>
<select id="selectAll" resultMap="department">
select * from department
</select>
</mapper>
oa_biz中com.imooc.oa.biz/DepartmentBiz.java
package com.imooc.oa.biz;
import com.imooc.oa.entity.Department;
import java.util.List;
public interface DepartmentBiz {
void add(Department department);
void edit(Department department);
void remove(String sn);
Department get(String sn);
List<Department> getAll();
}
實現類DepartmentBizImpl
package com.imooc.oa.biz.impl;
import com.imooc.oa.biz.DepartmentBiz;
import com.imooc.oa.dao.DepartmentDao;
import com.imooc.oa.entity.Department;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("departmentBiz")
public class DepartmentBizImpl implements DepartmentBiz {
@Autowired
private DepartmentDao departmentDao;
public void add(Department department) {
departmentDao.insert(department);
}
public void edit(Department department) {
departmentDao.update(department);
}
public void remove(String sn) {
departmentDao.delete(sn);
}
public Department get(String sn) {
return departmentDao.select(sn);
}
public List<Department> getAll() {
return departmentDao.selectAll();
}
}
發現有錯誤提示Could not autowired,There is more than one bean of XXX
配置文件配置過對mapper層的掃描了,應該是哪裏又按照ByName的方式掃描了一遍,那特麼肯定就是註解啊,自動掃描,按照ByName自動注入
括號內就是指定的要按照ByName注入的mapper層實例
在註解後的括號裏就已經指定了mapper層的bean名稱,然後再看配置文件:
在最後又把mapper掃描了一遍,所以纔會有兩個名字相同的mapper層的bean,解決方法有兩個,要麼去掉註解後面的內容,要麼去掉掃描mapper層的配置。
控制器
oa_web com.imooc.oa.controller.DepartmentController.java
package com.imooc.oa.controller;
import com.imooc.oa.biz.DepartmentBiz;
import com.imooc.oa.entity.Department;
import com.imooc.oa.entity.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;
@Controller("departmentController")
@RequestMapping("/department")
public class DepartmentController {
@Autowired
private DepartmentBiz departmentBiz;
@RequestMapping("/list")
public String list(Map<String,Object> map){
map.put("list",departmentBiz.getAll());
return "department_list";
}
@RequestMapping("/to_add")
public String toAdd(Map<String,Object> map){
map.put("department",new Department());
return "department_add";
}
@RequestMapping("/add")
public String add(Department department){
departmentBiz.add(department);
return "redirect:list";
}
@RequestMapping(value = "/to_update",params = "sn")
public String toUpdate(String sn,Map<String,Object> map){
map.put("department",departmentBiz.get(sn));
return "department_update";
}
@RequestMapping("/update")
public String update(Department department){
departmentBiz.edit(department);
return "redirect:list";
}
@RequestMapping(value = "/remove",params = "sn")
public String remove(String sn){
departmentBiz.remove(sn);
return "redirect:list";
}
}
頁面
top.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<!-- Mirrored from admindesigns.com/demos/absolute/1.1/admin_forms-validation.html by HTTrack Website Copier/3.x [XR&CO'2014], Thu, 06 Aug 2015 02:56:15 GMT -->
<head>
<!-- Meta, title, CSS, favicons, etc. -->
<meta charset="utf-8">
<title> 愛慕課OA--歡迎使用愛慕課OA系統 </title>
<link rel="stylesheet" type="text/css" href="/assets/skin/default_skin/css/theme.css">
<link rel="stylesheet" type="text/css" href="/assets/admin-tools/admin-forms/css/admin-forms.css">
<link rel="shortcut icon" href="/assets/img/favicon.ico">
</head>
<body class="admin-validation-page" data-spy="scroll" data-target="#nav-spy" data-offset="200">
<div id="main">
<header class="navbar navbar-fixed-top navbar-shadow">
<div class="navbar-branding">
<a class="navbar-brand" href="dashboard.html">
<b>愛慕課</b>OA
</a>
<span id="toggle_sidemenu_l" class="ad ad-lines"></span>
</div>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown menu-merge">
<a href="#" class="dropdown-toggle fw600 p15" data-toggle="dropdown">
<img src="/assets/img/avatars/5.jpg" alt="avatar" class="mw30 br64">
<span class="hidden-xs pl15"> 劉備 </span>
<span class="caret caret-tp hidden-xs"></span>
</a>
<ul class="dropdown-menu list-group dropdown-persist w250" role="menu">
<li class="list-group-item">
<a href="/self" class="animated animated-short fadeInUp">
<span class="fa fa-user"></span> 個人信息
<span class="label label-warning"></span>
</a>
</li>
<li class="list-group-item">
<a href="/to_change_password" class="animated animated-short fadeInUp">
<span class="fa fa-gear"></span> 設置密碼 </a>
</li>
<li class="dropdown-footer">
<a href="/quit" class="">
<span class="fa fa-power-off pr5"></span> 退出 </a>
</li>
</ul>
</li>
</ul>
</header>
<aside id="sidebar_left" class="nano nano-light affix">
<div class="sidebar-left-content nano-content">
<header class="sidebar-header">
<div class="sidebar-widget author-widget">
<div class="media">
<a class="media-left" href="#">
<img src="assets/img/avatars/3.jpg" class="img-responsive">
</a>
<div class="media-body">
<div class="media-author">劉備--總經理</div>
<div class="media-links">
<a href="/quit">退出</a>
</div>
</div>
</div>
</div>
<div class="sidebar-widget search-widget hidden">
<div class="input-group">
<span class="input-group-addon">
<i class="fa fa-search"></i>
</span>
<input type="text" id="sidebar-search" class="form-control" placeholder="Search...">
</div>
</div>
</header>
<ul class="nav sidebar-menu">
<li class="sidebar-label pt20">日常管理</li>
<li>
<a href="/claim_voucher/deal">
<span class="glyphicon glyphicon-book"></span>
<span class="sidebar-title">待處理報銷單</span>
<span class="sidebar-title-tray">
<span class="label label-xs bg-primary">New</span>
</span>
</a>
</li>
<li class="active">
<a href="/claim_voucher/self">
<span class="glyphicon glyphicon-home"></span>
<span class="sidebar-title">個人報銷單</span>
</a>
</li>
<li>
<a href="/claim_voucher/to_add">
<span class="fa fa-calendar"></span>
<span class="sidebar-title">填寫報銷單</span>
</a>
</li>
<li class="sidebar-label pt15">基礎信息管理</li>
<li>
<a class="accordion-toggle" href="#">
<span class="glyphicon glyphicon-check"></span>
<span class="sidebar-title">員工管理</span>
<span class="caret"></span>
</a>
<ul class="nav sub-nav">
<li>
<a href="/employee/list">
<span class="glyphicon glyphicon-calendar"></span> 所有員工 </a>
</li>
<li class="active">
<a href="/employee/to_add">
<span class="glyphicon glyphicon-check"></span> 添加員工 </a>
</li>
</ul>
</li>
<li>
<a class="accordion-toggle" href="#">
<span class="fa fa-columns"></span>
<span class="sidebar-title">部門管理</span>
<span class="caret"></span>
</a>
<ul class="nav sub-nav">
<li>
<a href="/department/list">
<span class="glyphicon glyphicon-calendar"></span> 所有部門 </a>
</li>
<li class="active">
<a href="/department/to_add">
<span class="glyphicon glyphicon-check"></span> 添加部門 </a>
</li>
</ul>
</li>
</ul>
<div class="sidebar-toggle-mini">
<a href="#">
<span class="fa fa-sign-out"></span>
</a>
</div>
</div>
</aside>
<section id="content_wrapper">
bottom.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
</section>
</div>
<style>
/* demo page styles */
body { min-height: 2300px; }
.content-header b,
.admin-form .panel.heading-border:before,
.admin-form .panel .heading-border:before {
transition: all 0.7s ease;
}
/* responsive demo styles */
@media (max-width: 800px) {
.admin-form .panel-body { padding: 18px 12px; }
}
</style>
<style>
.ui-datepicker select.ui-datepicker-month,
.ui-datepicker select.ui-datepicker-year {
width: 48%;
margin-top: 0;
margin-bottom: 0;
line-height: 25px;
text-indent: 3px;
color: #888;
border-color: #DDD;
background-color: #FDFDFD;
-webkit-appearance: none; /*Optionally disable dropdown arrow*/
}
</style>
<script src="/vendor/jquery/jquery-1.11.1.min.js"></script>
<script src="/vendor/jquery/jquery_ui/jquery-ui.min.js"></script>
<script src="/assets/admin-tools/admin-forms/js/jquery.validate.min.js"></script>
<script src="/assets/admin-tools/admin-forms/js/additional-methods.min.js"></script>
<script src="/assets/admin-tools/admin-forms/js/jquery-ui-datepicker.min.js"></script>
<script src="/assets/js/utility/utility.js"></script>
<script src="/assets/js/demo/demo.js"></script>
<script src="/assets/js/main.js"></script>
<script type="text/javascript" src="/js/pages.js"></script>
<script type="text/javascript" src="/js/items.js"></script>
</body>
</html>
depaerment_list.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:include page="top.jsp"/>
<section id="content" class="table-layout animated fadeIn">
<div class="tray tray-center">
<div class="content-header">
<h2> 部門列表 </h2>
<p class="lead"></p>
</div>
<div class="admin-form theme-primary mw1000 center-block" style="padding-bottom: 175px;">
<div class="panel heading-border">
<div class="panel-menu">
<div class="row">
<div class="hidden-xs hidden-sm col-md-3">
<div class="btn-group">
<button type="button" class="btn btn-default light">
<i class="fa fa-refresh"></i>
</button>
<button type="button" class="btn btn-default light">
<i class="fa fa-trash"></i>
</button>
<button type="button" class="btn btn-default light">
<i class="fa fa-plus" οnclick="javascript:window.location.href='/department/to_add';"></i>
</button>
</div>
</div>
<div class="col-xs-12 col-md-9 text-right">
<div class="btn-group">
<button type="button" class="btn btn-default light">
<i class="fa fa-chevron-left"></i>
</button>
<button type="button" class="btn btn-default light">
<i class="fa fa-chevron-right"></i>
</button>
</div>
</div>
</div>
</div>
<div class="panel-body pn">
<table id="message-table" class="table admin-form theme-warning tc-checkbox-1">
<thead>
<tr class="">
<th class="text-center hidden-xs">Select</th>
<th class="hidden-xs">部門編號</th>
<th class="hidden-xs">部門名稱</th>
<th class="hidden-xs">地址</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="dept">
<tr class="message-unread">
<td class="hidden-xs">
<label class="option block mn">
<input type="checkbox" name="mobileos" value="FR">
<span class="checkbox mn"></span>
</label>
</td>
<td>${dept.sn}</td>
<td>${dept.name}</td>
<td>${dept.address}</td>
<td>
<a href="/department/to_update?sn=${dept.sn}">編輯</a>
<a href="/department/remove?sn=${dept.sn}">刪除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
</div>
</div>
</section>
<jsp:include page="bottom.jsp"/>
運行出錯
錯誤:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)解決方法
在target中,DepartmentDao.class和xml沒有在同一個包下,xml並沒有編譯進來,所以我考慮下到可能xml所在的包有問題。
原先我的包創建命名,com.imooc.oa.dao,如圖
但是resources中建包是directory,directory和package建包在名稱上存在區別。
package建包,"."作爲作爲創建多級目錄。
directory建包,"."作爲名稱的一部分,要建多級目錄需要"/"
所以我命名,com.imooc.oa.dao對於directory而言是一個包,這個包名稱中有"."。
最後我通過 com/imooc/oa/dao,程序沒有報錯。