分层实现新闻管理系统

1.创建新闻信息实体类,jdbc配置文件以及工具类

  1. public class News { // 新闻信息的实体类
  2.  
  3. private Integer id; //编号
  4. private String categoryId;
  5. private String title; //标题
  6. private String summary;
  7. private String content; //内容
  8. private String picPath;
  9. private String author;
  10. private Date createDate; //创建时间
  11. private Date modifyDate; //修改时间
  12.  
  13. @Override
  14. public String toString() {
  15. return "News [id=" + id + ", categoryId=" + categoryId + ", title="
  16. + title + ", summary=" + summary + ", content=" + content
  17. + ", picPath=" + picPath + ", author=" + author
  18. + ", createDate=" + createDate + ", modifyDate=" + modifyDate
  19. + "]";
  20. }
  21.  
  22. public Integer getId() {
  23. return id;
  24. }
  25.  
  26. public void setId(Integer id) {
  27. this.id = id;
  28. }
  29.  
  30. public String getCategoryId() {
  31. return categoryId;
  32. }
  33. public void setCategoryId(String categoryId) {
  34. this.categoryId = categoryId;
  35. }
  36. public String getTitle() {
  37. return title;
  38. }
  39. public void setTitle(String title) {
  40. this.title = title;
  41. }
  42. public String getSummary() {
  43. return summary;
  44. }
  45. public void setSummary(String summary) {
  46. this.summary = summary;
  47. }
  48. public String getContent() {
  49. return content;
  50. }
  51. public void setContent(String content) {
  52. this.content = content;
  53. }
  54. public String getPicPath() {
  55. return picPath;
  56. }
  57. public void setPicPath(String picPath) {
  58. this.picPath = picPath;
  59. }
  60. public String getAuthor() {
  61. return author;
  62. }
  63. public void setAuthor(String author) {
  64. this.author = author;
  65. }
  66. public Date getCreateDate() {
  67. return createDate;
  68. }
  69. public void setCreateDate(Date createDate) {
  70. this.createDate = createDate;
  71. }
  72. public Date getModifyDate() {
  73. return modifyDate;
  74. }
  75. public void setModifyDate(Date modifyDate) {
  76. this.modifyDate = modifyDate;
  77. }
  78.  
  79. }

