前面我们实现了班级页面的嵌入,对班级列表的增删改查。为了实现这些功能,建立了数据表,数据表对应的model,和Dao。
创建了Servlet,建立了Servlet与访问地址的映射关系等。
接下来是对学生信息的管理,其中相同的步骤我打算只是简单的提一下,毕竟操作和之前都差不多。
建立新的学生表,在model层创建student.java,其中的属性要和数据表的字段想对应。然后创建StudentServlet,并在xml中进行访问地址的映射。
这里涉及Servlet层和Dao层的方法,下面给出了对应。
Servlet —>getStudentList
StudentDao —>getStudentList
Dao中会涉及到一个多条件查询,即姓名和班级两个条件下对学生信息进行检索。
....
String sql = "select * from s_student ";
if(!StringUtil.isEmpty(student.getName())){
sql += "and name like '%" + student.getName() +"%'";
}
if(student.getClazzId() != 0){
sql += " and clazz_id = " +student.getClazzId() ;
}
sql += " limit " + page.getStart() +","+page.getPageSize();
ResultSet resultSet = query(sql.replaceFirst("and", "where"));
....
目的是根据所获取的班级id和学生信息进行查询,按照不一样的条件来对sql语句进行拼接。如果所传的信息中,上面的两个if只有一个能够执行,那么if中就将这个条件加入进去,在后面执行的时候,再将and替换为where达到目的。
如果两个if条件都满足了,那么在拼接结果中就会出现两个and,此时我们就将第一个and替换为where。
再来看看Servlet中的部分代码
private void getStudentList(HttpServletRequest req, HttpServletResponse res) {
res.setCharacterEncoding("utf-8");
res.setContentType("text/html;charset=utf-8");
String name = req.getParameter("studentName");
Integer currentPage = req.getParameter("page") == null ? 1:Integer.parseInt(req.getParameter("page"));
Integer pageSize = req.getParameter("rows") == null?999:Integer.parseInt(req.getParameter("rows"));
Integer clazz = req.getParameter("clazzid") == null?0:Integer.parseInt(req.getParameter("clazzid"));
Student student = new Student();
student.setName(name);
student.setClazzId(clazz);
StudentDao studentDao = new StudentDao();
List<Student> clazzList = studentDao.getStudentList(student, new Page(currentPage, pageSize));
studentDao.closeCon();
int total = studentDao.getStudentListTotal(student);
studentDao.closeCon();
....
}
这里也是先在前台接受数据,保存到student中,将其中的属性传给StudentDao的getStudentList做参数判断。
其中也有一个total变量来计算在条件查询下的数量是多少,和之前查询班级信息一样,就不说了。
这一模块中,我们要添加的信息包括姓名,密码,性别,电话,QQ,班级。其中班级是在下拉列表中选择。
$.ajax({
type: "post",
url: "StudentServlet?method=AddStudent",
data: $("#addForm").serialize(),
success: function(msg){
if(msg == "success"){
.....
}
});
根据访问请求的地址,查看具体是什么信息、
private void addStudent(HttpServletRequest req, HttpServletResponse res) {
// TODO Auto-generated method stub
String name = req.getParameter("name");
String password = req.getParameter("password");
String sex = req.getParameter("sex");
String mobile = req.getParameter("mobile");
String qq = req.getParameter("qq");
int clazzId = Integer.parseInt(req.getParameter("clazzid"));
Student student = new Student();
student.setClazzId(clazzId);
student.setMobile(mobile);
student.setName(name);
student.setPassword(password);
student.setQq(qq);
student.setSex(sex);
student.setSn(SnGenerateUtil.generateSn(clazzId));
StudentDao studentDao = new StudentDao();
if(studentDao.addStudent(student)){
try {
res.getWriter().write("success");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
studentDao.closeCon();
}
}
}
其中可以看出,这里做的操作是,获取信息,保存信息,再到dao层去做更新。
public boolean addStudent(Student student){
String sql = "insert into s_student values(null,'"+student.getSn()+"','"+student.getName();
sql += "','" + student.getPassword() + "','" + student.getClazzId();
sql += "','" + student.getSex() + "','" + student.getMobile();
sql += "','" + student.getQq()+ "',null)";
return update(sql);
}
当执行成功后,就返回一个true,再向前台传回一个success。
为了方便,我们在系统中另外设置一个servlet用于处理图片。jsp中有这样一行代码
<img alt="照片" style="max-width: 200px; max-height: 400px;" title="照片" src="PhotoServlet?method=getPhoto" />
那么请求的地址也就十分显而易见了
private void getPhoto(HttpServletRequest req, HttpServletResponse res) {
int id = req.getParameter("uid") == null ? 0 : Integer.parseInt(req.getParameter("uid"));
if(id != 0){
int userType = Integer.parseInt(req.getSession().getAttribute("userType").toString());
if(userType == 2){
// 学生
StudentDao studentDao = new StudentDao();
Student student = studentDao.getStudent(id);
studentDao.closeCon();
if(student != null){
InputStream photo = student.getPhoto();
if(photo != null){
try {
outputStream(new byte[photo.available()], res);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}else if(userType == 3){
// 老师
return;
}
}
String path = req.getSession().getServletContext().getRealPath("");
File file = new File(path+"\\file\\logo.jpg");
try {
FileInputStream fis = new FileInputStream(file);
byte[] b = new byte[fis.available()];
fis.read(b);
res.getOutputStream().write(b,0,b.length);
// outputStream(new byte[fis.available()], res);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这个功能只是不想页面空荡荡的。
以上是获取用户的类型,如果是是学生的信息,就根据学生的id去查询数据库中的数据。如果数据库中有图片的数据,我们就将它返回给前台显示。如果没有,我们就显示一个本地的图片到前台去。其中包含的IO操作都是比较常规的写法。
req.getSession().getServletContext().getRealPath("");
是获取项目的路径。
在模板中有些信息我们是不需要的,所以前台只保留一下几项。
<div id="editDialog" style="padding: 10px">
<div style="float: right; margin: 20px 20px 0 0; width: 200px; border: 1px solid #EBF3FF">
<img id="edit_photo" alt="照片" style="max-width: 200px; max-height: 400px;" title="照片" src="" />
div>
<form id="editForm" method="post">
<table cellpadding="8" >
<tr>
<td>姓名:td>
<td><input id="edit_name" style="width: 200px; height: 30px;" class="easyui-textbox" type="text" name="name" data-options="required:true, missingMessage:'请填写姓名'" />td>
tr>
<tr>
<td>性别:td>
<td><select id="edit_sex" class="easyui-combobox" data-options="editable: false, panelHeight: 50, width: 60, height: 30" name="sex"><option value="男">男option><option value="女">女option>select>td>
tr>
<tr>
<td>电话:td>
<td><input id="edit_mobile" style="width: 200px; height: 30px;" class="easyui-textbox" type="text" name="mobile" validType="mobile" />td>
tr>
<tr>
<td>QQ:td>
<td><input id="edit_qq" style="width: 200px; height: 30px;" class="easyui-textbox" type="text" name="qq" validType="number" />td>
tr>
<tr>
<td>班级:td>
<td><input id="edit_clazzList" style="width: 200px; height: 30px;" class="easyui-textbox" name="clazzid" />td>
tr>
table>
form>
div>
Servlet中增加一个editStudent的方法,和之前编辑班级信息的代码几乎一致都是先获取参数,保存到model对象中,再将属性值传给Dao。
Dao中也增加一个editDtudent的方法,将传入的参数嵌入sql语句中。
public boolean editStudent(Student student) {
String sql = "update s_student set name= '"+student.getName()+"'";
sql += ",sex = '"+student.getSex() +"'";
sql += ",mobile = '"+student.getMobile() +"'";
sql += ",qq = '" +student.getQq() +"'";
sql += ",clazz_id = '" +student.getClazzId()+"'";
sql += " where id = '"+ student.getId() +"'";
return update(sql);
}
<form id="uploadForm" method="post" enctype="multipart/form-data" action="PhotoServlet?method=SetPhoto" target="photo_target">
<input class="easyui-filebox" name="photo" data-options="prompt:'选择照片'" style="width:200px;">
<input id="uploadBtn" class="easyui-linkbutton" style="width: 50px; height: 24px;" type="button" value="上传"/>
form>
使用户无感觉刷新
<iframe id="photo_target" name="photo_target">iframe>
新增一个点击事件
$("#uploadBtn").click(function(){
$("#uploadForm").submit();
setTimeout(function(){
var message = $(window.frames["photo_target"].document).find("#message").text();
$.messager.alert("消息提醒",message,"info");
$("#user_photo").attr("src", "PhotoServlet?method=GetPhoto&t="+new Date().getTime());
}, 1500)
});
photoServlet中写一个方法uploadPhoto();