10.添加参数校验
在CourseService中添加如下代码
在CommonsUtils中添加如下代码
在CourseServlet中添加如下代码
添加
修改course.jsp如下
修改url及判断条件与输出
修改name
删除
在CourseServlet中下doDelete方法
在CommonsUtils接口添加
在CourseService中补全方法
在courseDao中补全方法
在CourseService捕获异常
在CourseServl中补全
写完后用Postman去测试一下先
再搞前端
修改courseList.jsp
在courseList.jsp补全代码
将\java2201\05.project\资料\jquery-easyui-1.7.0\locale中的easyui-lang-zh_CN.js文件cv到如下目录
在courseList.jsp和login.jsp和admin.jsp中添加如下代码
补全代码及注释
admin.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>学生成绩管理系统 管理员后台</title>
<link rel="shortcut icon" href="favicon.ico"/>
<link rel="bookmark" href="favicon.ico"/>
<link href='<c:url context="${pageContext.request.contextPath}" value="/easyui/css/default.css"/>' rel="stylesheet" type="text/css" />
<link href='<c:url context="${pageContext.request.contextPath}" value="/easyui/themes/default/easyui.css"/>' rel="stylesheet" type="text/css" />
<link href='<c:url context="${pageContext.request.contextPath}" value="/easyui/themes/icon.css"/>' rel="stylesheet" type="text/css" />
<script type="text/javascript" src='<c:url value="/easyui/jquery.min.js" context="${pageContext.request.contextPath}"/>'></script>
<script type="text/javascript" src='<c:url value="/easyui/jquery.easyui.min.js" context="${pageContext.request.contextPath}"/>'></script>
<script type="text/javascript" src='<c:url value="/easyui/js/outlook2.js" context="${pageContext.request.contextPath}"/>'></script>
<script type="text/javascript" src='<c:url value="/easyui/js/easyui-lang-zh_CN.js" context="${pageContext.request.contextPath}"/>'></script>
<script type="text/javascript">
var _menus = {"menus":[
{"menuid":"1","icon":"","menuname":"成绩统计分析",
"menus":[
{"menuid":"11","menuname":"考试列表","icon":"icon-exam","url":"../exam/examList.html"},
]
},
{"menuid":"2","icon":"","menuname":"学生信息管理",
"menus":[
{"menuid":"21","menuname":"学生列表","icon":"icon-user-student","url":"../student/studentList.html"},
]
},
{"menuid":"3","icon":"","menuname":"教师信息管理",
"menus":[
{"menuid":"31","menuname":"教师列表","icon":"icon-user-teacher","url":"../teacher/teacherList.html"},
]
},
{"menuid":"4","icon":"","menuname":"基础信息管理",
"menus":[
{"menuid":"41","menuname":"年级列表","icon":"icon-world","url":"../grade/gradeList.html"},
{"menuid":"42","menuname":"班级列表","icon":"icon-house","url":"../class/clazzList.html"},
{"menuid":"43","menuname":"课程列表","icon":"icon-book-open","url":"/s/course?action=page"}
]
},
{"menuid":"5","icon":"","menuname":"系统管理",
"menus":[
{"menuid":"51","menuname":"系统设置","icon":"icon-set","url":"../admin/adminPersonal.html"},
]
}
]};
</script>
</head>
<body class="easyui-layout" style="overflow-y: hidden" scroll="no">
<noscript>
<div style=" position:absolute; z-index:100000; height:2046px;top:0px;left:0px; width:100%; background:white; text-align:center;">
<img src="images/noscript.gif" alt='抱歉,请开启脚本支持!' />
</div>
</noscript>
<div region="north" split="true" border="false" style="overflow: hidden; height: 30px;
background: url(../images/layout-browser-hd-bg.gif) #7f99be repeat-x center 50%;
line-height: 20px;color: #fff; font-family: Verdana, 微软雅黑,黑体">
<span style="float:right; padding-right:20px;" class="head"><span style="color:red; font-weight:bold;">${loginUser.nickname} </span>您好 <a href="SystemServlet?method=LoginOut" id="loginOut">安全退出</a></span>
<span style="padding-left:10px; font-size: 16px; ">学生信息管理系统</span>
</div>
<div region="south" split="true" style="height: 30px; background: #D2E0F2; ">
<div class="footer">Copyright © Power By Mryang</div>
</div>
<div region="west" hide="true" split="true" title="导航菜单" style="width:180px;" id="west">
<div id="nav" class="easyui-accordion" fit="true" border="false">
<!-- 导航内容 -->
</div>
</div>
<div id="mainPanle" region="center" style="background: #eee; overflow-y:hidden">
<div id="tabs" class="easyui-tabs" fit="true" border="false" >
<div title="欢迎使用" style="padding:20px;overflow:hidden; color:red; ">
<p style="font-size: 50px; line-height: 60px; height: 60px;">${si.schoolName}</p>
<p style="font-size: 25px; line-height: 30px; height: 30px;">欢迎使用学生成绩管理系统</p>
<p>开发人员:${si.developer}</p>
<p>开发周期:${si.devTime}</p>
<hr />
<h2>系统环境</h2>
<p>系统环境:${si.osName}</p>
<p>开发工具:${si.devTools}</p>
<p>Java版本:${si.javaVersion}</p>
<p>服务器:${si.tomcatVersion}</p>
<p>数据库:${si.mysqlVersion}</p>
<p>系统采用技术:${si.info}</p>
</div>
</div>
</div>
<iframe width=0 height=0 src="refresh.jsp"></iframe>
</body>
</html>
login.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="renderer" content="webkit|ie-comp|ie-stand">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
<link rel="shortcut icon" href="favicon.ico" />
<link rel="bookmark" href="favicon.ico" />
<%--动态获取项目的上下文路径--%>
<%-- <link href="<%=request.getContextPath()+"/h-ui/css/H-ui.min.css"%>" rel="stylesheet" type="text/css" />--%>
<%-- <link href="/s/h-ui/css/H-ui.min.css" rel="stylesheet" type="text/css" />--%>
<%--jstl中动态获取上下文路径的方式--%>
<link href='<c:url context="${pageContext.request.contextPath}" value="/h-ui/css/H-ui.min.css"/>' rel="stylesheet" type="text/css" />
<link href='<c:url context="${pageContext.request.contextPath}" value="/h-ui/css/H-ui.login.css"/>' rel="stylesheet" type="text/css" />
<link href='<c:url context="${pageContext.request.contextPath}" value="/h-ui/lib/icheck/icheck.css"/>' rel="stylesheet" type="text/css" />
<link href='<c:url context="${pageContext.request.contextPath}" value="/h-ui/lib/Hui-iconfont/1.0.1/iconfont.css"/>' rel="stylesheet" type="text/css" />
<link href='<c:url context="${pageContext.request.contextPath}" value="/easyui/themes/default/easyui.css"/>' rel="stylesheet" type="text/css" />
<link href='<c:url context="${pageContext.request.contextPath}" value="/easyui/themes/icon.css"/>' rel="stylesheet" type="text/css" />
<script type="text/javascript" src='<c:url value="/easyui/jquery.min.js" context="${pageContext.request.contextPath}"/>'></script>
<script type="text/javascript" src='<c:url value="/h-ui/js/H-ui.js" context="${pageContext.request.contextPath}"/>'></script>
<script type="text/javascript" src='<c:url value="/h-ui/lib/icheck/jquery.icheck.min.js" context="${pageContext.request.contextPath}"/>'></script>
<script type="text/javascript" src='<c:url value="/easyui/jquery.easyui.min.js" context="${pageContext.request.contextPath}"/>'></script>
<script type="text/javascript" src='<c:url value="/easyui/js/easyui-lang-zh_CN.js" context="${pageContext.request.contextPath}"/>'></script>
<script type="text/javascript">
$(function() {
//点击图片切换验证码
//点击图片对象的时候,修改img的src属性
//注意最后面的t参数,这个参数的目的是告诉浏览器,这是两个不同的链接
$("#vcodeImg").click(function() {
this.src = "/s/login?action=vcode&t=" + new Date().getTime();
});
//登录按钮的点击事件
$("#submitBtn").click(function() {
if($("#radio-2").attr("checked") && "${systemInfo.forbidStudent}" == 1) {
$.messager.alert("消息提醒", "学生暂不能登录系统!", "warning");
return;
}
if($("#radio-3").attr("checked") && "${systemInfo.forbidTeacher}" == 1) {
$.messager.alert("消息提醒", "教师暂不能登录系统!", "warning");
return;
}
//提取请求参数,一键提取参数
//serialize方法会自动查找到id为form的表单中的所有带name属性的输入框的值
//data的值为username=zhangsan&password=123
var data = $("#form").serialize();
//第二种参数提取方式
// let username=$("#username").val();
// let password=$("#password").val();
// let user={username:username,password:password};
$.ajax({
type: "post",
url: "/s/login",
data: data,
dataType: "json", //返回数据类型
success: function(msg) {
if(msg.status==500) {
$.messager.alert("消息提醒", msg.msg, "warning");
$("#vcodeImg").click(); //切换验证码
$("input[name='vcode']").val(""); //清空验证码输入框
} else if(msg.status ==200){
//登录成功,跳转到首页
//修改url地址栏的地址(相当于页面跳转)
window.location.href="/s/index";
// let url=window.location.href;
}
}
});
});
//设置复选框
$(".skin-minimal input").iCheck({
radioClass: 'iradio-blue',
increaseArea: '25%'
});
})
</script>
<title>登录|学生成绩管理系统</title>
<meta name="keywords" content="学生成绩管理系统">
</head>
<body>
<div class="header" style="padding: 0;">
<h2 style="color: white; width: 400px; height: 60px; line-height: 60px; margin: 0 0 0 30px; padding: 0;">学生成绩管理系统</h2>
</div>
<div class="loginWraper">
<div id="loginform" class="loginBox">
<form id="form" class="form form-horizontal" method="post">
<div class="row cl">
<label class="form-label col-3"><i class="Hui-iconfont"></i></label>
<div class="formControls col-8">
<input id="username" value="admin" name="username" type="text" placeholder="账户" class="input-text size-L">
</div>
</div>
<div class="row cl">
<label class="form-label col-3"><i class="Hui-iconfont"></i></label>
<div class="formControls col-8">
<input id="password" value="123" name="password" type="password" placeholder="密码" class="input-text size-L">
</div>
</div>
<div class="row cl">
<div class="formControls col-8 col-offset-3">
<input class="input-text size-L" name="vcode" type="text" placeholder="请输入验证码" style="width: 200px;">
<img title="点击图片切换验证码" id="vcodeImg" src="/s/login?action=vcode"></div>
</div>
<div class="mt-20 skin-minimal" style="text-align: center;">
<div class="radio-box">
<input type="radio" id="radio-2" name="type" checked value="2" />
<label for="radio-1">学生</label>
</div>
<div class="radio-box">
<input type="radio" id="radio-3" name="type" value="3" />
<label for="radio-2">老师</label>
</div>
<div class="radio-box">
<input type="radio" id="radio-1" name="type" value="1" />
<label for="radio-3">管理员</label>
</div>
</div>
<div class="row">
<div class="formControls col-8 col-offset-3">
<input id="submitBtn" type="button" class="btn btn-success radius size-L" value=" 登 录 ">
</div>
</div>
</form>
</div>
</div>
<div class="footer">Copyright @ Mryang </div>
</body>
</html>
courseList.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="UTF-8">
<title>课程列表</title>
<link href='<c:url context="${pageContext.request.contextPath}" value="/easyui/themes/default/easyui.css"/>' rel="stylesheet" type="text/css" />
<link href='<c:url context="${pageContext.request.contextPath}" value="/easyui/themes/icon.css"/>' rel="stylesheet" type="text/css" />
<link href='<c:url context="${pageContext.request.contextPath}" value="/easyui/css/demo.css"/>' rel="stylesheet" type="text/css" />
<script type="text/javascript" src='<c:url value="/easyui/jquery.min.js" context="${pageContext.request.contextPath}"/>'></script>
<script type="text/javascript" src='<c:url value="/easyui/jquery.easyui.min.js" context="${pageContext.request.contextPath}"/>'></script>
<script type="text/javascript" src='<c:url value="/easyui/js/validateExtends.js" context="${pageContext.request.contextPath}"/>'></script>
<script type="text/javascript" src='<c:url value="/easyui/js/easyui-lang-zh_CN.js" context="${pageContext.request.contextPath}"/>'></script>
<script type="text/javascript">
$(function() {
//datagrid初始化
$('#dataList').datagrid({
title:'课程列表',
iconCls:'icon-more',//图标
border: true,
collapsible: false,//是否可折叠的
fit: true,//自动大小
method: "get",//请求表格数据的时候,请求方法
url:"/s/course?action=data",
idField:'cid',//表格每一行的唯一标识符
singleSelect: true,//是否单选
pagination: false,//分页控件
rownumbers: true,//行号
sortName:'cid',
sortOrder:'asc',
remoteSort: false,
columns: [[
{field:'chk',checkbox: true,width:50},
{field:'cid',title:'课程编号',width:50, sortable: true},
{field:'courseName',title:'课程名称',width:200},
]],
toolbar: "#toolbar"
});
//设置工具类按钮
$("#add").click(function(){
//弹一个对话框
$("#addDialog").dialog("open");
});
//删除
$("#delete").click(function(){
//返回课程表第一个被选中的行或如果没有选中的行则返回null。
//如果当前有选中的行,那么返回的数据则是这一行对应的JSON,{cid:27,courseName:bb}
var selectRow = $("#dataList").datagrid("getSelected");
if(selectRow == null){
$.messager.alert("消息提醒", "请选择数据进行删除!", "warning");
} else{
//先获取选中行的课程的id
var courseid = selectRow.cid;
$.messager.confirm("消息提醒", "将删除与【"+selectRow.courseName+"】课程相关的所有数据,确认继续?", function(r){
if(r){
//如果用户点击了确认按钮,就会进入到if中
$.ajax({
type: "delete",
url: "/s/course?cid="+courseid,
success: function(msg){
if(msg.status == 200){
$.messager.alert("消息提醒",msg.msg,"info");
//刷新表格
$("#dataList").datagrid("reload");
//取消当前表格中所有选中的行
$("#dataList").datagrid("uncheckAll");
} else{
$.messager.alert("消息提醒",msg.msg,"warning");
return;
}
}
});
}
});
}
});
//设置添加窗口
//添加课程的对话框
$("#addDialog").dialog({
title: "添加课程",
width: 450,
height: 250,
iconCls: "icon-add",
modal: true,//是否是一个模态对话框
collapsible: false,//是否可折叠
minimizable: false,//是否可以最大化
maximizable: false,//是否可以最小化
draggable: true,//是否可以拖拽
closed: true,//是否可以关闭
buttons: [
{
text:'添加',
plain: true,
iconCls:'icon-book-add',
handler:function(){
var validate = $("#addForm").form("validate");
if(!validate){
$.messager.alert("消息提醒","请检查你输入的数据!","warning");
return;
} else{
let data=$("#addForm").serialize();//courseName=xxx
$.ajax({
type: "post",
url: "/s/course",
data: data,
success: function(msg){
if(msg.status == 200){
$.messager.alert("消息提醒","添加成功!","info");
//关闭窗口
$("#addDialog").dialog("close");
//清空原表格数据
$("#add_name").textbox('setValue', "");
//刷新表格
$('#dataList').datagrid("reload");
} else{
$.messager.alert("消息提醒",msg.msg,"warning");
return;
}
}
});
}
}
},
{
text:'重置',
plain: true,
iconCls:'icon-book-reset',
handler:function(){
$("#add_name").textbox('setValue', "");
}
},
]
});
});
</script>
</head>
<body>
<!-- 数据列表,这个就是课程列表的表格 -->
<table id="dataList" cellspacing="0" cellpadding="0">
</table>
<!-- 工具栏 -->
<div id="toolbar">
<div style="float: left;"><a id="add" href="javascript:;" class="easyui-linkbutton" data-options="iconCls:'icon-add',plain:true">添加</a></div>
<div style="float: left;" class="datagrid-btn-separator"></div>
<div><a id="delete" href="javascript:;" class="easyui-linkbutton" data-options="iconCls:'icon-some-delete',plain:true">删除</a></div>
</div>
<!-- 添加数据窗口 -->
<div id="addDialog" style="padding: 10px">
<form id="addForm" method="post">
<table cellpadding="8" >
<tr>
<td>课程名称:</td>
<td><input id="add_name" style="width: 200px; height: 30px;" class="easyui-textbox" type="text" name="courseName" data-options="required:true, validType:'repeat_course', missingMessage:'不能为空'" /></td>
</tr>
</table>
</form>
</div>
</body>
</html>
CourseServlet.java
package demo.servlet.course;
import com.fasterxml.jackson.databind.ObjectMapper;
import demo.model.Course;
import demo.model.RespBean;
import demo.service.CourseService;
import demo.utils.CommonsUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet(urlPatterns = "/course")
public class CourseServlet extends HttpServlet {
CourseService courseService =new CourseService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action =req.getParameter("action");
if ("page".equals(action)){
//说明是来请求页面的
req.getRequestDispatcher("/WEB-INF/jsp/course/courseList.jsp").forward(req,resp);
}else if ("data".equals(action)){
//说明是来请求json数据的
//前端是一个表格,所以这里返回的是json数组,数组格式是[{xx:xx,xx:xx},{},{}]
List<Course>list=courseService.grtAllCourses();
ObjectMapper om=new ObjectMapper();
String json=om.writeValueAsString(list);
resp.setContentType("application/json;charset=utf-8");
PrintWriter out= resp.getWriter();
out.write(json);
}
}
/**
* 添加课程
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String courseName = req.getParameter("courseName");
Integer result =courseService.addCourse(courseName);
resp.setContentType("application/json;charset=utf-8");
RespBean respBean =null;
if (result == CommonsUtils.REPEATABLE_VALUE){
respBean =RespBean.error("课程名重复,添加失败");
}else if (result == CommonsUtils.INSERT_SUCCESS){
respBean=RespBean.ok("添加成功");
}else {
respBean =RespBean.error("添加失败");
}
ObjectMapper om=new ObjectMapper();
String json =om.writeValueAsString(respBean);
resp.getWriter().write(json);
}
/**
* 删除课程
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取删除的课程id
String cid = req.getParameter("cid");
Integer result = courseService.deleteCourseByCid(cid);
resp.setContentType("application/json;charset=utf-8");
PrintWriter out=resp.getWriter();
RespBean respBean=null;
if (result ==CommonsUtils.DELETE_SUCCESS){
respBean =RespBean.ok("删除成功");
}else {
respBean =RespBean.error("删除失败");
}
ObjectMapper om=new ObjectMapper();
String json = om.writeValueAsString(respBean);
out.write(json);
}
}
CourseDao.java
package demo.dao;
import demo.model.Course;
import demo.utils.DBUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.SQLException;
import java.util.List;
public class CourseDao {
QueryRunner queryRunner = new QueryRunner(DBUtils.getDs());
public List<Course> getAllCourses() throws SQLException {
return queryRunner.query("select * from course",new BeanListHandler<>(Course.class));
}
public Course getCourseByCourseName(String courseName) throws SQLException {
return queryRunner.query("select * from course where courseName=?",new BeanHandler<>(Course.class),courseName);
}
public Integer addCourse(String courseName) throws SQLException {
return queryRunner.update("insert into course(courseName) values(?)",courseName);
}
public Integer deleteCourseByCid(int cid) throws SQLException {
return queryRunner.update("delete from course where cid=?",cid);
}
}
CourseService.java
package demo.service;
import demo.dao.CourseDao;
import demo.model.Course;
import demo.utils.CommonsUtils;
import java.sql.SQLException;
import java.util.List;
public class CourseService {
CourseDao courseDao = new CourseDao();
public List<Course> grtAllCourses() {
try {
return courseDao.getAllCourses();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public Integer addCourse(String courseName) {
try {
//根据课程名查询课程
Course c = courseDao.getCourseByCourseName(courseName);
if (c != null) {
//课程名重复,添加失败
return CommonsUtils.REPEATABLE_VALUE;
}
Integer r = courseDao.addCourse(courseName);
return r == 1 ? CommonsUtils.INSERT_SUCCESS : CommonsUtils.OTHER_EXCEPTION;
} catch (SQLException e) {
e.printStackTrace();
}
return CommonsUtils.OTHER_EXCEPTION;
}
public Integer deleteCourseByCid(String cid) {
Integer r= null;
try {
r = courseDao.deleteCourseByCid(Integer.parseInt(cid));
} catch (SQLException e) {
e.printStackTrace();
}
return r ==1?CommonsUtils.DELETE_SUCCESS:CommonsUtils.OTHER_EXCEPTION;
}
}