新闻信息的实体类

  1. //通用的工具类
  2. public class BaseDao {
  3. //jdbc 需要的API 创建出来
  4. protected Connection con; //连接对象
  5. protected PreparedStatement ps; //执行sql 防止sql注入
  6. protected ResultSet rs; //查询的返回结果集
  7.  
  8. //01.开启连接
  9. public boolean getConnection(){
  10. //读取配置文件
  11. String url=ConfigManager.getInstance().getValue("url");
  12. String user=ConfigManager.getInstance().getValue("userName");
  13. String password=ConfigManager.getInstance().getValue("password");
  14. String driver=ConfigManager.getInstance().getValue("driverClass");
  15. try {
  16. Class.forName(driver); //加载驱动
  17. con=DriverManager.getConnection(url,user,password); //创建连接
  18. } catch (ClassNotFoundException e) {
  19. e.printStackTrace();
  20. return false;
  21. } catch (SQLException e) {
  22. e.printStackTrace();
  23. return false;
  24. }
  25. return true;
  26. }
  27.  
  28. //02.关闭连接
  29. public boolean closeConnection(){
  30. //如果对象都没有创建 就没法关闭 所以 要非空判断
  31. if (rs!=null) {
  32. try {
  33. rs.close();
  34. } catch (SQLException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. if (ps!=null) {
  39. try {
  40. ps.close();
  41. } catch (SQLException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. if (con!=null) {
  46. try {
  47. con.close();
  48. } catch (SQLException e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. return true;
  53. }
  54.  
  55. /*
  56. * 03.增删改 executeUpdate
  57. *
  58. * delete from user where name='小黑' and name='小白'
  59. *
  60. * Object ... o
  61. * 参数类型是数组类型的!在作为参数的时候 参数个数 可以为0和任意多个
  62. */
  63. public int executeUpdate(String sql,Object... params){
  64. int updateRow=0;
  65. if (getConnection()) { //如果有连接进行操作
  66. try {
  67. ps=con.prepareStatement(sql);
  68. //你在传sql语句的时候 有参数 就给参数赋值
  69. for (int i = 0; i < params.length; i++) {
  70. ps.setObject(i+1, params[i]);
  71. }
  72. //执行sql语句
  73. updateRow=ps.executeUpdate();
  74. } catch (SQLException e) {
  75. e.printStackTrace();
  76. }finally{
  77. closeConnection();
  78. }
  79. }
  80. return updateRow;
  81. }
  82.  
  83. //04.查询 select * from user where id=1
  84. public ResultSet executeQuery(String sql,Object... params){
  85. if (getConnection()) { //如果有连接进行操作
  86. try {
  87. ps=con.prepareStatement(sql);
  88. //你在传sql语句的时候 有参数 就给参数赋值
  89. for (int i = 0; i < params.length; i++) {
  90. ps.setObject(i+1, params[i]);
  91. }
  92. //执行sql语句
  93. rs=ps.executeQuery();
  94. } catch (SQLException e) {
  95. e.printStackTrace();
  96. }
  97. }
  98. return rs;
  99. }
  100.  
  101. }

BaseDao

  1. url=jdbc\:mysql\://localhost\:3306/对应的数据库
  2. userName=用户名
  3. password=密码
  4. driverClass=com.mysql.jdbc.Driver

jdbc.properties配置文件

  1. //单例 读取配置文件的工具类
  2. public class ConfigManager {
  3. //01.创建静态的自身对象
  4. private static ConfigManager manager=new ConfigManager();
  5. //我们读取的配置文件需要的类
  6. private static Properties properties;
  7.  
  8. //02.构造私有化
  9. private ConfigManager(){
  10. String path="jdbc.properties";
  11. properties=new Properties();
  12. //获取流
  13. InputStream stream =
  14. ConfigManager.class.getClassLoader().getResourceAsStream(path);
  15. try {
  16. properties.load(stream); //读取配置文件
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }finally{
  20. try {
  21. stream.close();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. }
  27. //03.提供外部访问的接口
  28. public static synchronized ConfigManager getInstance(){
  29. return manager;
  30. }
  31.  
  32. //提供一个获取配置文件 value的方法
  33. public static String getValue(String key){
  34. return properties.getProperty(key);
  35. }
  36.  
  37. }

DriverManager工具类

2.创建新闻增删改查功能的接口

  1. public interface NewsDao { //新闻功能的接口
  2. //查询所有的新闻信息
  3. List<News> getAllNews();
  4.  
  5. //新增新闻
  6. int addNews(News news);
  7.  
  8. //修改新闻
  9. int updateNews(News news);
  10.  
  11. //删除新闻
  12. int deleteNews(News news);
  13.  
  14. //根据ID查询指定的新闻信息
  15. News findById(String id);
  16. }

NewsDao

3.创建Dao层的实现类

  1. //新闻功能的实现类 继承BaseDao 实现 NewsDao
  2. public class NewsDaoImpl extends BaseDao implements NewsDao {
  3.  
  4. //获取所有新闻信息
  5. @Override
  6. public List<News> getAllNews() {
  7. getConnection();//获取连接
  8. String sql="select * from news_detail";
  9. rs=executeQuery(sql);
  10. //创建一个集合用来存贮新闻信息
  11. List<News> list=new ArrayList<News>();
  12. try {
  13. while(rs.next()){
  14. News news=new News();
  15. //给新闻对象赋值
  16. news.setId(rs.getInt("id"));
  17. news.setTitle(rs.getString("title"));
  18. news.setContent(rs.getString("content"));
  19. news.setCreateDate(rs.getTimestamp("createDate"));
  20. news.setAuthor(rs.getString("author"));
  21. news.setCategoryId(rs.getString("categoryId"));
  22. news.setModifyDate(rs.getTimestamp("modifyDate"));
  23. news.setSummary(rs.getString("summary"));
  24. //把新闻放入集合
  25. list.add(news);
  26. }
  27. } catch (SQLException e) {
  28. e.printStackTrace();
  29. }finally{
  30. closeConnection();
  31. }
  32. return list;
  33. }
  34.  
  35. //新增新闻
  36. @Override
  37. public int addNews(News news) {
  38. getConnection();
  39. String sql="insert into news_detail(id,title,content,createDate) " +
  40. " values(?,?,?,?)";
  41. Object [] params={news.getId(),news.getTitle(),news.getContent(),news.getCreateDate()};
  42. int num=executeUpdate(sql, params);
  43. return num;
  44. }
  45.  
  46. //修改新闻
  47. @Override
  48. public int updateNews(News news) {
  49. getConnection();
  50. String sql="update news_detail set title=? where id=?";
  51. Object [] params={news.getTitle(),news.getId()};
  52. int num=executeUpdate(sql, params);
  53. return num;
  54. }
  55.  
  56. //删除新闻
  57. @Override
  58. public int deleteNews(News news) {
  59. getConnection();
  60. String sql="delete from news_detail where id=?";
  61. Object [] params={news.getId()};
  62. int num=executeUpdate(sql, params);
  63. return num;
  64. }
  65.  
  66. //查询指定的新闻信息
  67. @Override
  68. public News findById(String id) {
  69. getConnection();
  70. String sql="select * from news_detail where id=?";
  71. Object [] params={id};
  72. rs=executeQuery(sql, params);
  73. News news=null;
  74. try {
  75. if (rs.next()) {
  76. news=new News();
  77. //给新闻对象赋值
  78. news.setId(rs.getInt("id"));
  79. news.setTitle(rs.getString("title"));
  80. news.setContent(rs.getString("content"));
  81. news.setCreateDate(rs.getTimestamp("createDate"));
  82. news.setAuthor(rs.getString("author"));
  83. news.setCategoryId(rs.getString("categoryId"));
  84. news.setModifyDate(rs.getTimestamp("modifyDate"));
  85. news.setSummary(rs.getString("summary"));
  86. }
  87. } catch (SQLException e) {
  88. e.printStackTrace();
  89. }
  90. return news;
  91. }
  92.  
  93. }

NewsDaoImpl

4.创建业务逻辑层的接口

  1. public interface NewsService { //新闻的业务逻辑层
  2. //查询所有的新闻信息
  3. List<News> getAllNews();
  4.  
  5. //新增新闻
  6. void addNews(News news);
  7.  
  8. //修改新闻
  9. void updateNews(News news);
  10.  
  11. //删除新闻
  12. void deleteNews(News news);
  13. //根据ID查询指定的新闻信息
  14. News findById(String id);
  15. }

NewsService

5.创建业务逻辑层的实现类

  1. public class NewsServiceImpl implements NewsService {
  2.  
  3. // 在不改变dao层代码的前提下,对dao层的方法进行一个逻辑操作/增强!
  4. private NewsDao dao = new NewsDaoImpl();
  5.  
  6. //查询所有的新闻信息
  7. @Override
  8. public List<News> getAllNews() {
  9. return dao.getAllNews();
  10. }
  11.  
  12. // 新增新闻
  13. @Override
  14. public void addNews(News news) {
  15. int num = dao.addNews(news);
  16. if (num > 0) {
  17. System.out.println("新增成功");
  18. } else {
  19. System.out.println("新增失败");
  20. }
  21. }
  22.  
  23. //修改新闻
  24. @Override
  25. public void updateNews(News news) {
  26. int num = dao.updateNews(news);
  27. if (num > 0) {
  28. System.out.println("更新成功");
  29. } else {
  30. System.out.println("更新失败");
  31. }
  32. }
  33.  
  34. //删除新闻
  35. @Override
  36. public void deleteNews(News news) {
  37. int num = dao.deleteNews(news);
  38. if (num > 0) {
  39. System.out.println("删除成功");
  40. } else {
  41. System.out.println("删除失败");
  42. }
  43. }
  44.  
  45. //查询指定的新闻信息
  46. @Override
  47. public News findById(String id) {
  48. return dao.findById(id);
  49. }
  50.  
  51. }

NewsServiceImpl

6.创建测试类

  1. public class NewsTest {
  2. //查询所有新闻
  3. @Test
  4. public void test01(){
  5. NewsService service=new NewsServiceImpl();
  6. List<News> list = service.getAllNews();
  7. for (News news : list) {
  8. System.out.println(news);
  9. }
  10. }
  11.  
  12. //新增新闻
  13. @Test
  14. public void test02(){
  15. NewsService service=new NewsServiceImpl();
  16. News news=new News();
  17. news.setId(5);
  18. news.setTitle("新闻5");
  19. news.setContent("内容5");
  20. news.setCreateDate(new Date());
  21. service.addNews(news);
  22. }
  23.  
  24. //修改新闻
  25. @Test
  26. public void test03(){
  27. NewsService service=new NewsServiceImpl();
  28. News news=new News();
  29. news.setId(1);
  30. news.setTitle("新闻5");
  31. service.updateNews(news);
  32. }
  33.  
  34. //删除新闻
  35. @Test
  36. public void test04(){
  37. NewsService service=new NewsServiceImpl();
  38. News news=new News();
  39. news.setId(5);
  40. service.deleteNews(news);
  41. }
  42. //查询指定的新闻
  43. @Test
  44. public void test05(){
  45. NewsService service=new NewsServiceImpl();
  46. News news = service.findById("1");
  47. System.out.println(news);
  48. }
  49.  
  50. }

测试类代码

7.总结以及任务

  1. /*连接数据库出现异常信息 try to repair it
  2.  
  3. 在数据库中 使用repair table 表名 即可!
  4.  
  5. 分层开发: 前提已经有了 对应的数据库
  6. 1.jdbc.properties 配置文件
  7. 连接数据库的4要素
  8. 01.url
  9. 02.驱动
  10. 03.用户名
  11. 04.密码
  12. 2.创建DriverManager 单例的方式 来读取 配置文件
  13.  
  14. 3.书写了BaseDao 开启 关闭 连接 增删改查 通用操作
  15.  
  16. 4.创建对应的实体类 News
  17.  
  18. 5.创建数据访问层的接口 NewsDao
  19.  
  20. 6. 创建数据访问层的实现类 要继承BaseDao 因为BaseDao中有我需要的获取连接 以及增删改查操作
  21. 实现NewsDao接口
  22.  
  23. 7.创建业务逻辑层的接口 NewsService 目前 因为没有很复杂的逻辑,所以看的时候 感觉
  24. NewsService 和 NewsDao代码一致
  25.  
  26. 8.创建业务逻辑层的实现类 NewsServiceImpl
  27. 类中创建了 NewsDao的实例 ,调用dao层的方法
  28.  
  29. 9.书写测试类
  30.  
  31. 任务
  32.  
  33. 01.数据库
  34. 创建一个数据库 School
  35. 创建一个表Student
  36. 字段
  37. id int
  38. name varchar
  39. age int
  40. birthday date
  41. 至少5条测试数据
  42.  
  43. 02.java代码实现的功能
  44. 001.查询所有学生信息
  45. 002.根据ID查询指定学生的信息
  46. 003.修改指定学生的信息
  47. 004.删除指定学生
  48. */

总结以及任务部分

8.把后台的数据拿到前台的jsp页面

  1. <%@page import="cn.bdqn.bean.News"%>
  2. <%@page import="cn.bdqn.service.impl.NewsServiceImpl"%>
  3. <%@page import="cn.bdqn.service.NewsService"%>
  4. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  5.  
  6. <%
  7. String path = request.getContextPath();
  8. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  9. %>
  10.  
  11. <!DOCTYPE HTML>
  12. <html>
  13. <head>
  14. <base href="<%=basePath%>">
  15.  
  16. <title>My JSP 'index.jsp' starting page</title>
  17. <meta http-equiv="pragma" content="no-cache">
  18. <meta http-equiv="cache-control" content="no-cache">
  19. <meta http-equiv="expires" content="0">
  20. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  21. <meta http-equiv="description" content="This is my page">
  22. <style type="text/css">
  23. <%-- 表格中的数据 居中显示 --%>
  24. td{
  25. text-align: center;
  26. }
  27. </style>
  28. </head>
  29.  
  30. <body>
  31.  
  32. <h1>显示新闻信息</h1>
  33. <table border="1">
  34. <tr>
  35. <td>新闻编号</td>
  36. <td>新闻标题</td>
  37. <td>新闻作者</td>
  38. <td>创建时间</td>
  39. </tr>
  40.  
  41. <jsp:useBean id="service" class="cn.bdqn.service.impl.NewsServiceImpl"/>
  42. <%
  43. //NewsService service=new NewsServiceImpl();
  44. List<News> news= service.getAllNews();
  45. for(News n:news){
  46. %>
  47. <tr>
  48. <td><%=n.getId()%></td>
  49. <td><%=n.getTitle()%></td>
  50. <td><%=n.getAuthor()%></td>
  51. <td><%=n.getCreateDate()%></td>
  52. </tr>
  53. <% }%>
  54. </table>
  55. </body>
  56. </html>

newsList.jsp

9.分页

mysql的分页

SELECT * FROM news_detail  LIMIT 0,2   从第一条数据开始,每页显示2条数据

SELECT * FROM news_detail  LIMIT 1,2   从第二条数据开始,每页显示2条数据

SELECT * FROM news_detail  LIMIT 2,2   从第三条数据开始,每页显示2条数据

pageIndex====当前页

pageSize=====每页显示几条数据

totalPageCount===总页数

totalCountSize===总记录数   数据库中 一共有多少条(行)数据

问题?

现在我们写是 新闻管理系统!  需要分页显示!

之后写的别的项目  超市管理系统! 需要分页不???

都有分页的需求!

写一个分页的工具类!分页的工具类写什么???就写分页的四要素!

  1. public class PageUtil { //分页的工具类
  2.  
  3. private Integer pageIndex=1;// 当前页
  4. private Integer pageSize=0;// 每页显示几条数据
  5. private Integer totalPageCount=1;// 总页数
  6. private Integer totalCountSize=0;// 总记录数
  7.  
  8. // set 赋值操作
  9. public void setPageIndex(Integer pageIndex) {
  10. this.pageIndex = pageIndex;
  11. }
  12. public void setPageSize(Integer pageSize) {
  13. this.pageSize = pageSize;
  14. }
  15.  
  16. public void setTotalPageCount(Integer totalPageCount) {
  17. this.totalPageCount = totalPageCount;
  18. }
  19. /*
  20. * 只要我们知道了 总记录数 总页数就可以计算了!
  21. * 我们如果按照 下面的方式 进行书写
  22. * 那么 必须先给 总记录数 赋值
  23. * 之后才能取总页数的值
  24. */
  25. public void setTotalCountSize(Integer totalCountSize) {
  26. if (totalCountSize>0) { //如果大于0 可以分页
  27. this.totalCountSize = totalCountSize;
  28. //计算总页数?? 总记录数%页大小==0?(总记录数/页大小):(总记录数/页大小+1)
  29. totalPageCount=
  30. (totalCountSize%pageSize==0)?(totalCountSize/pageSize):(totalCountSize/pageSize+1);
  31. }
  32. }
  33.  
  34. // get方法
  35. public Integer getPageIndex() {
  36. return pageIndex;
  37. }
  38. public Integer getPageSize() {
  39. return pageSize;
  40. }
  41. public Integer getTotalPageCount() {
  42. return totalPageCount;
  43. }
  44. public Integer getTotalCountSize() {
  45. return totalCountSize;
  46. }
  47.  
  48. }

PageUtil工具类

10.在对应的类或接口中增加方法

  1. /**
  2. * 分页查询 所有的新闻信息 但是 前提 必须要获取 新闻信息的总记录数
  3. * @param pageIndex 当前的页码
  4. * @param pageSize 每页显示的条数
  5. * @return 分页显示的所有新闻列表
  6. */
  7. List<News> getNewsByPageList(int pageIndex,int pageSize);
  8.  
  9. //获取新闻的总记录数
  10. int getTotalCountSize();

NewsDao

  1. //查询总记录数
  2. public int getTotalCountSize() {
  3. getConnection();
  4. String sql="select count(*) as count from news_detail";
  5. rs=executeQuery(sql);
  6. //定义变量 来接收 返回的 总记录数
  7. int totalCountSize=0;
  8. try {
  9. if (rs.next()) {
  10. totalCountSize=rs.getInt("count");
  11. }
  12. } catch (SQLException e) {
  13. e.printStackTrace();
  14. }finally{
  15. closeConnection();
  16. }
  17. return totalCountSize;
  18. }
  19.  
  20. //分页查询
  21. public List<News> getNewsByPageList(int pageIndex, int pageSize) {
  22. //既然返回一个集合 我就创建一个news的泛型集合
  23. ArrayList <News> list=new ArrayList<News>();
  24. /*
  25. *
  26. * 用户输入的页码pageIndex 转化成第几条给数据库查询
  27. * 1 0
  28. * 2 1
  29. * 3 2
  30. * 用户传1 我们变成0 代表从第一条数据开始
  31. * 用户传2 我们变成2 代表从第三条数据开始
  32. *
  33. * 我们想给数据库的值=(用户输入的页码-1)*每页显示的数量
  34. * pageIndex=(pageIndex-1)*pageSize
  35. */
  36. String sql="select * from news_detail limit ?,?";
  37. pageIndex=(pageIndex-1)*pageSize;
  38. Object [] params={pageIndex,pageSize};
  39. rs=executeQuery(sql, params);
  40. try {
  41. while(rs.next()){
  42. News news=new News();
  43. news.setId(rs.getInt("id"));
  44. news.setTitle(rs.getString("title"));
  45. news.setAuthor(rs.getString("author"));
  46. news.setCreateDate(rs.getTimestamp("createDate"));
  47. //向集合中增加数据
  48. list.add(news);
  49. }
  50. } catch (SQLException e) {
  51. e.printStackTrace();
  52. }finally{
  53. closeConnection();
  54. }
  55. return list;
  56. }

NewsDaoImpl

  1. /**
  2. * 分页查询 所有的新闻信息 但是 前提 必须要获取 新闻信息的总记录数
  3. * @param pageIndex 当前的页码
  4. * @param pageSize 每页显示的条数
  5. * @return 分页显示的所有新闻列表
  6. */
  7. List<News> getNewsByPageList(int pageIndex,int pageSize);
  8.  
  9. //获取新闻的总记录数
  10. int getTotalCountSize();

NewsService

  1. // 返回总记录数
  2. public int getTotalCountSize() {
  3. return dao.getTotalCountSize();
  4. }
  5.  
  6. // 分页
  7. public List<News> getNewsByPageList(int pageIndex, int pageSize) {
  8. return dao.getNewsByPageList(pageIndex, pageSize);
  9. }

NewsServiceImpl

11.书写测试类

  1. //查询 总记录数
  2. @Test
  3. public void test06(){
  4. NewsService service=new NewsServiceImpl();
  5. System.out.println("总记录数:"+service.getTotalCountSize());
  6. }
  7.  
  8. //分页查询
  9. @Test
  10. public void test07(){
  11. NewsService service=new NewsServiceImpl();
  12. //这是查询第一个的数据 每页显示三条
  13. List<News> list = service.getNewsByPageList(1, 3);
  14. for (News news : list) {
  15. System.out.println(news);
  16. }
  17. }

测试类方法

12.把分页内容显示到jsp页面中

  1. <%@page import="cn.bdqn.bean.News"%>
  2. <%@page import="cn.bdqn.service.impl.NewsServiceImpl"%>
  3. <%@page import="cn.bdqn.service.NewsService"%>
  4. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  5.  
  6. <%
  7. String path = request.getContextPath();
  8. String basePath = request.getScheme() + "://"
  9. + request.getServerName() + ":" + request.getServerPort()
  10. + path + "/";
  11. %>
  12.  
  13. <!DOCTYPE HTML>
  14. <html>
  15. <head>
  16. <base href="<%=basePath%>">
  17.  
  18. <title>My JSP 'index.jsp' starting page</title>
  19. <meta http-equiv="pragma" content="no-cache">
  20. <meta http-equiv="cache-control" content="no-cache">
  21. <meta http-equiv="expires" content="0">
  22. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  23. <meta http-equiv="description" content="This is my page">
  24. <style type="text/css">
  25. <%--
  26. 表格中的数据 居中显示 --%> td {
  27. text-align: center;
  28. }
  29. </style>
  30. </head>
  31. <%-- 需要引入了 外部javaBean --%>
  32. <jsp:useBean id="service" class="cn.bdqn.service.impl.NewsServiceImpl" />
  33. <jsp:useBean id="pageUtil" class="cn.bdqn.util.PageUtil" />
  34. <body>
  35.  
  36. <h1>显示新闻信息</h1>
  37. <table border="1">
  38. <tr>
  39. <td>新闻编号</td>
  40. <td>新闻标题</td>
  41. <td>新闻作者</td>
  42. <td>创建时间</td>
  43. </tr>
  44.  
  45. <%
  46. //获取分页的四要素
  47. int pageSize = 2; //页大小
  48. int pageIndex = 1; //当前页面
  49. String num = request.getParameter("pageIndex");//获取pageIndex
  50. if (num != null && num != "") { //因为第一次打开页面的时候 请求中 压根没有 pageIndex的属性
  51. pageIndex = Integer.parseInt(num);
  52. } else {
  53. pageIndex = 1;
  54. }
  55. //给通用的工具类 赋值
  56. pageUtil.setPageIndex(pageIndex);
  57. pageUtil.setPageSize(pageSize);
  58. pageUtil.setTotalCountSize(service.getTotalCountSize()); //总记录数
  59. pageUtil.getTotalPageCount(); //获取总页数
  60.  
  61. List<News> news = service.getNewsByPageList(pageIndex, pageSize);
  62. for (News n : news) {
  63. %>
  64. <tr>
  65. <td><%=n.getId()%></td>
  66. <td><%=n.getTitle()%></td>
  67. <td><%=n.getAuthor()%></td>
  68. <td><%=n.getCreateDate()%></td>
  69. </tr>
  70. <%
  71. }
  72. %>
  73.  
  74. <tr>
  75. <td>当前页:<%=pageUtil.getPageIndex()%></td>
  76. <td>总页数:<%=pageUtil.getTotalPageCount()%></td>
  77. <td>总记录数<%=pageUtil.getTotalCountSize()%></td>
  78. </tr>
  79.  
  80. <tr>
  81. <td><a href="newsList.jsp?pageIndex=1">首页</a>
  82. </td>
  83. <td><a
  84. href="newsList.jsp?pageIndex=<%=pageUtil.getPageIndex() - 1%>">上一页</a>
  85. </td>
  86. <td><a
  87. href="newsList.jsp?pageIndex=<%=pageUtil.getPageIndex() + 1%>">下一页</a>
  88. </td>
  89. <td><a
  90. href="newsList.jsp?pageIndex=<%=pageUtil.getTotalPageCount()%>">最后一页</a>
  91. </td>
  92. </tr>
  93.  
  94. </table>
  95. </body>
  96. </html>

修改后的NewsList.jsp页面

效果图

13.现在 需要 用户登录!用户名密码输入成功才能进入新闻显示界面

01.需要创建一个登录界面

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6.  
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11.  
  12. <title>新闻信息的登录界面</title>
  13.  
  14. <meta http-equiv="pragma" content="no-cache">
  15. <meta http-equiv="cache-control" content="no-cache">
  16. <meta http-equiv="expires" content="0">
  17. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  18. <meta http-equiv="description" content="This is my page">
  19. <!--
  20. <link rel="stylesheet" type="text/css" href="styles.css">
  21. -->
  22.  
  23. </head>
  24.  
  25. <body>
  26. <h1>登录界面</h1>
  27. <form action="doMain.jsp" method="post">
  28. <table>
  29. <tr>
  30. <td>用户名:</td>
  31. <td><input type="text" name="userName"/></td>
  32. </tr>
  33. <tr>
  34. <td>密码:</td>
  35. <td><input type="password" name="password"/></td>
  36. </tr>
  37. <tr>
  38. <td></td>
  39. <td><input type="submit" value="登录"/></td>
  40. </tr>
  41. </table>
  42. </form>
  43. </body>
  44. </html>

login.jsp

  1. public interface UserDao { //用户接口
  2.  
  3. //验证用户名和密码
  4. boolean login(User user);
  5.  
  6. }

UserDao

  1. public class UserDaoImpl extends BaseDao implements UserDao {
  2.  
  3. //验证用户登录
  4. public boolean login(User user) {
  5. getConnection();
  6. String sql="select * from news_user where userName=? and password=?";
  7. Object [] params={user.getUserName(),user.getPassword()};
  8. rs=executeQuery(sql, params);
  9. try {
  10. if (rs.next()) { //如果找到了匹配的用户
  11. return true;
  12. }
  13. } catch (SQLException e) {
  14. e.printStackTrace();
  15. }finally{
  16. closeConnection();
  17. }
  18. return false;
  19. }
  20.  
  21. }

UserDaoImpl

  1. public interface UserService {
  2.  
  3. //登录
  4. boolean login(User user);
  5. }

UserService

  1. public class UserServiceImpl implements UserService {
  2.  
  3. private UserDao dao=new UserDaoImpl();
  4.  
  5. //登录
  6. public boolean login(User user) {
  7. return dao.login(user);
  8. }
  9.  
  10. public UserDao getDao() {
  11. return dao;
  12. }
  13.  
  14. public void setDao(UserDao dao) {
  15. this.dao = dao;
  16. }
  17.  
  18. }

UserServiceImpl

02.在提交的界面要获取用户信息

03.从数据库中取得数据  进行比对

04.根据结果 判断是否能进入  新闻列表界面

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6.  
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11.  
  12. <title>新闻登录信息处理</title>
  13.  
  14. <meta http-equiv="pragma" content="no-cache">
  15. <meta http-equiv="cache-control" content="no-cache">
  16. <meta http-equiv="expires" content="0">
  17. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  18. <meta http-equiv="description" content="This is my page">
  19. <!--
  20. <link rel="stylesheet" type="text/css" href="styles.css">
  21. -->
  22.  
  23. </head>
  24. <jsp:useBean id="service" class="cn.bdqn.service.impl.UserServiceImpl"/>
  25. <jsp:useBean id="user" class="cn.bdqn.bean.User"/>
  26. <body>
  27.  
  28. <%
  29. request.setCharacterEncoding("utf-8");
  30. //01.获取用户信息
  31. String userName= request.getParameter("userName");
  32. String password= request.getParameter("password");
  33. user.setPassword(password);
  34. user.setUserName(userName);
  35. //02.从数据库取值
  36. boolean flag= service.login(user);
  37. if(flag){
  38. //重定向到 新闻列表界面
  39. response.sendRedirect("newsList.jsp");
  40. }else{
  41. //重定向到 新闻登录界面
  42. response.sendRedirect("login.jsp");
  43. }
  44. %>
  45.  
  46. </body>
  47. </html>

doMain.jsp

14.创建新增新闻信息的界面  前提把需要的ckeditor文件放到WebRoot的根目录下

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6.  
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  8. <html>
  9. <head>
  10. <base href="<%=basePath%>">
  11.  
  12. <title>新闻信息新增界面</title>
  13.  
  14. <meta http-equiv="pragma" content="no-cache">
  15. <meta http-equiv="cache-control" content="no-cache">
  16. <meta http-equiv="expires" content="0">
  17. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  18. <meta http-equiv="description" content="This is my page">
  19. <!--
  20. <link rel="stylesheet" type="text/css" href="styles.css">
  21. -->
  22. <%-- 引入我们需要的 富文本 编辑器 --%>
  23. <script type="text/javascript" src="ckeditor/ckeditor.js"></script>
  24. <style type="text/css">
  25. div{
  26. height:900px;
  27. width:900px;
  28. margin:auto;
  29. padding: auto;
  30. }
  31. </style>
  32. <script type="text/javascript">
  33. <%--验证用户有没有选择 新闻类别 --%>
  34. function check(){
  35. var goryId= document.getElementById("goryId").value;
  36. if(goryId==0){
  37. alert("请选择新闻类别.....");
  38. return false;
  39. }
  40. return true;
  41. }
  42. </script>
  43.  
  44. </head>
  45. <body>
  46. <div>
  47. <h1>新闻信息新增界面</h1>
  48. <form action="realAddNews.jsp" method="post" onsubmit="return check()">
  49. <table>
  50. <tr>
  51. <td>新闻分类:</td>
  52. <td>
  53. <select name="categoryId" id="goryId">
  54. <option value="0">请选择新闻类别</option>
  55. <option value="1">国内</option>
  56. <option value="2">国际</option>
  57. <option value="3">娱乐</option>
  58. <option value="4">军事</option>
  59. <option value="5">财经</option>
  60. </select>
  61. </td>
  62. </tr>
  63. <tr>
  64. <td>新闻标题:</td>
  65. <td><input type="text" name="title"/></td>
  66. </tr>
  67. <tr>
  68. <td>新闻作者:</td>
  69. <td><input type="text" name="author"/></td>
  70. </tr>
  71.  
  72. <tr>
  73. <td>新闻摘要:</td>
  74. <td><input type="text" name="summary"/></td>
  75. </tr>
  76. <tr>
  77. <td>创建时间:</td>
  78. <td><input type="date" name="createDate"/></td>
  79. </tr>
  80. <tr>
  81. <td>新闻内容:</td>
  82. <td><textarea class="ckeditor" name="content">
  83.  
  84. </textarea>
  85. </td>
  86. </tr>
  87. <tr>
  88. <td></td>
  89. <td><input type="submit" value="新增"/></td>
  90. </tr>
  91. </table>
  92. </form>
  93. </div>
  94.  
  95. </body>
  96. </html>

addNews.jsp

效果图

15.创建处理新增请求的界面

  1. <%@page import="org.apache.commons.fileupload.FileItem"%>
  2. <%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
  3. <%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
  4. <%@page import="java.io.File"%>
  5. <%@page import="java.text.SimpleDateFormat"%>
  6. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  7. <%
  8. String path = request.getContextPath();
  9. String basePath = request.getScheme() + "://"
  10. + request.getServerName() + ":" + request.getServerPort()
  11. + path + "/";
  12. %>
  13.  
  14. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  15. <html>
  16. <head>
  17. <base href="<%=basePath%>">
  18.  
  19. <title>My JSP 'realAddNews.jsp' starting page</title>
  20.  
  21. <meta http-equiv="pragma" content="no-cache">
  22. <meta http-equiv="cache-control" content="no-cache">
  23. <meta http-equiv="expires" content="0">
  24. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  25. <meta http-equiv="description" content="This is my page">
  26. <!--
  27. <link rel="stylesheet" type="text/css" href="styles.css">
  28. -->
  29.  
  30. </head>
  31.  
  32. <jsp:useBean id="service" class="cn.bdqn.service.impl.NewsServiceImpl" />
  33. <jsp:useBean id="news" class="cn.bdqn.bean.News" />
  34. <body>
  35.  
  36. <%
  37. //解决乱码问题
  38. request.setCharacterEncoding("utf-8");
  39.  
  40. //01.文件上传到 哪里去??? 我们必须指定用户的上传位置
  41. String uploadFilePath = request.getSession().getServletContext()
  42. .getRealPath("upload/");
  43. //不确定文件是否已经存在
  44. File file = new File(uploadFilePath);
  45. if (!file.exists()) {
  46. //不存在 创建
  47. file.mkdirs();
  48. }
  49. //02.判断前台的form表单是否带有文件
  50. boolean flag = ServletFileUpload.isMultipartContent(request);
  51. if (flag) { //如果是文件上传
  52. /*
  53. 如果上传的文件比较小,则直接保存在内存中,速度快!
  54. 文件大的时候,以临时文件的形式,保存在电脑的临时文件夹中!
  55. 我们使用FileItemFactory 接口的对应 实现类 来完成 上传操作
  56. */
  57. DiskFileItemFactory factory = new DiskFileItemFactory();
  58. ServletFileUpload upload = new ServletFileUpload(factory);
  59. //能把请求中的所有元素进行获取! 返回一个FileItem的集合
  60. List<FileItem> items = upload.parseRequest(request);
  61. //获取Iterator迭代器
  62. Iterator<FileItem> iter = items.iterator();
  63. //事先给 没给元素定义一个名称
  64. String fileName = "";
  65. while (iter.hasNext()) { //遍历出每一个元素
  66. FileItem item = iter.next();
  67. if (item.isFormField()) { //如果是普通的元素
  68. fileName = item.getFieldName(); //获取普通元素的名称
  69. if (fileName.equals("title")) {
  70. news.setTitle(item.getString("utf-8"));
  71. } else if (fileName.equals("author")) {
  72. news.setAuthor(item.getString("utf-8"));
  73. } else if (fileName.equals("content")) {
  74. news.setContent(item.getString("utf-8"));
  75. } else if (fileName.equals("summary")) {
  76. news.setSummary(item.getString("utf-8"));
  77. } else if (fileName.equals("createDate")) {
  78. news.setCreateDate(new SimpleDateFormat(
  79. "yyyy-MM-dd").parse(item.getString("utf-8")));
  80. } else if (fileName.equals("categoryId")) {
  81. news.setCategoryId(Integer.parseInt(item
  82. .getString("utf-8")));
  83. }
  84. } else { //操作上传的文件
  85. String fimeName = item.getName(); //获取上传文件的名称
  86. if (fimeName != null && fimeName != "") {
  87. File fullFile = new File(fimeName);
  88. //相当于在uploadFilePath 这个文件下面 创建一个文件fullFile.getName()
  89. File saveFile = new File(uploadFilePath,
  90. fullFile.getName());
  91. //写入 真正的上传
  92. item.write(saveFile);
  93. news.setPicPath(fullFile.getName()); //给news的文件路径赋值
  94. }
  95. }
  96. }
  97. }
  98. service.addNews(news); //调用底层代码 进行新增操作
  99. //新增成功了之后 需要返回到新闻列表界面 转发 会引起 表单的重复提交
  100. //request.getRequestDispatcher("newsList.jsp").forward(request, response);
  101. //重定向
  102. response.sendRedirect("newsList.jsp");
  103. %>
  104.  
  105. <%--
  106. <% 没有文件上传的 处理
  107. //解决乱码问题
  108. request.setCharacterEncoding("utf-8");
  109. //获取用户输入的新闻信息
  110. String title= request.getParameter("title");
  111. String author= request.getParameter("author");
  112. String summary= request.getParameter("summary");
  113. String content= request.getParameter("content");
  114. String createDate= request.getParameter("createDate");
  115. String categoryId= request.getParameter("categoryId");
  116. news.setTitle(title);
  117. news.setAuthor(author);
  118. news.setContent(content);
  119. news.setSummary(summary);
  120. news.setCategoryId(Integer.parseInt(categoryId));
  121. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  122. news.setCreateDate(sdf.parse(createDate));
  123. //调用后台新增新闻的方法
  124. service.addNews(news);
  125. //新增成功了之后 需要返回到新闻列表界面
  126. request.getRequestDispatcher("newsList.jsp").forward(request, response);
  127. %> --%>
  128.  
  129. </body>
  130. </html>

realAddNews.jsp

jdbc02的更多相关文章

  1. JDBC02 利用JDBC连接数据库【使用数据库连接池】

    目录 1/2/3  Statement 和 Preparedstatement 的区别 4 读取properties配置文件 5 数据库连接池 6 利用数据库连接池连接数据库 1 使用Statemen ...

  2. JDBC02 加载JDBC驱动 建立连接

    JDBC(Java Database Connection)为Java开发者使用数据库提供了统一的编程接口 sun公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库,因此su ...

  3. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. http协议/获得请求/中文参数处理/访问数据库

    # 1. http协议(了解)## (1)什么是http协议?一种网络应用层协议,规定了浏览器与web服务器之间如何通信以及相应的的数据包的结构.注:tcp/ip协议:保证数据可靠的传递.(UDP不可 ...

  5. ResultSet详解(转)

      ResultSet用法集锦 结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成 ...

  6. java_JDBC,连接数据库方式,RestSet结果集,Statement,PreparedStatement,事务,批处理,数据库连接池(c3p0和Druid)、Apache-DBUtils、

    一.JDBC的概述 1.JDBC为访问不同的数据薛是供了统一的接口,为使用者屏蔽了细节问题.2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作 ...

随机推荐

  1. The ultimate jQuery Plugin List(终极jQuery插件列表)

    下面的文章可能出自一位奥地利的作者,  列出很多jQuery的插件.类似的网站:http://jquerylist.com/原文地址: http://www.kollermedia.at/archiv ...

  2. JQuery Easy Ui dataGrid 数据表格 ---制作查询下拉菜单

    JQuery Easy Ui dataGrid 数据表格 数据表格 - DataGrid 继承$.fn.panel.defaults,使用$.fn.datagrid.defaults重载默认值.. 数 ...

  3. Samba 服务器介绍

    Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通 ...

  4. UVA - 1153 Keep the Customer Satisfied(贪心)

    UVA - 1153 Keep the Customer Satisfied Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: ...

  5. 习题二:string数组应用

    说明: 读字符串char buf[100]="xxx:yyy:zzz:aaa:bbb" 按“:”进行分解到string数组中去 逻辑: 通过指针遍历整个字符串 遇到'\0'表示字符 ...

  6. Xcode7调试-b

    Xcode7中苹果为我们增加了两个重要的debug相关功能.了解之后觉得非常实用,介绍给大家. 1.Address Sanitizer: 妈妈再也不用担心 EXC_BAD_ACCESS? EXC_BA ...

  7. eclipse 重构功能。

    1. Rename Rename重构的功能就是重命名Java元素.虽然可以通过手动修改文件的文件名或其它Java元素的名称,但这种方式不会更新与此Java元素相关联的引用,用户必须手动查找和此Java ...

  8. MYSQL用SOURCE命令时导入乱码的问题解决

    现在遇到了,但记得上次辉哥说过的方法,在MYSQL命令行里输入: set names utf8; 再执行SOURCE命令,搞定!

  9. C#程序设计基础——变量

    变量表示数值,字符串值或类的对象.变量存储的值可能会发生更改,但名称保持不变.C#是一种强类型语言,在变量中存储值之前,必须指定变量的类型. 变量的命名规则: 1-变量只能有字母,数字和下划线三种字符 ...

  10. 【HDOJ】2571 命运

    DP. /* 2571 */ #include <cstdio> #include <cstring> #include <cstdlib> #define MAX ...