a.
update.jsp代码
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>学员信息修改</title>
<script type="text/javascript">
//定义check_age()函数
function check_age(){
//判断文本框中输入的是否为数字
//如果为数字,则return true
//否则return false
//通过文本框id获取文本框中输入的值
var sageTxt=document.getElementById("sage");
var sage=sageTxt.value;
//通过正则表达式来进行匹配验证
//需要加定界符,否则就为只要包含数字就可以通过验证
var reg=/^\d+$/;
var b=reg.test(sage);
if(b){
//根据id查找sage_msg标签
var span=document.getElementById("sage_msg");
span.innerHTML="年龄合法,可以提交";
}else{
var span=document.getElementById("sage_msg");
span.innerHTML="年龄不合法,禁止提交";
}
return b;
}
//定义check函数
function check(){
return check_age();
}
</script>
</head>
<body>
<form action="StudentServlet?flag=update" method="post" onsubmit="return check();">
<!--获取sid,因为不可修改故设置为隐藏域-->
<input type="hidden" name="sid" value="${stu.sid}" readonly="readonly" /><br/>
姓名:<input type="text" name="sname" value="${stu.sname}" /><br/>
密码:<input type="password" name="spwd" value="${stu.spwd}" /><br/>
年龄:<input type="text" name="sage" id="sage" value="${stu.sage}" onblur="check_age()" /><span style="color:red" id="sage_msg"></span><br/>
性别:
<c:if test="${stu.ssex=='男'}">
<input type="radio" name="ssex" value="男" checked="checked" />男
<input type="radio" name="ssex" value="女" />女<br/>
</c:if>
<c:if test="${stu.ssex=='女'}">
<input type="radio" name="ssex" value="男" />男
<input type="radio" name="ssex" value="女" checked="checked" />女<br/>
</c:if>
<input type="submit" value="确定">
</form>
</body>
regist新增代码
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>学员注册</title>
<script type="text/javascript">
function check_age(){
var sageTxt=document.getElementById("sage");
var sage=sageTxt.value;
var reg=/^\d+$/;
var b=reg.test(sage);
if(b){
var span=document.getElementById("sage_msg");
span.innerHTML="年龄合法,可以提交";
}else{
var span=document.getElementById("sage_msg");
span.innerHTML="年龄不合法,禁止提交";
}
return b;
}
function check(){
return check_age();
}
</script>
</head>
<body>
<form action="StudentServlet?flag=regist" method="post" onsubmit="return check();">
姓名:<input type="text" name="sname"><br/>
密码:<input type="password" name="spwd" /><br/>
年龄:<input type="text" name="sage" id="sage" onblur="check_age()" /><span style="color:red" id="sage_msg"></span><br/>
<!--单选按钮传送值为value属性的值,若不加value值,则传送至服务端数据为on,且同一组单选按钮name值必须相等-->
性别:<input type="radio" name="ssex" value="男" />男
<input type="radio" name="ssex" value="女" />女<br/>
<input type="submit" value="提交" />
<input type="reset" value="清空" />
</form>
</body>
删除部分
<body>
<table border="1px" width="60%">
<tr>
<th>ID</th>
<th>姓名</th>
<th>密码</th>
<th>年龄</th>
<th>性别</th>
<th>操作</th>
</tr>
<c:forEach items="${list}" var="s" varStatus="vs">
<tr>
<th>${vs.count}</th>
<th>${s.sname}</th>
<th>${s.spwd}</th>
<th>${s.sage}</th>
<th>${s.ssex}</th>
<th>
<!--
a标签为超链接,连接到StudentServlet,删除需要传操作参数及
要删除记录的sid,参数与参数之间用&隔开,参数赋值用EL表达式,
整个代码如下所示
-->
<a href="StudentServlet?flag=delete&sid=${s.sid}">删除</a>
|
<a href="StudentServlet?flag=preUpdate&sid=${s.sid}">修改</a>
</th>
</tr>
</c:forEach>
</table>
<!--为该页面添加添加学员功能-->
<a href="regist.jsp">添加学员</a>
</body>
注一:如果要修改某条记录,则应该先有一个修改页面,然后再该页面将该记录的各项显示出来,然后再进行修改,再单击确定,修改成功,所以,在修改前应该先有一个查询的操作,将该条记录从数据库中取出,然后对各项进行显示,显示完后再对该页面的内容进行读取,读取至Servlet,通过dao调用修改方法,修改成功后再返回至显示页面,即给flag赋值为null,所以修改应该分为两步,第一步preUpdate预修改,实现查询及显示记录,第二步update修改,实现将数据的数据库修改。其他属性显示可以使用EL表达式,性别的默认应该使用jstl中的cif标签,可以实现性别的默认选中。sid是不可以修改的,所以设置为readonly,表示该表单只读,或者也可以将该表单设置为隐藏域hidden,即用户不可见
注二:在注册和修改的时候,如果输入的年龄不为数字,则后台会报错,所以在提交之前应该对其说输入的年龄进行检查并进行提示,如果不是数字,则禁止提交,可以通过在form表单中添加一个onsubmit事件,参数为一个Boolean值,所以可以通过在参数中调用一个返回值为Boolean类型的check()函数来实现是否可以提交,当年龄表单失去焦点即光标移出即onblur时触发该检查事件。如何定义函数?函数定义方法是在head标签中添加script标签来对其进行定义定义,具体如代码所示
b.StudentServlet新增代码
//删除
//此处可以使用重定向,但是如果将显示逻辑放到最下面,那么相比较重定向
//再一次向Servlet发请求来说,给flag赋值操作显得更简便一些,这就要求
//显示逻辑必须放在所有操作逻辑的下面
if("delete".equals(flag)){
int sid=Integer.parseInt(request.getParameter("sid"));
dao.deleteBySid(sid);
flag=null;
}
//预修改
if("preUpdate".equals(flag)){
int sid=Integer.parseInt(request.getParameter("sid"));
Student stu=dao.findStudentBySid(sid);
//数据需要拿到jsp端进行显示,所以需要绑定转发
request.setAttribute("stu",stu);
request.getRequestDispatcher("update.jsp").forward(request, response);
}
//修改
if("update".equals(flag)){
int sid=Integer.parseInt(request.getParameter("sid"));
String sname=request.getParameter("sname");
String spwd=request.getParameter("spwd");
int sage=Integer.parseInt(request.getParameter("sage"));
String ssex=request.getParameter("ssex");
Student stu=new Student(sid,sname,spwd,sage,ssex);
dao.updateStudent(stu);
flag=null;
}
c.IStudentDAO
新增public Student findStudentBySid(int sid)方法及public void updateStudent(Student stu)方法
d.StudentDAOImpl新增代码
@Override
public Student findStudentBySid(int sid) {
Student stu=null;
try{
conn=DBUtil.getConnection();
ps=conn.prepareStatement("SELECT sid,sname,spwd,sage,ssex FROM student WHERE sid=?");
ps.setInt(1,sid);
rs=ps.executeQuery();
if(rs.next()){
stu=new Student(sid,rs.getString("sname"),rs.getString("spwd"),rs.getInt("sage"),rs.getString("ssex"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
DBUtil.closeConnection(rs, ps, conn);
}
return stu;
}
@Override
public void updateStudent(Student stu) {
try{
conn=DBUtil.getConnection();
ps=conn.prepareStatement("UPDATE student SET sname=?,spwd=?,sage=?,ssex=? WHERE sid=?");
ps.setString(1,stu.getSname());
ps.setString(2,stu.getSpwd());
ps.setInt(3,stu.getSage());
ps.setString(4,stu.getSsex());
ps.setInt(5,stu.getSid());
ps.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
DBUtil.closeConnection(ps, conn);
}
}