第一个完整的web probject,值得记录下来的一点心得;
还是老规矩,不啰嗦,直接上代码;
第一部分:创建一个web project ,导入jar包,配置文件等;
配置文件部分:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>deptMangage</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>dept</servlet-name>
<servlet-class>com.emp.servlet.GeptServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dept</servlet-name>
<url-pattern>/dept.do</url-pattern>
</servlet-mapping>
</web-app>
**接着就是第二部分,前端页面,我是直接导入js文件,之前有用jquery写过一个表格组件,就直接拿过来用了,js,css部分(还要导入一个js文件,直接下载就好了)
**
js部分:
;(function ($) {
var myGridFun = function ($dom,opts) {
this.$grid = $dom;
this.$opts = opts;
this.defaultOpt = {
//斑马线
zebraCrossing:true,
width:'100%',
//是否支持多选
multiple : false,
//选择列是否显示
selectColumn:false,
//是否支持编辑
edited:false
}
//合并参数
var setting = $.extend({}, this.defaultOpt, opts);
this.setting = setting;
this.init();
}
myGridFun.prototype = {
init:function () {
this.initGridDom();
},
//初始化表格dom
initGridDom : function () {
this.loadGridHead();
var dataSource = this.setting.dataSource || [];
this.loadDateDom(dataSource);
gridEvent.editEvent(this);
},
//初始化表头
loadGridHead : function () {
this.$grid.html("");
var columns = this.setting.columns || [];
var codes = [];
//拼接grid表头
codes.push("<thead>");
/*
<td class="select-column"><input type="checkbox" name="dataCheckbox"></td>
*/
codes.push("<tr>");
//加载多选框
if (this.setting.selectColumn === true && this.setting.multiple === true) {
codes.push('<th class="select-column">');
codes.push('<input type="checkbox" name="checkboxAll">');
codes.push('</th>');
}
for (var i = 0; i < columns.length; i++) {
var c = columns[i];
//取出配置的字段和标题
var field = c.field,title = c.title;
codes.push("<th field='"+field+"'>");
codes.push(title);
codes.push("</th>");
}
codes.push("</tr>");
codes.push("</thead>");
//追加表头
this.$grid.append(codes.join(""));
//设置表格的宽度
this.$grid.css("width",this.setting.width);
//加载列头复选框事件
if (this.setting.selectColumn === true && this.setting.multiple === true) {
var check = this.$grid.find('input[type="checkbox"][name="checkboxAll"]');
gridEvent.checkboxAllEvent(check,this);
}
},
//单行数据dom创建
createDataTrDom : function (data) {
var _this = this;
//获取配置信息
var columns = this.setting.columns || [] ;
var ds = data;//{name:'秋香',age:'18',hobby:'唐伯虎'}, ds.field ds['name']
var $tr = $("<tr class='datagrid-row'>");
//在tr上缓存当前行的记录
$tr.data("row-data",ds);
//加载多选框
if (this.setting.selectColumn === true && this.setting.multiple === true) {
$tr.append('<td class="select-column"><input type="checkbox" name="dataCheckbox"></td>');
}
//查询grid所需要的字段
for (var j = 0; j < columns.length; j++) {
//获取字段
var field = columns[j].field;
//获取字段在数据中所对应的值
var value = ds[field];
//判断是否存在渲染函数
if ($.isFunction(columns[j].rendering)) {
//执行渲染回调函数
value = columns[j].rendering.call(_this,ds,$tr);
//value = columns[j].rendering(ds,$tr)
}
//td添加到tr中
$tr.append("<td field='"+field+"'>"+value+"</td>");
}
return $tr;
},
//加载数据元素
loadDateDom : function (dataSource) {
var _this = this;
//获取配置信息
var set = this.setting;
var columns = set.columns || [] ;
//创建jquery tbody对象
var $tbody = $("<tbody>");
for (var i = 0; i < dataSource.length; i++) {
$tbody.append(this.createDataTrDom(dataSource[i]));
}
//清空数据
this.$grid.find("tbody").remove();
//追加数据
this.$grid.append($tbody);
//事件处理
this.rowDataEvent();
},
//数据行的事件处理
rowDataEvent : function () {
var _this = this;
//数据行TD点击事件
this.$grid.find("tbody tr.datagrid-row td[field]").unbind('click').bind('click', function(event) {
//获取行数据
var rowData =$(this).parents("tr.datagrid-row").data('row-data');
//获取被点击的td所对应的字段名
var field =$(this).attr("field");
var events = _this.setting.events || {};
//执行用户自定义td点击事件
if ($.isFunction(events.tdClick)) {
//执行td点击事件回调函数
value = events.tdClick.call(_this,$(this),rowData[field],rowData);
}
});
//行点击,选择数据
this.$grid.find("tbody tr.datagrid-row").unbind('click').bind('click', function(event) {
gridEvent.trClick(this,event,_this);
});
//多选框事件
if (this.setting.selectColumn === true && this.setting.multiple === true) {
var checks = this.$grid.find('input[type="checkbox"][name="dataCheckbox"]');
gridEvent.dataCheckboxChange(checks,this);
}
},
//增加数据
addData : function (datas) {
//获取tbody对象
var $tbody = this.$grid.find("tbody");
for (var i = 0; i < datas.length; i++) {
$tbody.append(this.createDataTrDom(datas[i]));
}
//事件处理
this.rowDataEvent();
},
//获取选中的数据
getSelectDatas : function () {
var selects = this.$grid.find("tbody tr.datagrid-row-selected");
var datas = [];
selects.each(function(index, el) {
datas.push($(this).data("row-data"))
});
return datas;
},
//刷新数据
refreshData : function (data) {
//如果传进来的数据为空则刷新原有数据,否则加载新的数据
if (!gridEvent.isNotNull(data)) {
data = this.setting.dataSource || [];
}
this.loadDateDom(data);
},
//根据行号修改字段值
updateFieldByRowNo : function (rowNo,field,value) {
//获取指定行的对象
var $tr = this.$grid.find('tbody tr.datagrid-row:eq('+rowNo+')');
//修改显示字段
$tr.find("td[field='"+field+"']").text(value);
//获取数据
var rowData = $tr.data('row-data');
rowData[field] = value;
//刷新缓存数据
$tr.data('row-data',rowData);
},
//根据行号修改行数据
updateRowDataByRowNo : function (rowNo,rowData) {
var _this = this;
$.each(rowData,function(key, value) {
_this.updateFieldByRowNo(rowNo,key,value);
});
},
hideColumn : function (columnName) {
this.$grid.find("th[field='"+columnName+"']").hide();
this.$grid.find("td[field='"+columnName+"']").hide();
},
showColumn : function (columnName) {
this.$grid.find("th[field='"+columnName+"']").show();
this.$grid.find("td[field='"+columnName+"']").show();
},
//根据td删除数据
deleteDataByTd : function ($td) {
$($td).parents("tr.datagrid-row").remove();
}
}
var gridEvent = {
//表格TD编辑事件
editEvent : function (pthis) {
//如果表格配置不支持编辑,直接return
if (pthis.setting.edited !== true)
return ;
pthis.$grid.find("tbody tr.datagrid-row td[field]").unbind("dblclick").bind('dblclick', function(event) {
var _this = this;
//获取td field属性值
var field = $(this).attr('field'); //hobby
//查找字段的编辑配置(判断具体的字段是否支持编辑)
for (var i = 0; i < pthis.setting.columns.length; i++) {
var column = pthis.setting.columns[i];
if (field == column.field) {
//如果字段配置了不可编辑,则跳出事件
if (column.edited === false) {
return ;
}
}
}
//this;//当前双击的TD对象
var text = $(this).text();
var input = $('<input type="text" style="width:calc(100% - 4px)">');
input.val(text);
$(this).html(input);
//让input获得焦点(编辑状态)
input.focus();
//输入回车 提交修改值
input.keyup(function(event) {
event.keyCode == 13 ? input.blur() : false;
});
//input失去焦点事件
input.blur(function(event) {
//获取输入框的值
var value = $(this).val();
//将输入框的值填充到TD里面
$(_this).html(value);
//修改缓存数据
var rowData = $(_this).parents("tr.datagrid-row").data("row-data");
rowData[field] = value;
$(_this).parents("tr.datagrid-row").data("row-data",rowData);
});
});
},
//数据行点击事件
trClick : function (_this,e,pthis) {
//如果行没有选中,则选中数据,如果已经选中,就取消选中
//获取数据配置
var set = pthis.setting;
set.multiple == false ? $(_this).siblings("tr.datagrid-row-selected").removeClass('datagrid-row-selected') : true;
if ($(_this).hasClass("datagrid-row-selected")) {
$(_this).removeClass('datagrid-row-selected');
} else {
//添加选中数据项
$(_this).addClass('datagrid-row-selected');
}
var check = $(_this).find('input[name="dataCheckbox"]');
if (null != check && check.length != 0 ){
if ($(check).is(':checked')) {//.removeAttr("checked")
//$(check).attr('checked',false);
$(check).prop("checked",false);
} else {
$(check).prop('checked',true);
}
}
//阻止事件冒泡
e.stopPropagation();
},
//列头多选框事件
checkboxAllEvent : function (_this,pthis) {
$(_this).unbind('click').bind('click', function(event) {
//判断复选框是否选中
if ($(this).is(':checked')) {
//全选
var dataCheckboxs = pthis.$grid.find('input[name="dataCheckbox"]');
dataCheckboxs.each(function(index, el) {
if (!$(this).is(':checked')) {
//模拟点击(勾选)
$(this).click();
}
});
} else {//全取消
//全选
var dataCheckboxs = pthis.$grid.find('input[name="dataCheckbox"]');
dataCheckboxs.each(function(index, el) {
if ($(this).is(':checked')) {
//模拟点击(取消勾选)
$(this).click();
}
});
}
});
},
//数据列复选框事件
dataCheckboxChange : function (_this,pthis) {
$(_this).unbind('click').bind('click', function(event) {
if ($(this).is(':checked')) {
//选中,增加数据选中标识
$(this).parents("tr.datagrid-row").addClass('datagrid-row-selected');
} else {
//取消数据选择(去除‘datagrid-row-selected’)
$(this).parents("tr.datagrid-row").removeClass('datagrid-row-selected');
}
//阻止事件冒泡
event.stopPropagation();
});
},
isNotNull : function (obj) {
if (undefined != obj && null != obj && "" != obj) {
return true;
} else {
return false;
}
}
}
//入口
$.fn.myGrid = function (opts) {
var mg = new myGridFun(this,opts);
return mg;
}
})(jQuery);
css部分:
.my-table
{
border-collapse: collapse;
margin: 0 auto;
text-align: center;
}
.my-table td, .my-table th
{
border: 1px solid #cad9ea;
color: #666;
height: 30px;
}
.my-table thead th
{
background-color: #CCE8EB;
width: 100px;
}
.my-table tbody td{
font-size: 13px;
}
.my-table tbody tr:hover{
background: #eaf2ff;
}
.my-table .datagrid-row{
height:25px;
}
.my-table .datagrid-row td{
height: 25px;
}
.my-table .datagrid-row-selected{
background: #ffe48d !important;
}
.my-table .select-column{
width: 10px;
}
.my-table .select-column input[type='checkbox']{
margin:0px;
padding: 0px;
}
第三前端html页面部分:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>挨踢教育部门管理</title>
<link rel="stylesheet" type="text/css" href="my-grid.css">
<script type="text/javascript" src="jquery-3.3.1.js"></script>
<script type="text/javascript" src="my-grid.js"></script>
</head>
<body>
<h1 style="text-align : center;">挨踢教育部门管理</h1>
<h2>部门信息</h2>
<p>部门名称:<input id = "deptName" ></p>
<p>办公地址:<input id= "loc"></p>
<p><button id="addDept">增加部门</button>
<h2>修改信息</h2>
<p>部门编号:<input id="deptNoU" readonly = "readonly">
<p>部门名称:<input id="deptNameU">
<p>办公地址:<input id="locU">
<p><button id="updataDept">修改部门</button>
<table id="myGridTable" class="my-table" style="margin-top:-380px;"></table>
</body>
<script type="text/javascript">
//单击事件新增
$("#addDept").click(function(){
var deptName = $("#deptName").val();
var loc = $("#loc").val();
//组装对象
var dept = {
name : deptName,
loc: loc
}
//增加数据
$.ajax({
url:'http://localhost:8080/deptMangage/dept.do?method=add',
type:'POST',
data:dept,
success:function(datas){
var datas = JSON.parse(datas);
if(datas.issuccess == true){
//重新加载数据表格
findAllDeptInfos();
//alert("新增成功");
}else{
alert("新增失败");
}
}
});
});
//部门修改
$("#updataDept").click(function (){
var deptName = $("#deptNameU").val();
var loc = $("#locU").val();
var no = $("#deptNoU").val();
//组装对象
var dept = {
name : deptName,
loc :loc,
no : no
}
//增加数据
$.ajax({
url:'http://localhost:8080/deptMangage/dept.do?method=update',
type:'POST',
data:dept,
success:function(datas){
alert("数据修改成功");
//重新加载表格数据
findAllDeptInfos();
}
});
});
function findAllDeptInfos(){
//数据
$.ajax({
url:'http://localhost:8080/deptMangage/dept.do?method=findAll',
type:'GET',
success:function(datas){
initDeptGrid(datas);
}
});
}
//页面加载时,加载部门表格数据
findAllDeptInfos();
//初始化部门表格
function initDeptGrid(datas){
var opt = {
zebraCrossing : false,
//数据源
dataSource:datas,
//多选
multiple:false,
//选择列是否显示
selectColumn:false,
width:'60%',
//表格列头
columns:[
{field:'no',title:'No',edited:false},
{field:'name',title:'部门名称'},
{field:'loc',title:'办公地址'},
{field:'option', title:'删除',edited:false,rendering:function(data,tr){
var t = this;
return '<button onclick= dalectData(this)>删除</button>';
}}
],
events:{
tdClick: function(td,value,rowData){
//将要修改的数据填充到输入框
$("#deptNameU").val(rowData.name);
$("#locU").val(rowData.loc);
$("#deptNoU").val(rowData.no);
}
}
}
var grid = $("#myGridTable").myGrid(opt);
}
//删除的点击事件
function dalectData($this){
//通过当前的button查询它所在的tr父级对象
var tr = $($this).parents("tr.datagrid-row");
//获取行数据
var rowData = tr.data("row-data");
var bool = confirm("确定删除\""+rowData.name+"\"部门吗?");
if(bool == false){//不能删除
return;
}
//需要删除的No
var no = rowData.no;
//删除节点
tr.remove();
//删除后台数据
deleteDeptInfoByNo(no);
}
//根据No删除部门信息
function deleteDeptInfoByNo(no){
$.ajax({
url:'http://localhost:8080/deptMangage/dept.do?method=delete&no='+no,
type:'GET',
success:function(datas){
}
});
}
</script>
</html>
第四属性类文件部分:
package com.emp.bean;
public class DeptVO {
private String no;
private String Name;
private String loc;
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
}
第五执行层部分:
package com.emp.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.emp.bean.DeptVO;
import com.emp.util.DeptMysql;
public class GeptServlet extends HttpServlet{
public void init() {
}
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("doGet");
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("doPost");
//获取放法标识
String method = request.getParameter("method");
switch(method) {
case "findAll":
this.findAllDeptList(request,response);
break;
case "add":
this.addDeptInfo(request,response);
break;
case "update":
this.updateDeptInfoByNo(request,response);
break;
case "delete":
this.deleteDeptInfoByNo(request,response);
break;
default:
break;
}
/*if(method.equals("findAll")) {
this.findAllDeptList(request,response);
}else if("add".equals(method)) {
this.addDeptInfo(request,response);
}*/
}
/**
* 根据编号修改信息
* @throws SQLException
* @throws ClassNotFoundException
*/
public void updateDeptInfoByNo(HttpServletRequest request, HttpServletResponse response) {
//获取增加的部门信息
String name = request.getParameter("name");
String loc = request.getParameter("loc");
String no = request.getParameter("no");
//组装部门对像
DeptVO deptVO = new DeptVO();
deptVO.setName(name);
deptVO.setLoc(loc);
deptVO.setNo(no);
DeptMysql deptMysql = new DeptMysql();
try {
deptMysql.updateDeptInfoByNo(deptVO);
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//根据部门号删除部门信息
public void deleteDeptInfoByNo(HttpServletRequest request, HttpServletResponse response) {
String no = request.getParameter("no");
//删除部门信息
DeptMysql deptMysql = new DeptMysql();
try {
deptMysql.deleteDeptInfoByNo(no);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
/**
*查询所有部门信息
* @param request
* @param response
* @throws IOException
*/
public void findAllDeptList(HttpServletRequest request, HttpServletResponse response)throws IOException {
//设置编码
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
DeptMysql deptMysql = new DeptMysql();
List<DeptVO> depts= null;
//查询出所有部门数据
try {
depts = deptMysql.findAllDeptList();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
PrintWriter out = response.getWriter();
//将部门结果集转换为JSON字符串
String deptStr = JSONArray.toJSONString(depts);
System.out.println(deptStr);
out.write(deptStr);
}
public void addDeptInfo(HttpServletRequest request, HttpServletResponse response)throws IOException {
//获取增加的部门信息
String name = request.getParameter("name");
String loc = request.getParameter("loc");
//组装部门对象
DeptVO deptVO = new DeptVO();
deptVO.setName(name);
deptVO.setLoc(loc);
//到DeptMysql类里面新建addDeptInfo函数
DeptMysql deptMysql = new DeptMysql();
boolean bool = true;
try {
deptMysql.addDeptInfo(deptVO);
} catch (ClassNotFoundException | SQLException e) {
bool = false;
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
Map<String,Boolean> success = new HashMap<>();
//返回消息告诉前台数据是否增加成功
success.put("issuccess",bool);
PrintWriter out = response.getWriter();
out.write(JSONObject.toJSONString(success));
}
}
public void destroy() {
super.destroy();
}
}
第六连接数据库部分:
package com.emp.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.emp.bean.DeptVO;
public class DeptMysql {
/**
* 查询所有部门数据
* @return
* @throws SQLException
* @throws ClassNotFoundException
*/
public List<DeptVO> findAllDeptList() throws ClassNotFoundException, SQLException{
Connection connection = MySQLUtil.getConnectionInstance();
PreparedStatement ps = connection.prepareStatement("select t.deptno, t.dname, t.loc from deptone t ");
//获取查询结果
ResultSet result = ps.executeQuery();
List<DeptVO> depts = new ArrayList<DeptVO>();
while(result.next()) {
String deptno = result.getString("deptno");
String dname = result.getString("dname");
String loc = result.getString("loc");
DeptVO dept = new DeptVO();
dept.setNo(deptno);
dept.setName(dname);
dept.setLoc(loc);
depts.add(dept);
}
ps.close();
return depts;
}
//新增数据
public void addDeptInfo(DeptVO deptVO) throws ClassNotFoundException, SQLException {
Connection connection = MySQLUtil.getConnectionInstance();
PreparedStatement ps = connection.prepareStatement("insert into deptone (dname,loc) values (?,?)");
//设置SQL参数
ps.setString(1, deptVO.getName());
ps.setString(2, deptVO.getLoc());
//执行SQL
ps.executeUpdate();
ps.close();
}
//根据编号修改信息
public void updateDeptInfoByNo(DeptVO deptVO) throws ClassNotFoundException, SQLException {
Connection connection = MySQLUtil.getConnectionInstance();
PreparedStatement ps = connection.prepareStatement("update deptone t set t.dname=?, t.loc=? where t.deptno = ?");
ps.setString(1, deptVO.getName());
ps.setString(2, deptVO.getLoc());
ps.setString(3, deptVO.getNo());
ps.executeUpdate();
ps.close();
}
//删除信息
public void deleteDeptInfoByNo(String no) throws ClassNotFoundException, SQLException {
Connection connection = MySQLUtil.getConnectionInstance();
PreparedStatement ps = connection.prepareStatement("delete from deptone where deptno=?");
//设置SQL参数
ps.setString(1, no);
//执行SQL
ps.executeUpdate();
ps.close();
}
}
最后的运行效果如图:
好了,到这儿就完结了!