一、数据库与表

人工智能微博(blog)

note(id,bt,nr);
微博信息(编号,标题,内容)

列表
添加

数据库脚本

  1. /*
  2. Navicat MySQL Data Transfer
  3.  
  4. Source Server : localhost
  5. Source Server Version : 50506
  6. Source Host : localhost:3306
  7. Source Database : blog
  8.  
  9. Target Server Type : MYSQL
  10. Target Server Version : 50506
  11. File Encoding : 65001
  12.  
  13. Date: 2017-07-13 08:58:01
  14. */
  15.  
  16. SET FOREIGN_KEY_CHECKS=0;
  17.  
  18. -- ----------------------------
  19. -- Table structure for `wb`
  20. -- ----------------------------
  21. DROP TABLE IF EXISTS `wb`;
  22. CREATE TABLE `wb` (
  23. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
  24. `bt` varchar(128) NOT NULL COMMENT '标题',
  25. `nr` text COMMENT '内容',
  26. PRIMARY KEY (`id`)
  27. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
  28.  
  29. -- ----------------------------
  30. -- Records of wb
  31. -- ----------------------------
  32. INSERT INTO `wb` VALUES ('', '微软建立新人工智能实验室 开发多用途学习系统', '微软公司凤凰科技讯据彭博社北京时间7月12日报道,微软公司将建立一个新研究实验室,专注于人工智能(AI),目标是开发出更为多用途的学习系统');
  33. INSERT INTO `wb` VALUES ('', '人工智能来袭 金融行业迎来下岗潮', '“在金融圈和用户教育上,对人工智能还未完全信任之前,我们只能采取人肉智能(HI)和人工智能(AI)相结合的方式”,朱明杰称,他们会机器先出一些模型,在专业的风控从');
  34. INSERT INTO `wb` VALUES ('', '即便取代脑力劳动AI还不能“打动”人心', '但AI革命不同, AI取代脑力劳动,将让人类转向创造性、情感性劳动,这些素质是每一个体都具有的。 事实上,人工智能导致失业,还属于一种弱人工智能观念。有人煞有介');
  35. INSERT INTO `wb` VALUES ('', 'Google 设立风投公司扶持 AI 新创团队', 'Google 在 AI 上的野心人尽皆知,但要让行业更好地发展,光有他们自己的力量是不够的。因此在最近他们新成立了一间名为 Gradient');
  36. INSERT INTO `wb` VALUES ('', 'AI来临,失业大势难以避免', 'AI来临,我们需要担心失业吗? 据斯坦福大学人工智能与伦理学教授卡普兰的一项统计,美国注册在案的720个职业中,将有47%被人工智能取代。未来10年机器人将取代1500万');

二、创建项目

三、添加驱动

四、创建实体层(Bean)

  1. package com.weibo;
  2.  
  3. /**微博Bean*/
  4. public class Wb {
  5. /**编号*/
  6. private int id;
  7. /**标题*/
  8. private String bt;
  9. /**内容*/
  10. private String nr;
  11.  
  12. public int getId() {
  13. return id;
  14. }
  15.  
  16. public void setId(int id) {
  17. this.id = id;
  18. }
  19.  
  20. public String getBt() {
  21. return bt;
  22. }
  23.  
  24. public void setBt(String bt) {
  25. this.bt = bt;
  26. }
  27.  
  28. public String getNr() {
  29. return nr;
  30. }
  31.  
  32. public void setNr(String nr) {
  33. this.nr = nr;
  34. }
  35. }

五、创建数据访问层(Dao)

5.1、JDBCUtil辅助类

  1. package com.dao;
  2.  
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5. import java.sql.Connection;
  6. import java.sql.DriverManager;
  7. import java.sql.PreparedStatement;
  8. import java.sql.ResultSet;
  9. import java.sql.ResultSetMetaData;
  10. import java.sql.SQLException;
  11. import java.sql.Statement;
  12. import java.util.ArrayList;
  13. import java.util.HashMap;
  14. import java.util.List;
  15. import java.util.Map;
  16.  
  17. public class JDBCUtils {
  18.  
  19. public static String DRIVER="com.mysql.jdbc.Driver";
  20. public static String URL="jdbc:mysql://127.0.0.1:3306/blog?useUnicode=true&characterEncoding=UTF-8";
  21. public static String USER_NAME="root";
  22. public static String PASSWORD="";
  23.  
  24. //加载驱动
  25. static {
  26. try {
  27. Class.forName(DRIVER);
  28. } catch (ClassNotFoundException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32.  
  33. private JDBCUtils() {
  34.  
  35. }
  36.  
  37. /**
  38. * 获得连接
  39. *
  40. * @return
  41. */
  42. public static Connection getconnnection() {
  43. Connection con = null;
  44. try {
  45. con = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
  46. } catch (SQLException e) {
  47. e.printStackTrace();
  48. }
  49. return con;
  50. }
  51.  
  52. /**
  53. * 关闭连接
  54. *
  55. * @param rs
  56. * @param st
  57. * @param con
  58. */
  59. public static void close(ResultSet rs, Statement st, Connection con) {
  60. try {
  61. try {
  62. if (rs != null) {
  63. rs.close();
  64. }
  65. } finally {
  66. try {
  67. if (st != null) {
  68. st.close();
  69. }
  70. } finally {
  71. if (con != null)
  72. con.close();
  73. }
  74. }
  75. } catch (SQLException e) {
  76. e.printStackTrace();
  77. }
  78. }
  79.  
  80. /**
  81. * 关闭连接
  82. *
  83. * @param rs
  84. */
  85. public static void close(ResultSet rs) {
  86. Statement st = null;
  87. Connection con = null;
  88. try {
  89. try {
  90. if (rs != null) {
  91. st = rs.getStatement();
  92. rs.close();
  93. }
  94. } finally {
  95. try {
  96. if (st != null) {
  97. con = st.getConnection();
  98. st.close();
  99. }
  100. } finally {
  101. if (con != null) {
  102. con.close();
  103. }
  104. }
  105. }
  106. } catch (SQLException e) {
  107. e.printStackTrace();
  108. }
  109. }
  110.  
  111. /**
  112. * 关闭连接
  113. *
  114. * @param st
  115. * @param con
  116. */
  117. public static void close(Statement st, Connection con) {
  118. try {
  119. try {
  120. if (st != null) {
  121. st.close();
  122. }
  123. } finally {
  124. if (con != null)
  125. con.close();
  126. }
  127. } catch (SQLException e) {
  128. e.printStackTrace();
  129. }
  130. }
  131.  
  132. /**
  133. * insert/update/delete
  134. * 增加/更新/删除
  135. *
  136. * @param sql 数据库语句
  137. * @param args 可变参数(可以不带参数,可以带0-n个参数)
  138. * @return
  139. */
  140. public static int update(String sql, Object... args) {
  141. int result = 0;
  142. Connection con = getconnnection();
  143. PreparedStatement ps = null;
  144. try {
  145. ps = con.prepareStatement(sql);
  146. if (args != null) {
  147. for (int i = 0; i < args.length; i++) {
  148. ps.setObject((i + 1), args[i]);
  149. }
  150. }
  151. result = ps.executeUpdate();
  152. } catch (SQLException e) {
  153. e.printStackTrace();
  154. } finally {
  155. close(ps, con);
  156. }
  157.  
  158. return result;
  159. }
  160.  
  161. /**
  162. * query, because need to manually close the resource, so not recommended
  163. * for use it
  164. *
  165. * @param sql
  166. * @param args
  167. * @return ResultSet
  168. */
  169. @Deprecated //注解
  170. public static ResultSet query(String sql, Object... args) {
  171. ResultSet result = null;
  172. Connection con = getconnnection();
  173. PreparedStatement ps = null;
  174. try {
  175. ps = con.prepareStatement(sql);
  176. if (args != null) {
  177. for (int i = 0; i < args.length; i++) {
  178. ps.setObject((i + 1), args[i]);
  179. }
  180. }
  181. result = ps.executeQuery();
  182. } catch (SQLException e) {
  183. e.printStackTrace();
  184. }
  185. return result;
  186. }
  187.  
  188. /**
  189. * Query a single record
  190. * 查询单个记录
  191. * @param sql
  192. * @param args
  193. * @return Map<String,Object>
  194. */
  195. public static Map<String, Object> queryForMap(String sql, Object... args) {
  196. Map<String, Object> result = new HashMap<String, Object>();
  197. List<Map<String, Object>> list = queryForList(sql, args);
  198. if (list.size() > 0) {
  199. result = list.get(0);
  200. }
  201. return result;
  202. }
  203.  
  204. /**
  205. * Query a single record
  206. * 查询单个记录返回强类型对象
  207. * @param sql
  208. * @param args
  209. * @return <T> //泛型
  210. */
  211. public static <T> T queryForObject(String sql, Class<T> clz, Object... args) {
  212. T result = null;
  213. List<T> list = queryForList(sql, clz, args);
  214. if (list.size() > 0) {
  215. result = list.get(0);
  216. }
  217. return result;
  218. }
  219.  
  220. /**
  221. * Query a single record
  222. *
  223. * @param sql
  224. * @param args
  225. * @return List<Map<String,Object>>
  226. */
  227. public static List<Map<String, Object>> queryForList(String sql, Object... args) {
  228. List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
  229. Connection con = null;
  230. ResultSet rs = null;
  231. PreparedStatement ps = null;
  232. try {
  233. con = getconnnection();
  234. ps = con.prepareStatement(sql);
  235. if (args != null) {
  236. for (int i = 0; i < args.length; i++) {
  237. ps.setObject((i + 1), args[i]);
  238. }
  239. }
  240. rs = ps.executeQuery();
  241. ResultSetMetaData rsmd = rs.getMetaData();
  242. int columnCount = rsmd.getColumnCount();
  243. while (rs.next()) {
  244. Map<String, Object> map = new HashMap<String, Object>();
  245. for (int i = 1; i <= columnCount; i++) {
  246. map.put(rsmd.getColumnLabel(i), rs.getObject(i));
  247. }
  248. result.add(map);
  249. }
  250. } catch (SQLException e) {
  251. e.printStackTrace();
  252. } finally {
  253. close(rs, ps, con);
  254. }
  255. return result;
  256. }
  257.  
  258. /**
  259. * Query records
  260. * 查询多个对象,返回强类型集合
  261. * @param sql
  262. * @param args
  263. * @return List<T>
  264. */
  265. public static <T> List<T> queryForList(String sql, Class<T> clz, Object... args) {
  266. List<T> result = new ArrayList<T>();
  267. Connection con = null;
  268. PreparedStatement ps = null;
  269. ResultSet rs = null;
  270. try {
  271. con = getconnnection();
  272. ps = con.prepareStatement(sql);
  273. if (args != null) {
  274. for (int i = 0; i < args.length; i++) {
  275. ps.setObject((i + 1), args[i]);
  276. }
  277. }
  278. rs = ps.executeQuery();
  279. ResultSetMetaData rsmd = rs.getMetaData();
  280. int columnCount = rsmd.getColumnCount();
  281. while (rs.next()) {
  282. T obj = clz.newInstance();
  283. for (int i = 1; i <= columnCount; i++) {
  284. String columnName = rsmd.getColumnName(i);
  285. String methodName = "set" + columnName.substring(0, 1).toUpperCase()
  286. + columnName.substring(1, columnName.length());
  287. Method method[] = clz.getMethods();
  288. for (Method meth : method) {
  289. if (methodName.equals(meth.getName())) {
  290. meth.invoke(obj, rs.getObject(i));
  291. }
  292. }
  293. }
  294. result.add(obj);
  295. }
  296. } catch (InstantiationException e) {
  297. e.printStackTrace();
  298. } catch (IllegalAccessException e) {
  299. e.printStackTrace();
  300. } catch (SQLException e) {
  301. e.printStackTrace();
  302. } catch (IllegalArgumentException e) {
  303. e.printStackTrace();
  304. } catch (InvocationTargetException e) {
  305. e.printStackTrace();
  306. } finally {
  307. close(rs, ps, con);
  308. }
  309. return result;
  310. }
  311. }

5.2、WbDao

  1. package com.dao;
  2.  
  3. import java.util.List;
  4. import com.weibo.Wb;
  5.  
  6. /**微博数据访问*/
  7. public class WbDao {
  8.  
  9. /**获得所有的微博信息*/
  10. public List<Wb> all(){
  11. return JDBCUtils.queryForList("select * from wb;", Wb.class);
  12. }
  13.  
  14. /**添加单条微博信息*/
  15. public int add(String bt,String nr){
  16. return JDBCUtils.update("insert into wb(bt,nr) values(?,?);", bt,nr);
  17. }
  18. }

六、展示微博列表

index.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@page import="com.weibo.Wb"%>
  3. <%@page import="com.dao.WbDao"%>
  4. <%
  5. //实例化数据访问对象
  6. WbDao dao=new WbDao();
  7. %>
  8.  
  9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  10. <html>
  11. <head>
  12. <title>人工智能微博</title>
  13. <meta http-equiv="pragma" content="no-cache">
  14. <meta http-equiv="cache-control" content="no-cache">
  15. <meta http-equiv="expires" content="0">
  16. </head>
  17. <body>
  18. <h2>人工智能微博</h2>
  19.  
  20. <ul>
  21. <%for(Wb obj : dao.all()){ %>
  22.  
  23. <li><%=obj.getBt() %> <%=obj.getNr() %></li>
  24.  
  25. <%} %>
  26. </ul>
  27.  
  28. </body>
  29. </html>

运行效果:

七、添加新内容

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2.  
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5. <head>
  6. <title>人工智能微博</title>
  7. <meta http-equiv="pragma" content="no-cache">
  8. <meta http-equiv="cache-control" content="no-cache">
  9. <meta http-equiv="expires" content="0">
  10. </head>
  11. <body>
  12. <h2>人工智能微博 - 发布</h2>
  13.  
  14. <form action="Add" method="Post">
  15. <p>
  16. 标题:<input name="bt" />
  17. </p>
  18.  
  19. <p>
  20. 内容:<textarea name="bt" cols="50" rows="5"></textarea>
  21. </p>
  22.  
  23. <p>
  24. <input type="submit" value="保存" />
  25. </p>
  26. </form>
  27.  
  28. </body>
  29. </html>

效果:

Add Servlet

  1. package com.action;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import com.dao.WbDao;
  10.  
  11. public class Add extends HttpServlet {
  12.  
  13. public void doPost(HttpServletRequest request, HttpServletResponse response)
  14. throws ServletException, IOException {
  15.  
  16. //设置响应编码为utf-8
  17. response.setCharacterEncoding("utf-8");
  18. //设置请求编码为utf-8
  19. request.setCharacterEncoding("utf-8");
  20.  
  21. //实例化数据访问对象
  22. WbDao dao=new WbDao();
  23.  
  24. //执行添加
  25. dao.add(request.getParameter("bt"), request.getParameter("nr"));
  26.  
  27. //转到首页
  28. response.sendRedirect("index.jsp");
  29. }
  30.  
  31. }

八、资料与练习

电子书管理系统(rebot)  120分钟

要求:请使用JavaEE实现一个电子书管理系统,电子书的属性主要包含:标题(title)、页数(page)、类型(category),系统可以选择人工智能、计算机、文学、神话、自然科学。

1、      创建数据库Lib与表book,添加3行以上的数据,导出sql脚本。20分

2、      创建动态Java Web项目,添加数据库驱动程序。20分

3、      实现电子书展示功能,index.jsp。20分

4、      实现电子书添加功能,add.jsp。30分

5、      实现展示与添加功能间的跳转。5分

6、      代码规范,注释完整,命名合理,分层开发,界面美观。5分

将数据库脚本(导出)、JavaWeb项目、已实现功能的截图、项目截图打包成压缩文件,命名:班级_姓名,如:S2SR136_张三

示例下载:http://files.cnblogs.com/files/best/weibo.zip

九、人工智能微博二

9.1、wz bean

  1. package com.weibo.bean;
  2.  
  3. /***
  4. * 文章
  5. */
  6. public class Wz {
  7.  
  8. /** 编号 */
  9. private int bh;
  10. /** 标题 */
  11. private String bt;
  12. /** 内容 */
  13. private String nr;
  14.  
  15. public int getBh() {
  16. return bh;
  17. }
  18.  
  19. public void setBh(int bh) {
  20. this.bh = bh;
  21. }
  22.  
  23. public String getBt() {
  24. return bt;
  25. }
  26.  
  27. public void setBt(String bt) {
  28. this.bt = bt;
  29. }
  30.  
  31. public String getNr() {
  32. return nr;
  33. }
  34.  
  35. public void setNr(String nr) {
  36. this.nr = nr;
  37. }
  38.  
  39. }

9.2、JDBCUtil

  1. package com.weibo.dao;
  2.  
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5. import java.sql.Connection;
  6. import java.sql.DriverManager;
  7. import java.sql.PreparedStatement;
  8. import java.sql.ResultSet;
  9. import java.sql.ResultSetMetaData;
  10. import java.sql.SQLException;
  11. import java.sql.Statement;
  12. import java.util.ArrayList;
  13. import java.util.HashMap;
  14. import java.util.List;
  15. import java.util.Map;
  16.  
  17. public class JDBCUtils {
  18.  
  19. public static String DRIVER="com.mysql.jdbc.Driver";
  20. public static String URL="jdbc:mysql://127.0.0.1:3306/weibo?useUnicode=true&characterEncoding=UTF-8";
  21. public static String USER_NAME="root";
  22. public static String PASSWORD="uchr@123";
  23.  
  24. //加载驱动
  25. static {
  26. try {
  27. Class.forName(DRIVER);
  28. } catch (ClassNotFoundException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32.  
  33. private JDBCUtils() {
  34.  
  35. }
  36.  
  37. /**
  38. * 获得连接
  39. *
  40. * @return
  41. */
  42. public static Connection getconnnection() {
  43. Connection con = null;
  44. try {
  45. con = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
  46. } catch (SQLException e) {
  47. e.printStackTrace();
  48. }
  49. return con;
  50. }
  51.  
  52. /**
  53. * 关闭连接
  54. *
  55. * @param rs
  56. * @param st
  57. * @param con
  58. */
  59. public static void close(ResultSet rs, Statement st, Connection con) {
  60. try {
  61. try {
  62. if (rs != null) {
  63. rs.close();
  64. }
  65. } finally {
  66. try {
  67. if (st != null) {
  68. st.close();
  69. }
  70. } finally {
  71. if (con != null)
  72. con.close();
  73. }
  74. }
  75. } catch (SQLException e) {
  76. e.printStackTrace();
  77. }
  78. }
  79.  
  80. /**
  81. * 关闭连接
  82. *
  83. * @param rs
  84. */
  85. public static void close(ResultSet rs) {
  86. Statement st = null;
  87. Connection con = null;
  88. try {
  89. try {
  90. if (rs != null) {
  91. st = rs.getStatement();
  92. rs.close();
  93. }
  94. } finally {
  95. try {
  96. if (st != null) {
  97. con = st.getConnection();
  98. st.close();
  99. }
  100. } finally {
  101. if (con != null) {
  102. con.close();
  103. }
  104. }
  105. }
  106. } catch (SQLException e) {
  107. e.printStackTrace();
  108. }
  109. }
  110.  
  111. /**
  112. * 关闭连接
  113. *
  114. * @param st
  115. * @param con
  116. */
  117. public static void close(Statement st, Connection con) {
  118. try {
  119. try {
  120. if (st != null) {
  121. st.close();
  122. }
  123. } finally {
  124. if (con != null)
  125. con.close();
  126. }
  127. } catch (SQLException e) {
  128. e.printStackTrace();
  129. }
  130. }
  131.  
  132. /**
  133. * insert/update/delete
  134. * 增加/更新/删除
  135. *
  136. * @param sql 数据库语句
  137. * @param args 可变参数(可以不带参数,可以带0-n个参数)
  138. * @return
  139. */
  140. public static int update(String sql, Object... args) {
  141. int result = 0;
  142. Connection con = getconnnection();
  143. PreparedStatement ps = null;
  144. try {
  145. ps = con.prepareStatement(sql);
  146. if (args != null) {
  147. for (int i = 0; i < args.length; i++) {
  148. ps.setObject((i + 1), args[i]);
  149. }
  150. }
  151. result = ps.executeUpdate();
  152. } catch (SQLException e) {
  153. e.printStackTrace();
  154. } finally {
  155. close(ps, con);
  156. }
  157.  
  158. return result;
  159. }
  160.  
  161. /**
  162. * query, because need to manually close the resource, so not recommended
  163. * for use it
  164. *
  165. * @param sql
  166. * @param args
  167. * @return ResultSet
  168. */
  169. @Deprecated //注解
  170. public static ResultSet query(String sql, Object... args) {
  171. ResultSet result = null;
  172. Connection con = getconnnection();
  173. PreparedStatement ps = null;
  174. try {
  175. ps = con.prepareStatement(sql);
  176. if (args != null) {
  177. for (int i = 0; i < args.length; i++) {
  178. ps.setObject((i + 1), args[i]);
  179. }
  180. }
  181. result = ps.executeQuery();
  182. } catch (SQLException e) {
  183. e.printStackTrace();
  184. }
  185. return result;
  186. }
  187.  
  188. /**
  189. * Query a single record
  190. * 查询单个记录
  191. * @param sql
  192. * @param args
  193. * @return Map<String,Object>
  194. */
  195. public static Map<String, Object> queryForMap(String sql, Object... args) {
  196. Map<String, Object> result = new HashMap<String, Object>();
  197. List<Map<String, Object>> list = queryForList(sql, args);
  198. if (list.size() > 0) {
  199. result = list.get(0);
  200. }
  201. return result;
  202. }
  203.  
  204. /**
  205. * Query a single record
  206. * 查询单个记录返回强类型对象
  207. * @param sql
  208. * @param args
  209. * @return <T> //泛型
  210. */
  211. public static <T> T queryForObject(String sql, Class<T> clz, Object... args) {
  212. T result = null;
  213. List<T> list = queryForList(sql, clz, args);
  214. if (list.size() > 0) {
  215. result = list.get(0);
  216. }
  217. return result;
  218. }
  219.  
  220. /**
  221. * Query a single record
  222. *
  223. * @param sql
  224. * @param args
  225. * @return List<Map<String,Object>>
  226. */
  227. public static List<Map<String, Object>> queryForList(String sql, Object... args) {
  228. List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
  229. Connection con = null;
  230. ResultSet rs = null;
  231. PreparedStatement ps = null;
  232. try {
  233. con = getconnnection();
  234. ps = con.prepareStatement(sql);
  235. if (args != null) {
  236. for (int i = 0; i < args.length; i++) {
  237. ps.setObject((i + 1), args[i]);
  238. }
  239. }
  240. rs = ps.executeQuery();
  241. ResultSetMetaData rsmd = rs.getMetaData();
  242. int columnCount = rsmd.getColumnCount();
  243. while (rs.next()) {
  244. Map<String, Object> map = new HashMap<String, Object>();
  245. for (int i = 1; i <= columnCount; i++) {
  246. map.put(rsmd.getColumnLabel(i), rs.getObject(i));
  247. }
  248. result.add(map);
  249. }
  250. } catch (SQLException e) {
  251. e.printStackTrace();
  252. } finally {
  253. close(rs, ps, con);
  254. }
  255. return result;
  256. }
  257.  
  258. /**
  259. * Query records
  260. * 查询多个对象,返回强类型集合
  261. * @param sql
  262. * @param args
  263. * @return List<T>
  264. */
  265. public static <T> List<T> queryForList(String sql, Class<T> clz, Object... args) {
  266. List<T> result = new ArrayList<T>();
  267. Connection con = null;
  268. PreparedStatement ps = null;
  269. ResultSet rs = null;
  270. try {
  271. con = getconnnection();
  272. ps = con.prepareStatement(sql);
  273. if (args != null) {
  274. for (int i = 0; i < args.length; i++) {
  275. ps.setObject((i + 1), args[i]);
  276. }
  277. }
  278. rs = ps.executeQuery();
  279. ResultSetMetaData rsmd = rs.getMetaData();
  280. int columnCount = rsmd.getColumnCount();
  281. while (rs.next()) {
  282. T obj = clz.newInstance();
  283. for (int i = 1; i <= columnCount; i++) {
  284. String columnName = rsmd.getColumnName(i);
  285. String methodName = "set" + columnName.substring(0, 1).toUpperCase()
  286. + columnName.substring(1, columnName.length());
  287. Method method[] = clz.getMethods();
  288. for (Method meth : method) {
  289. if (methodName.equals(meth.getName())) {
  290. meth.invoke(obj, rs.getObject(i));
  291. }
  292. }
  293. }
  294. result.add(obj);
  295. }
  296. } catch (InstantiationException e) {
  297. e.printStackTrace();
  298. } catch (IllegalAccessException e) {
  299. e.printStackTrace();
  300. } catch (SQLException e) {
  301. e.printStackTrace();
  302. } catch (IllegalArgumentException e) {
  303. e.printStackTrace();
  304. } catch (InvocationTargetException e) {
  305. e.printStackTrace();
  306. } finally {
  307. close(rs, ps, con);
  308. }
  309. return result;
  310. }
  311. }

9.3、WzDao

  1. package com.weibo.dao;
  2.  
  3. import java.util.List;
  4. import com.weibo.bean.Wz;
  5.  
  6. /**
  7. * 文章服务
  8. * 数据访问
  9. *
  10. */
  11. public class WzDao {
  12.  
  13. /**获得所有的文章信息*/
  14. public List<Wz> all(){
  15. return JDBCUtils.queryForList("select bh,bt,nr from wz", Wz.class);
  16. }
  17.  
  18. /**新增文章*/
  19. public int add(String bt,String nr){
  20. return JDBCUtils.update("insert into wz(bt,nr) values(?,?)", bt,nr);
  21. }
  22.  
  23. }

9.4、index.jsp页面

  1. <%@page import="com.weibo.bean.Wz"%>
  2. <%@page import="com.weibo.dao.WzDao"%>
  3. <%@ page language="java" contentType="text/html; charset=UTF-8"
  4. pageEncoding="UTF-8"%>
  5.  
  6. <%
  7. WzDao wzdao=new WzDao();
  8. %>
  9.  
  10. <!DOCTYPE html>
  11. <html>
  12. <head>
  13. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  14. <title>人工智能微博</title>
  15. </head>
  16. <body>
  17. <h2>人工智能微博</h2>
  18.  
  19. <ul>
  20. <%for(Wz wz : wzdao.all()) {%>
  21. <li><%=wz.getBh() %></li>
  22. <li><%=wz.getBt() %></li>
  23. <li><%=wz.getNr() %></li>
  24. <li><a href="Delwz?bh=<%=wz.getBh() %>">删除</a></li>
  25. <hr/>
  26. <%} %>
  27. </ul>
  28.  
  29. <a href="add.jsp">发布</a>
  30.  
  31. </body>
  32. </html>

9.5、add.jsp页面

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html>
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>人工智能微博 - 发布</title>
  8. </head>
  9. <body>
  10. <h2>人工智能微博 - 发布</h2>
  11.  
  12. <form action="Addwz" method="post">
  13.  
  14. <p>
  15. 标题:<input type="text" name="bt" />
  16. </p>
  17. <p>
  18. 内容:<textarea type="text" name="nr" cols="60" rows="6" ></textarea>
  19. </p>
  20. <p>
  21. <input type="submit" value="提交" />
  22. </p>
  23. </form>
  24.  
  25. <a href="index.jsp">列表</a>
  26.  
  27. </body>
  28. </html>

9.6、Addwz Servlet

  1. package com.weibo.action;
  2.  
  3. import java.io.IOException;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. import com.weibo.dao.WzDao;
  11.  
  12. /**
  13. * Servlet implementation class Addwz
  14. */
  15. @WebServlet("/Addwz")
  16. public class Addwz extends HttpServlet {
  17. private static final long serialVersionUID = 1L;
  18.  
  19. /**
  20. * @see HttpServlet#HttpServlet()
  21. */
  22. public Addwz() {
  23. super();
  24. // TODO Auto-generated constructor stub
  25. }
  26.  
  27. /**
  28. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  29. */
  30. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  31.  
  32. //设置编码
  33. request.setCharacterEncoding("utf-8");
  34. response.setCharacterEncoding("utf-8");
  35.  
  36. //获得参数
  37. String bt=request.getParameter("bt");
  38. String nr=request.getParameter("nr");
  39.  
  40. //执行添加到数据库
  41. WzDao dao=new WzDao();
  42. dao.add(bt, nr);
  43.  
  44. //跳转到指定页面
  45. response.sendRedirect("index.jsp");
  46. }
  47.  
  48. }

9.7、运行结果

列表:

发布:

9.8、删除与样式

index.jsp

  1. <%@page import="com.weibo.bean.Wz"%>
  2. <%@page import="com.weibo.dao.WzDao"%>
  3. <%@ page language="java" contentType="text/html; charset=UTF-8"
  4. pageEncoding="UTF-8"%>
  5.  
  6. <%
  7. WzDao wzdao=new WzDao();
  8. %>
  9.  
  10. <!DOCTYPE html>
  11. <html>
  12. <head>
  13. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  14. <title>人工智能微博</title>
  15. <style>
  16. .nr{
  17. border:1px dashed #666;
  18. color:#666;
  19. width:70%;
  20. line-height:26px;
  21. margin:8px;
  22. }
  23. .nr:hover{
  24. color:red;
  25. box-shadow:5px 5px 3px #999;
  26. border-radius:10px;
  27.  
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <h2>人工智能微博</h2>
  33.  
  34. <ul>
  35. <%for(Wz wz : wzdao.all()) {%>
  36. <li><%=wz.getBh() %></li>
  37. <li><%=wz.getBt() %></li>
  38. <li class="nr"><%=wz.getNr() %></li>
  39. <hr/>
  40. <%} %>
  41. </ul>
  42.  
  43. <table border="1" width="100%">
  44. <tr>
  45. <th>编号</th> <th>标题</th> <th>内容</th> <th>操作</th>
  46. </tr>
  47. <%for(Wz wz : wzdao.all()) {%>
  48. <tr>
  49. <td><%=wz.getBh() %></td>
  50. <td><%=wz.getBt() %></td>
  51. <td><%=wz.getNr().length()>20?wz.getNr().substring(0,20)+"...":wz.getNr() %></td>
  52. <td><a href="Del?id=<%=wz.getBh() %>" onclick="return confirm('您确定要删除吗?');">删除</a></td>
  53. </tr>
  54. <%} %>
  55. </table>
  56.  
  57. <a href="add.jsp">发布</a>
  58.  
  59. </body>
  60. </html>

Del Servlet

  1. package com.weibo.action;
  2.  
  3. import java.io.IOException;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. import com.weibo.dao.WzDao;
  11.  
  12. /**
  13. * Servlet implementation class Del
  14. */
  15. @WebServlet("/Del")
  16. public class Del extends HttpServlet {
  17. private static final long serialVersionUID = 1L;
  18.  
  19. /**
  20. * @see HttpServlet#HttpServlet()
  21. */
  22. public Del() {
  23. super();
  24. // TODO Auto-generated constructor stub
  25. }
  26.  
  27. /**
  28. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  29. */
  30. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  31. //取得客户端名为id的参数转成int
  32. int id=Integer.parseInt(request.getParameter("id"));
  33.  
  34. //执行删除
  35. WzDao dao=new WzDao();
  36. dao.del(id);
  37.  
  38. //跳转到首页
  39. response.sendRedirect("index.jsp");
  40. }
  41.  
  42. }

WzDao.java

  1. package com.weibo.dao;
  2.  
  3. import java.util.List;
  4. import com.weibo.bean.Wz;
  5.  
  6. /**
  7. * 文章服务
  8. * 数据访问
  9. *
  10. */
  11. public class WzDao {
  12.  
  13. /**获得所有的文章信息*/
  14. public List<Wz> all(){
  15. return JDBCUtils.queryForList("select bh,bt,nr from wz", Wz.class);
  16. }
  17.  
  18. /**新增文章*/
  19. public int add(String bt,String nr){
  20. return JDBCUtils.update("insert into wz(bt,nr) values(?,?)", bt,nr);
  21. }
  22.  
  23. /**删除文章*/
  24. public int del(int bh){
  25. return JDBCUtils.update("delete from wz where bh=?", bh);
  26. }
  27.  
  28. }

运行效果:

9.9、编辑

9.10、移动端

示例下载:http://files.cnblogs.com/files/best/Weibo_m.zip

9.11、详细

9.12、添加

示例下载:http://files.cnblogs.com/files/best/Weibo_3.zip

9.13、内部测试

题目:智能电子书管理系统(libs)

要求:请使用JavaEE实现一个智能电子书管理系统,智能电子书的属性主要包含:标题(title)、页数(page)、类型(booktype),系统可以选择科学、人文、宗教、经济、法律。
步骤与得分:

1、创建数据库libs与表books,添加5行以上的数据,导出sql脚本。10分

2、创建动态Java Web项目,添加数据库驱动程序。10分

3、实现智能电子书展示功能,index.jsp。20分

4、实现智能电子书添加功能,new.jsp。10分

5、实现智能电子书删除功能。10分

6、实现智能电子书编辑功能,edit.jsp。20分

7、实现智能电子书详细功能,details.jsp。10分

8、实现手机端展示功能,m.jsp。5分

9、实现手机端详细功能,d.jsp。5分

10、实现手机端添加功能,a.jsp。5分

11、实现手机端编辑功能,e.jsp。5分

提交:不提交,利用两周时间完成,28号将统一检查打分,作为平时成绩。

面向对象4、5章示例下载

JavaEE学习总结(十四)— 人工智能微博的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. Linux学习之十四、管线命令

    Linux学习之十四.管线命令 地址:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash_6.php

  3. 风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击

    风炫安全WEB安全学习第二十四节课 利用XSS钓鱼攻击 XSS钓鱼攻击 HTTP Basic Authentication认证 大家在登录网站的时候,大部分时候是通过一个表单提交登录信息. 但是有时候 ...

  4. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  5. Spring学习记录(十四)---JDBC基本操作

    先看一些定义: 在Spring JDBC模块中,所有的类可以被分到四个单独的包:1.core即核心包,它包含了JDBC的核心功能.此包内有很多重要的类,包括:JdbcTemplate类.SimpleJ ...

  6. javascript基础学习(十四)

    javascript之表单对象 学习要点: 表单对象 文本框 按钮 单选框和复选框 一.表单对象 在HTML文档中可能会出现多个表单,也就是说,一个HTML文档中可能出现多个<form>标 ...

  7. JMeter学习(十四)JMeter函数学习(转载)

    转载自 http://www.cnblogs.com/yangxia-test JMeter函数是一些能够转化在测试树中取样器或者其他配置元件的域的特殊值.一个函数的调用就像这样:${_functio ...

  8. Python3.5 学习二十四

    本节课程大纲: -------------------------------------------------------------------------------------------- ...

  9. Java第三阶段学习(十四、JSP动态页面、EL表达式、JSTL标签库)

    一.JSP技术 1.jsp脚本和注释 jap脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部,比如写在doget.dopost 内的代码 2) ...

  10. JAVA学习第十四课(接口:implements及其基本应用)

    接口: 我们知道抽象类中能够定义抽象方法,也能够定义非抽象方法.当一个抽象类中的方法都是抽象方法的时候,我们就能够定义还有一种表现方式:接口(interface),所以接口是一种特殊的抽象类 接口的出 ...

随机推荐

  1. 去掉ambiguous expansion of macro警告

    查看原文:http://www.heyuan110.com/?p=1221 用pod install后,pod工程里出现ambiguous expansion of macro的warning,对于有 ...

  2. git 的安装及使用

    一.Git的安装和使用 1.1 Linux下版本库的创建 1.1.1 创建一个版本库 repository,在一个合适的地方创建一个空目录: root@zengyue:/# mkdir -p /hom ...

  3. pom.xml mevan 的 配置文件

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  4. logback基本入门

    1. logback的定义 Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch.它当前分为下面下个模块: logback-core:其它 ...

  5. 使用kindeditor来替换ecshop的fckeditor编辑器,让ecshop可以批量上传图片

    老杨原创 kindeditor此编辑器可以让ecshop批量上传图片,可以插入代码,可以全屏编辑,可以插入地图.视频,进行更多word操作,设置字体. 步骤一:进入kindeditor的官网,http ...

  6. doc.update

    db.collection('todos').doc('todo-identifiant-aleatoire').update({ // data 传入需要局部更新的数据 data: { // 表示将 ...

  7. k8s 1.9 安装

    测试环境 主机 系统 master CentOS 7.3 node CentOS 7.3 2.关闭selinux(所有节点都执行) [root@matser ~]# getenforce Disabl ...

  8. PostgreSQL、SQL Server数据库中的数据类型的映射关系

    PostgreSQL 8.1 轰动发布,我也打算将原来使用 SQL Server 的一些应用迁移到 PostgreSQL 上,首先需要迁移的是表,那么这就必须要先搞清楚这两个数据库中的数据类型的映射关 ...

  9. js語句

    js語句就是告訴瀏覽器要做什麼: js代碼就是js語句序列: js代碼塊就是{}包括的,函數就是一個代碼塊的典型例子: js注釋:單行注釋://,多行注釋:/**/ js對大小寫敏感: js語句可以不 ...

  10. SpringMVC @SessionAttributes 使用

    @SessionAttributes 只能作用在类上,作用是将指定的Model中的键值对添加至session中,方便在下一次请求中使用. 简单示例 目标是通过 @SessionAttributes 注 ...