目录
重要提醒!!!
家人们,咱就是说千万不要乱删除eclipse包管理器里的文件夹,我本来想把里面没大有用的项目删掉来自,然后我一不小心把server包也给删了,咱就是说,然后就报404了,特别好,然后我调了半个小时才调好,其中经历了重新在eclipse中配置Tomcat9.0,然后又修改了默认端口号,把8080改成8085了之后才好,过程很波折,希望大家千万不要像我一样闲的没事干乱删文件夹!!!
一、后台页面布局
1. 从layui官网下载后台页面,修改成自己需要的样式,记得修改路径,放在mainform.jsp中
二、教师列表的建立
1 新建allteacher.jsp文件
1. 从layui下载数据表格的代码,放进去
2. 下载编辑,删除按钮的代码,下载监听事件(是否编辑,删除)的代码,放进去
2 allteacher中的修改
1. 在table.render中的URL处需要填写数据接口,我们填写'AllTeacherServlet' ,
也是一会要在controller包中新建的servlet
2. method我们使用的是Post方法,所以在method处声明post(其实get和post都一样,选用post是因为post的安全级别更高)
/* 数据接口写teacher的servlet */
url : 'AllTeacherServlet' //数据接口
method:'post' //方法:使用doPost方法
关于doget和dopost的方法区别:
通常我们使用的都是doPost方法,你只要在servlet中让这两个方法互相调用就行了,例如在doGet方法中这样写
3. 修改表头
cols : [ [ //表头
{
field : 'teacherId',
title : '工号',
width : 80,
sort : true
}, {
field : 'tname',
title : '用户名',
width : 80
}, {
field : 'tsex',
title : '性别',
width : 80,
sort : true
}, {
field : 'tage',
title : '年龄',
width : 80
}, {
field : 'tdept',
title : '部门',
width : 180
}, {
field : 'tel',
title : '手机号',
width : 150,
sort : true
}, {
field : 'QQ',
title : 'QQ号',
width : 150,
sort : true
}, {
field : 'professional',
title : '职称',
width : 100,
sort : true
}
/* 编辑和删除 */
, {
field : 'right',
title : '操作',
width : 120,
toolbar : '#barDemo'
} ] ]
3 新建AllTeacherServlet
1. 在com.sxh.controller新建AllTeacherServlet,我们需要在doPost方法中实例化一个dao层对象,使用dao层获取数据库中查询出的内容
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//doGet(request, response);
//实例化dao层对象
userDao userDao=new userDaoImpl();
try {
List<Object> list = userDao.selectTeacherList();
response.setContentType("text/html;charset=utf-8");
//传json数据
Vo vo=new Vo();
vo.setCode(0);
vo.setMsg("success");
vo.setCount(list.size());
vo.setData(list);
//把json类型转化为字符串,传回前端
response.getWriter().write(JSONObject.toJSONString(vo));
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2. 我们需要利用userdao为我们查询数据库的内容,因为我们需要的是整个教师列表,所以查询回来的数据需要用List类存储,userdao中我们已经写好了三个方法,但他们返回的都是一个实体类,而我们需要的是整个教师数据表的列表,所以需要再写一个方法,return的值是list
故我们调用userDao中的方法selectTeacherList()(要在dao中补充的方法)
4 userDao接口及其实现类的修改
1. 我们需要在接口和实现类中补充上selectTeacherList()方法
接口:
public List<Object> selectTeacherList() throws SQLException;
实现类:
@Override
public List<Object> selectTeacherList() throws SQLException {
// TODO Auto-generated method stub
DBUtil dbUtil = new DBUtil();
String sql="select * from s_teacher";
//不需要问号代参,不需要where语句查询,可以直接使用statement
Statement st=(Statement) dbUtil.getStatement();
ResultSet rs=((java.sql.Statement) st).executeQuery(sql);
List<Object> list=null;
while(rs.next()) {
Teacher teacher = new Teacher();
teacher.setTeacherId(rs.getString("teacherId"));
teacher.setTname(rs.getString("tname"));
teacher.setTsex(rs.getString("tsex"));
teacher.setTage(rs.getInt("tage"));
teacher.setTdept(rs.getString("tdept"));
teacher.setTel(rs.getString("tel"));
teacher.setQQ(rs.getString("QQ"));
teacher.setProfessional(rs.getString("professional"));
list.add(teacher);
}
return list;
}
5 内嵌的实现
mainform中加Ajax函数
layui.use('element', function(){
var element = layui.element
var $=layui.jquery;
$(document).ready(function(){
/* 查询dd下面的a标签,若被点击,出发click事件 */
$("dd>a").click(function(e){
e.preventDefault();
/* 把href属性中的值传递给src,使src与href值一样 */
$('#main').attr("src",$(this).attr("href"));
});
});
});
效果:
qq号显示不出来
三、分页功能
1 AllTeacherServlet中的更改
1. dopost方法中获取前端返回的page和limit值
在没有对分页功能进行配置之前,前端对分页功能设置的默认值为page=1,limit=10;
我们需要对这两个参数进行修改,所以用两个字符串获取这两个值
String pageStr=request.getParameter("page");
String limitStr=request.getParameter("limit");
2 dao层中的修改
1. userDao接口
添加一个可以传两个参数的selectTeacher方法
添加一个可以获取数据表中总条目数的countTeacher方法(一会在vo层中使用)
public interface userDao {
public Admin selectAllAdmin(String name, String password) throws SQLException; //查询管理员的用户名密码是否存在
public Student selectAllStudent(String name, String password) throws SQLException; //查询学生的用户名密码是否存在
public Teacher selectAllTeacher(String name, String password) throws SQLException; //查询教师的用户名密码是否存在
public List<Object> selectTeacherList() throws SQLException;
public List<Object> selectTeacherList(String page,String limit) throws SQLException;
public int countTeacher() throws SQLException;
}
2. 去userdaoImpl中完善该两个方法
1. 关于(page1-1)*limit1的计算
2. countTeacher方法的写法,查询语句中用count关键字计算表格的条数,用as关键字把数目改名为sum
@Override
public List<Object> selectTeacherList(String page, String limit) throws SQLException {
// TODO Auto-generated method stub
DBUtil dbUtil = new DBUtil();
String sql="select * from teacherinfo limit ?,?";
PreparedStatement ps=(PreparedStatement)dbUtil.getPreparedStatement(sql);
int page1=Integer.parseInt(page);
int limit1=Integer.parseInt(limit);
ps.setInt(1, (page1-1)*limit1);
ps.setInt(2, limit1);
ResultSet rs=ps.executeQuery();
List<Object> list=new ArrayList<Object>();
while(rs.next()) {
Teacher teacher = new Teacher();
teacher.setTeacherId(rs.getString("teacherId"));
teacher.setTname(rs.getString("tname"));
teacher.setTsex(rs.getString("tsex"));
teacher.setTage(rs.getInt("tage"));
teacher.setTdept(rs.getString("tdept"));
teacher.setTel(rs.getString("tel"));
teacher.setQQ(rs.getString("QQ"));
teacher.setProfessional(rs.getString("professional"));
list.add(teacher);
}
return list;
}
@Override
public int countTeacher() throws SQLException {
// TODO Auto-generated method stub
DBUtil dbUtil = new DBUtil();
String sql="select count(*) as sum from teacherinfo";
Statement st=(Statement) dbUtil.getStatement();
//执行sql语句,得到结果集rs
ResultSet rs=st.executeQuery(sql);
/*
* while(rs.next()) { return rs.getInt("sum"); }
*/
return rs.getInt("sum");
/* return 0; */
}
3. 因为我们需要使用sql语句查询limit+两个参数的数目,所以sql语句中要使用?代参,因此我们需要使用PreparedStatement对象而非Statement对象
注:使用PreparedStatement对象的话,executeQuery()括号中中无参数,而使用Statement对象时,括号中有参数sql
e.g. statement
String sql="select * from teacherinfo";
//不需要问号代参,不需要where语句查询,可以直接使用statement
Statement st=(Statement) dbUtil.getStatement();
//执行sql语句,得到结果集rs
ResultSet rs=(st).executeQuery(sql);
e.g. preparedstatement
String sql="select * from s_admin where name =? and password =?";
PreparedStatement ps=(PreparedStatement)dbUtil.getPreparedStatement(sql);
ps.setString(1, name);
ps.setString(2, password);
ResultSet rs=ps.executeQuery();
PreparedStatement对象
用于设置 IN 参数值的设置方法(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法,问号的位置也是应该注意的,因为第一个问好的位置为1,第二个问号的位置为2.以此类推。
如果需要任意参数类型转换,使用 setObject 方法时应该将目标 SQL 类型作为其参数。
在以下设置参数的示例中,con 表示一个活动连接:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 1533.00)
pstmt.setInt(2, 1102)
pstmt.execute()//注意提交时这里不能再有sql语句,不同于Statment
3. 传回AllTeacherServlet后的更改
userDao userDao=new userDaoImpl();
try {
List<Object> list = userDao.selectTeacherList(pageStr,limitStr);
response.setContentType("text/html;charset=utf-8");
//传json数据
Vo vo=new Vo();
vo.setCode(0);
vo.setMsg("success");
//此处需要获取的是数据库中数目的总和
vo.setCount(userDao.countTeacher());
vo.setData(list);
//把json类型转化为字符串,传回前端
response.getWriter().write(JSONObject.toJSONString(vo));
此时new list时调用的selectteacherlist方法就是我们刚刚更改的多加了page和limit两个参数后的方法。
vo.setCount()中的数据也不再是list.size(),而是整个数据表中总数目的条数,也就是我们用count方法计算出来的数目