B站手把手layui+javaWeb项目全纪录(二)

目录

一、后台页面布局

二、教师列表的建立

1  新建allteacher.jsp文件

2  allteacher中的修改

3 新建AllTeacherServlet

4 userDao接口及其实现类的修改

5 内嵌的实现

三、分页功能 

1   AllTeacherServlet中的更改

2  dao层中的修改

1. userDao接口

2. 去userdaoImpl中完善该两个方法

3. 传回AllTeacherServlet后的更改


重要提醒!!!

家人们,咱就是说千万不要乱删除eclipse包管理器里的文件夹,我本来想把里面没大有用的项目删掉来自,然后我一不小心把server包也给删了,咱就是说,然后就报404了,特别好,然后我调了半个小时才调好,其中经历了重新在eclipse中配置Tomcat9.0,然后又修改了默认端口号,把8080改成8085了之后才好,过程很波折,希望大家千万不要像我一样闲的没事干乱删文件夹!!!

Eclipse 添加 Tomcat Server 配置_write6的专栏-CSDN博客_eclipse添加tomcat以下步骤是将一个独立安装的(standalone)Tomcat 整合到Eclipse中,方便在Eclipse发布Web工程到Tomcat 服务器,启停WebServer 调试程序。项目开发中不推荐使用Eclipse自带的Web Server,不便于运行调试,往往需要根据项目需求独立安装指定厂家和版本的Webserver。(项目部署参考 -->Eclipse 部署项目到Tomcat)...https://blog.csdn.net/write6/article/details/79137961?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164162222216780271576583%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164162222216780271576583&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-79137961.first_rank_v2_pc_rank_v29&utm_term=%E5%9C%A8eclipse%E4%B8%AD%E6%B7%BB%E5%8A%A0Tomcat&spm=1018.2226.3001.4187

Tomcat 修改端口号_青禾&的博客-CSDN博客_tomcat端口号在哪里修改找到 Tomcat 的安装路径,进入 conf 目录,打开 server.xml 文件;打开 server.xml 文件,可以看到默认端口号是 8080 ,修改端口号,这里改为8085,你可以根据自己的情况进行修改;修改完成,保存,重启 Tomcat ,在浏览器输入“http://localhost:8085/”,打开了 Tomcat ,即代表修改成功。...https://blog.csdn.net/weixin_42512675/article/details/108399600?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164162358716781683928037%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164162358716781683928037&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-108399600.first_rank_v2_pc_rank_v29&utm_term=tomcat%E4%BF%AE%E6%94%B9%E7%AB%AF%E5%8F%A3%E5%8F%B7&spm=1018.2226.3001.4187

一、后台页面布局

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方法中这样写

 (77条消息) servlet中doGet()和doPost()方法的用法和区别_Lymanyu的博客-CSDN博客_doget和dopost方法https://blog.csdn.net/qq_38963960/article/details/79468182?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164160428616781685398251%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164160428616781685398251&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-79468182.first_rank_v2_pc_rank_v29&utm_term=doget%E5%92%8Cdopost%E6%96%B9%E6%B3%95&spm=1018.2226.3001.4187

 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

Statement 和 PreparedStatement之间的关系和区别_suwu150-CSDN博客_preparedstatement关系:PreparedStatement继承自Statement,都是接口区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高表示预编译的 SQL 语句的对象。 接口:public interface PreparedStatement extends Statement之间的继承关系 SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。 注:用于设置 IN 参数值的设置方法(setShorthttps://blog.csdn.net/suwu150/article/details/52745055?ops_request_misc=&request_id=&biz_id=102&utm_term=preparedstatement&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-52745055.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

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方法计算出来的数目

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值