话说
笔者总是相信,知历史,才能更好明未来。千淘万漉虽辛苦,吹尽黄沙始到金。直到后期优化过后,再回眸当年的一步步,感慨万千。今天总结三个内容:
一、修改新闻 二、发布新闻 三、删除新闻
一 、改
流程: 1)在NewsDao里编写getNews()方法(实现显示修改的新闻数据)–> 2)设计调转页面news_update.jsp–> 3)设计doUpdate.jsp页面,实现form表单提交处理。
1)在NewsDao里编写getNews()方法(实现显示修改的新闻数据) 代码如下
//定义获取要修改的新闻对象方法 //实现这样一个目的:你点击哪个新闻的修改,就在news_update.jsp对应位置显示将要修改的内容 public News getNews( int id) { News news = null; conn = this.getConn(); String sql = "select * from t_news where id = ?"; try { ps = conn.prepareStatement(sql); ps.setInt(1, id); //执行SQL语句 rs = ps.executeQuery(); //取出来 if(rs.next()) { id = rs.getInt("id"); String title = rs.getString("title"); String author = rs.getString("author"); news = new News(id, title, author); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return news; }2)设计调转页面news_update.jsp–>
<%@page import="com.hmc.jdbc.model.News"%> <%@page import="com.hmc.jdbc.dao.NewsDao"%> <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>新闻修改</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <!-- 根据“修改”连接传递的参数获取对应的新闻对象,然后放入页面对应位置 --> <% //获取修改连接传递过来的参数 int id= 0; //获取到的参数是String类型,要转化一下格式,转化之前要做判断。 String strId = request.getParameter("id"); if(strId != null && !"".equals(strId)) { id = Integer.parseInt(strId); } NewsDao nd = new NewsDao(); //根据传过来的id,调用getNews()方法,就可以获得对应news对象。 News news = nd.getNews(id); %> <body> <form action="#" method="post"> <h2 align="center">Meice的新闻修改</h2> <table> <tr> <td>编号</td> <!-- 这里name很关键,便于后期精准取值 --> <td><input type="text" name="id" readonly = "readonly" value="<%= news.getId() %>"></td> </tr> <tr> <td>标题</td> <td><input type="text" name="title" value="<%=news.getTitle() %>"></td> </tr> <tr> <td>作者</td> <td><input type="text" name="author" value="<%=news.getAuthor() %>"></td> </tr> <tr align="center"> <td colspan="2"><input type="submit" value="提交"></td> </tr> </table> </form> </body> </html>上图一张:
3)设计doUpdate.jsp页面,实现form表单提交处理。 这个页面什么也不显示,就是来传值、调用方法和调转。
第一步: 要在NewsDao中定义modify()方法,前端一旦修改,马上在数据库修改。
//定义修改新闻方法modify() {},实现修改过后,再次在news_Show.jsp页面显示 public int modify(News news) { String sql = "update t_news set title = ?, author = ? where id = ?"; Object[] params = {news.getTitle(),news.getAuthor(),news.getId()}; return this.executeUpdate(sql, params); }第二步:在doUpdate.jsp页面做接收参数、调用方法、调转页面操作
<%@page import="com.hmc.jdbc.dao.NewsDao"%> <%@page import="com.hmc.jdbc.model.News"%> <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% /* 处理form表单修改链接提交后的跳转 */ //设置编码,避免乱码 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); //获取参数,获取参数就是根据表单中的name来获取的 String strId = request.getParameter("id"); String title = request.getParameter("title"); String author = request.getParameter("author"); //转换id类型并且判断 int id = 0; if(strId != null && !"".equals(strId)) { id = Integer.parseInt(strId); } //获取到的数据放入对象中 News news = new News(id,title,author); //调用NewsDao中的modify方法 NewsDao nd = new NewsDao(); int result = nd.modify(news); //客户可能不做任何修改,所以应该做个判断 if(result>0) { request.getRequestDispatcher("news_Show.jsp").forward(request, response); } else { request.getRequestDispatcher("news_update.jsp").forward(request, response); } %>二、发布新闻
修改方法都写好了,增还会远吗? 流程: 1)设计news_add.jsp页面,用来增加新闻; 2)在NewsDao里面编写addNews()方法,实现数据库新闻的增加。 3)设计doAdd.jsp用来接受参数、调用方法、页面跳转。
1)设计news_add.jsp页面,用来增加新闻;
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>发布新闻</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form action="doAdd.jsp" method="post"> <h2 align="center">Meice发布新闻</h2> <table> <tr> <!--发布新闻就不在给id了,这是我们掌控新闻的核心 --> </tr> <tr> <td>标题</td> <td><input type="text" name="title"></td> </tr> <tr> <td>作者</td> <td><input type="text" name="author"></td> </tr> <tr align="center"> <td colspan="2"><input type="submit" value="发布"></td> </tr> </table> </form> </body> </html>2)在NewsDao里面编写addNews()方法,实现数据库新闻的增加。
//定义增加新闻的方法addNews(){},实现数据库新闻的增加 public int addNews(News news) { int result =0; String sql = "insert into t_news (title,author) values (?,?)"; Object[] params = {news.getTitle(),news.getAuthor()}; result = this.executeUpdate(sql, params); return result; }3)设计doAdd.jsp用来接受参数、调用方法、页面跳转。
<%@page import="com.hmc.jdbc.dao.NewsDao"%> <%@page import="com.hmc.jdbc.model.News"%> <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!-- 针对发布新闻form表单做处理,接受值、处理编码、调用方法、调转页面 --> <% //设置编码 request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); //根据form表单的name属性接受参数 String title = request.getParameter("title"); String author = request.getParameter("author"); //创建news对象,把新接收的值放进去 //因为这个特殊,所以我们在News JavaBean里面补充一个带这两个参数的构造方法即可。 /* public News(String title, String author) { this.title = title; this.author = author; } */ News news = new News(title,author); //调用NewsDao中的newsAdd()方法 NewsDao nd = new NewsDao(); int result =nd.addNews(news); //判断是否增加,决定页面跳转 if(result>0) { request.getRequestDispatcher("news_Show.jsp").forward(request, response); } else { request.getRequestDispatcher("news_add.jsp").forward(request, response); } %>还是上两张图,以资鼓励!
三、删除新闻
最后一步,删除新闻。 1)在NewsDao里面添加Del()方法,在数据库里删除数据。 2)点击删除,跳转到doDel.jsp页面这个相对简单,先苦后甜嘛~~嘻嘻。
1)在NewsDao里面添加Del()方法,在数据库里删除数据。
//定义删除方法 public int newsDel(int id) { int result =0; String sql = "delete from t_news where id = ?"; Object[] params = {id}; result = this.executeUpdate(sql, params); return result; }2)点击删除,跳转到doDel.jsp页面
//链接代码如下 <a href="deDel.jsp?id=<%=news.getId()%>" onclick="return confirm('真的狠心删除吗?')" >删除</a> deDel.jsp代码如下: <%@page import="com.hmc.jdbc.dao.NewsDao"%> <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!--同修改新闻一样,实现接受参数、调用方法、跳转页面是三个功能 --> <% //接受参数 int id = 0; String strId = request.getParameter("id"); if(strId != null && !"".equals(strId)) { id = Integer.valueOf(strId); } //调用NewsDao中的newsDel()方法 NewsDao nd = new NewsDao(); int result = nd.newsDel(id); //在删除成功的时候,弹出提示确认是否删除成功,虽然没有实际意义,但是可以结合一下alter /* 这里用到了弹框提示,很好。location.herf跳转也是一种办法。直接用 request.getRequestDispatcher()也是可以的。这里主要是为了演示弹窗! */ if(result>0) { out.println("<script type='text/javascript'>alert('恭喜你,删除成功!');location.href='news_Show.jsp'</script>"); }else { out.println("<script type='text/javascript'>alert('遗憾,删除失败!');location.href='news_Show.jsp'</script>"); } %>还是留点图作为纪念。
至此,最原始版本的JDBC+JSP发布新闻完成。Beautiful! 后期,小美将继续优化。当然利用Servlet JSTL 以及框架做这个会很简单,目的是回味一下那种复杂的感觉。
晚安。
最后,上一段BaseDao的完整版代码。
package com.hmc.jdbc.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * @Author Meice * @Date 2017年8月6日 * 这个BaseDao版本也就是我们前面实现的BaseDaoV2版本 * 封装了这样几个功能:1 加载驱动 2 获取连接 3 释放资源 4 查 5 增、改、删 * 它是我们后期继续升级更新新闻系统的坚固基石,感谢它默默滴支持! */ public class BaseDao { //这三个变量都要用,设置为全局变量 Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; //定义加载驱动为静态语句块 static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //封装获取连接方法 public Connection getConn() { String url = "jdbc:mysql://localhost:3306/news_db"; String user = "root"; String password = "119913"; try { conn = DriverManager.getConnection(url, user, password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("恭喜你,连接成功!"); return conn; } //封装关闭资源的方法 public void closeJDBC(ResultSet rs, PreparedStatement ps, Connection conn ) { try { if(rs != null) rs.close(); if(ps != null) ps.close(); if(conn != null) conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //定义整合增、改、删的封装方法executeUpdate() public int executeUpdate(String sql, Object[] params) { int result = 0; conn = this.getConn(); try { //预编译DQL语句 ps = conn.prepareStatement(sql); //实际过程中,语句可能不设置参数,所以要做个判断 ,避免NullPointException错误 if(params != null && params.length>0) { //遍历参数,并为其赋值 for(int i=0;i<params.length;i++) { ps.setObject((i+1), params[i]); } } //执行语句 result = ps.executeUpdate(); //[判断执行结果是否奏效,可写可不写] if(result>0) { System.out.println("执行CUD操作之一成功!"); } else { System.out.println("执行CUD操作之一失败"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { //因为在executeUpdate()方法中不存在ResultSet(),所以为null值。 this.closeJDBC(null, ps, conn); } return result; } //main方法测试 public static void main(String[] args) { //测试连接数据库是否成功 测试成功! //System.out.println(new BaseDao().getConn()); //[测试executeUpdate()方法] 测试成功! /*String sql = "delete from t_news where id = ?"; Object[] params = {43}; new BaseDao().executeUpdate(sql, params);*/ } }在上一段NewsDao(对新闻系统页面的交互的CURD)代码:
package com.hmc.jdbc.dao; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.hmc.jdbc.model.News; /** * @Author Meice * @Date 2017年8月6日 * 在这个类里面,我们会实现由数据库到页面的跨越时空的转变。 */ //继承BaseDao类,就可以方便调用我们已经封装好的方法 public class NewsDao extends BaseDao{ //定义集合list,存放由后台取出的数据,方便前段调用。 public List<News> list() { //创建list集合 List<News> list = new ArrayList<>(); //连接数据库,从数据库获取数据 conn = this.getConn(); String sql = "select * from t_news"; try { //执行预编译 ps = conn.prepareStatement(sql); //执行SQL语句 rs = ps.executeQuery(); //遍历结果集 while(rs.next()) { int id = rs.getInt("id"); String title = rs.getString("title"); String author = rs.getString("author"); //把从数据库获取到的属性值用JavaBean来处理,也就是转化为一个个具体的对象 News news = new News(id, title, author); //数据库中有多少数据,就添加到集合中,这里以对象方式添加 list.add(news); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } //定义获取要修改的新闻对象方法 //实现这样一个目的:你点击哪个新闻的修改,就在news_update.jsp对应位置显示将要修改的内容 public News getNews( int id) { News news = null; conn = this.getConn(); String sql = "select * from t_news where id = ?"; try { ps = conn.prepareStatement(sql); ps.setInt(1, id); //执行SQL语句 rs = ps.executeQuery(); //取出来 if(rs.next()) { id = rs.getInt("id"); String title = rs.getString("title"); String author = rs.getString("author"); news = new News(id, title, author); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return news; } //定义修改新闻方法modify() {},实现修改过后,再次在news_Show.jsp页面显示 public int modify(News news) { int result =0; String sql = "update t_news set title = ?, author = ? where id = ?"; Object[] params = {news.getTitle(),news.getAuthor(),news.getId()}; result = this.executeUpdate(sql, params); return result; } //定义增加新闻的方法addNews(){},实现数据库新闻的增加 public int addNews(News news) { int result =0; String sql = "insert into t_news (title,author) values (?,?)"; Object[] params = {news.getTitle(),news.getAuthor()}; result = this.executeUpdate(sql, params); return result; } //定义删除方法 public int newsDel(int id) { int result =0; String sql = "delete from t_news where id = ?"; Object[] params = {id}; result = this.executeUpdate(sql, params); return result; } //测试 public static void main(String[] args) { //[测试list集合取值是否成功] 成功! //System.out.println(new NewsDao().list()); } }后面再次用Eclipse、IntelliJ IDEA重复编写几次,心得体会如下: 技术层面: 1)在页面传递id的时候,请注意一下两行代码的区别:
<a href="doDel.jsp?id= <%=news.getId() %>" onclick="return confirm('真的忍心删我?')">删除</a> <a href="doDel.jsp?id=<%=news.getId()%>" onclick="return confirm('真的忍心删我?')">删除</a>第一行代码因为id赋值的时候,有空格,所以在转化的时候,JSP页面会报错。笔者每次回味JDBC的时候,都会不小心出现这个错误。
2)在把字符串转化为整型的时候: //接受参数 int id =0; String strId = request.getParameter(“id”); System.out.println(“我是字符串strId:”+strId); if (strId != null && !”“.equals(strId)){ id = Integer.valueOf(strId); } 也是有2次没注意,把and左右 !”“写成了”“.equals() 导致的是and结果为false,执行不了if语句块中的代码。所以,要细心。
非技术层面: 3)不论多么简单的知识点,综合起来,就有了一定的深度。
4)温故而知新。笔者每次用不同的IDE开发工具,都有不同的收获, 代码如人生,如很多事,很多人一样,要反复的推敲和琢磨。
早上好!
