jdbc02

分层实现新闻管理系统

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

public class News { // 新闻信息的实体类

    private Integer id;   //编号
    private String categoryId;
    private String title;   //标题
    private String summary;
    private String content;  //内容
    private String picPath;
    private String author;
    private Date createDate;  //创建时间
    private Date modifyDate;  //修改时间

    @Override
    public String toString() {
        return "News [id=" + id + ", categoryId=" + categoryId + ", title="
                + title + ", summary=" + summary + ", content=" + content
                + ", picPath=" + picPath + ", author=" + author
                + ", createDate=" + createDate + ", modifyDate=" + modifyDate
                + "]";
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCategoryId() {
        return categoryId;
    }
    public void setCategoryId(String categoryId) {
        this.categoryId = categoryId;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getSummary() {
        return summary;
    }
    public void setSummary(String summary) {
        this.summary = summary;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String getPicPath() {
        return picPath;
    }
    public void setPicPath(String picPath) {
        this.picPath = picPath;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public Date getCreateDate() {
        return createDate;
    }
    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
    public Date getModifyDate() {
        return modifyDate;
    }
    public void setModifyDate(Date modifyDate) {
        this.modifyDate = modifyDate;
    }

}

新闻信息的实体类

//通用的工具类
public class BaseDao {
    //jdbc 需要的API 创建出来
    protected Connection con;   //连接对象
    protected PreparedStatement ps; //执行sql  防止sql注入
    protected ResultSet rs;     //查询的返回结果集

    //01.开启连接
    public boolean getConnection(){
        //读取配置文件
        String url=ConfigManager.getInstance().getValue("url");
        String user=ConfigManager.getInstance().getValue("userName");
        String password=ConfigManager.getInstance().getValue("password");
        String driver=ConfigManager.getInstance().getValue("driverClass");
        try {
            Class.forName(driver); //加载驱动
            con=DriverManager.getConnection(url,user,password); //创建连接
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return false;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    //02.关闭连接
   public boolean closeConnection(){
        //如果对象都没有创建 就没法关闭  所以 要非空判断
        if (rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps!=null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
       if (con!=null) {
        try {
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
       }
        return true;
    }

   /*
    * 03.增删改   executeUpdate
    *
    * delete from user where name=‘小黑‘ and name=‘小白‘
    *
    * Object ... o
    * 参数类型是数组类型的!在作为参数的时候  参数个数 可以为0和任意多个
    */
   public  int executeUpdate(String sql,Object... params){
       int updateRow=0;
       if (getConnection()) {  //如果有连接进行操作
           try {
               ps=con.prepareStatement(sql);
               //你在传sql语句的时候   有参数 就给参数赋值
               for (int i = 0; i < params.length; i++) {
                   ps.setObject(i+1, params[i]);
               }
               //执行sql语句
               updateRow=ps.executeUpdate();
           } catch (SQLException e) {
               e.printStackTrace();
           }finally{
               closeConnection();
           }
          }
       return updateRow;
   }

   //04.查询  select  * from user  where  id=1
   public  ResultSet executeQuery(String sql,Object... params){
       if (getConnection()) {  //如果有连接进行操作
          try {
            ps=con.prepareStatement(sql);
            //你在传sql语句的时候   有参数 就给参数赋值
            for (int i = 0; i < params.length; i++) {
                ps.setObject(i+1, params[i]);
            }
            //执行sql语句
            rs=ps.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
         }
       }
       return rs;
   }

}

BaseDao

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

jdbc.properties配置文件

//单例  读取配置文件的工具类
public class ConfigManager {
   //01.创建静态的自身对象
    private  static  ConfigManager manager=new ConfigManager();
    //我们读取的配置文件需要的类
    private static Properties properties;

    //02.构造私有化
    private ConfigManager(){
        String  path="jdbc.properties";
        properties=new Properties();
        //获取流
        InputStream stream =
                ConfigManager.class.getClassLoader().getResourceAsStream(path);
         try {
            properties.load(stream); //读取配置文件
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //03.提供外部访问的接口
    public  static synchronized ConfigManager getInstance(){
        return manager;
    }

    //提供一个获取配置文件 value的方法
    public   static String  getValue(String key){
        return properties.getProperty(key);
    }

}

DriverManager工具类

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

public interface NewsDao {  //新闻功能的接口
    //查询所有的新闻信息
    List<News> getAllNews();

    //新增新闻
    int addNews(News news);

    //修改新闻
    int updateNews(News news);

    //删除新闻
    int deleteNews(News news);

    //根据ID查询指定的新闻信息
    News findById(String  id);
}

NewsDao

3.创建Dao层的实现类

//新闻功能的实现类    继承BaseDao  实现  NewsDao
public class NewsDaoImpl extends BaseDao implements NewsDao {

    //获取所有新闻信息
    @Override
    public List<News> getAllNews() {
        getConnection();//获取连接
        String sql="select * from news_detail";
        rs=executeQuery(sql);
        //创建一个集合用来存贮新闻信息
        List<News> list=new ArrayList<News>();
        try {
            while(rs.next()){
                News news=new News();
                //给新闻对象赋值
                news.setId(rs.getInt("id"));
                news.setTitle(rs.getString("title"));
                news.setContent(rs.getString("content"));
                news.setCreateDate(rs.getTimestamp("createDate"));
                news.setAuthor(rs.getString("author"));
                news.setCategoryId(rs.getString("categoryId"));
                news.setModifyDate(rs.getTimestamp("modifyDate"));
                news.setSummary(rs.getString("summary"));
                //把新闻放入集合
                list.add(news);
                }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            closeConnection();
        }
        return list;
    }

    //新增新闻
    @Override
    public int addNews(News news) {
        getConnection();
        String sql="insert into news_detail(id,title,content,createDate) " +
                " values(?,?,?,?)";
        Object [] params={news.getId(),news.getTitle(),news.getContent(),news.getCreateDate()};
        int num=executeUpdate(sql, params);
        return num;
    }

    //修改新闻
    @Override
    public int updateNews(News news) {
        getConnection();
        String sql="update  news_detail set title=? where id=?";
        Object [] params={news.getTitle(),news.getId()};
        int num=executeUpdate(sql, params);
        return num;
    }

    //删除新闻
    @Override
    public int deleteNews(News news) {
        getConnection();
        String sql="delete from  news_detail where id=?";
        Object [] params={news.getId()};
        int num=executeUpdate(sql, params);
        return num;
    }

    //查询指定的新闻信息
    @Override
    public News findById(String id) {
        getConnection();
        String sql="select * from  news_detail where id=?";
        Object [] params={id};
        rs=executeQuery(sql, params);
        News news=null;
        try {
            if (rs.next()) {
                news=new News();
                //给新闻对象赋值
                news.setId(rs.getInt("id"));
                news.setTitle(rs.getString("title"));
                news.setContent(rs.getString("content"));
                news.setCreateDate(rs.getTimestamp("createDate"));
                news.setAuthor(rs.getString("author"));
                news.setCategoryId(rs.getString("categoryId"));
                news.setModifyDate(rs.getTimestamp("modifyDate"));
                news.setSummary(rs.getString("summary"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return news;
    }

}

NewsDaoImpl

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

public interface NewsService {  //新闻的业务逻辑层
      //查询所有的新闻信息
        List<News> getAllNews();

        //新增新闻
        void addNews(News news);

        //修改新闻
        void updateNews(News news);

        //删除新闻
        void deleteNews(News news);
        //根据ID查询指定的新闻信息
        News findById(String  id);
}

NewsService

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

public class NewsServiceImpl implements NewsService {

    // 在不改变dao层代码的前提下,对dao层的方法进行一个逻辑操作/增强!
    private NewsDao dao = new NewsDaoImpl();

    //查询所有的新闻信息
    @Override
    public List<News> getAllNews() {
        return dao.getAllNews();
    }

    // 新增新闻
    @Override
    public void addNews(News news) {
        int num = dao.addNews(news);
        if (num > 0) {
            System.out.println("新增成功");
        } else {
            System.out.println("新增失败");
        }
    }

    //修改新闻
    @Override
    public void updateNews(News news) {
        int num = dao.updateNews(news);
        if (num > 0) {
            System.out.println("更新成功");
        } else {
            System.out.println("更新失败");
        }
    }

    //删除新闻
    @Override
    public void deleteNews(News news) {
        int num = dao.deleteNews(news);
        if (num > 0) {
            System.out.println("删除成功");
        } else {
            System.out.println("删除失败");
        }
    }

    //查询指定的新闻信息
    @Override
    public News findById(String id) {
        return dao.findById(id);
    }

}

NewsServiceImpl

6.创建测试类

public class NewsTest {
    //查询所有新闻
    @Test
    public  void test01(){
        NewsService service=new NewsServiceImpl();
        List<News> list = service.getAllNews();
        for (News news : list) {
            System.out.println(news);
        }
    }

    //新增新闻
    @Test
    public  void test02(){
        NewsService service=new NewsServiceImpl();
        News news=new News();
        news.setId(5);
        news.setTitle("新闻5");
        news.setContent("内容5");
        news.setCreateDate(new Date());
        service.addNews(news);
    }

    //修改新闻
    @Test
    public  void test03(){
        NewsService service=new NewsServiceImpl();
        News news=new News();
        news.setId(1);
        news.setTitle("新闻5");
        service.updateNews(news);
    }

    //删除新闻
    @Test
    public  void test04(){
        NewsService service=new NewsServiceImpl();
        News news=new News();
        news.setId(5);
        service.deleteNews(news);
    }
    //查询指定的新闻
    @Test
    public  void test05(){
        NewsService service=new NewsServiceImpl();
        News news = service.findById("1");
        System.out.println(news);
    }

}

测试类代码

7.总结以及任务

/*连接数据库出现异常信息  try to repair it

在数据库中 使用repair table  表名    即可!

分层开发:   前提已经有了 对应的数据库
 1.jdbc.properties  配置文件
         连接数据库的4要素
    01.url
    02.驱动
    03.用户名
    04.密码
 2.创建DriverManager 单例的方式 来读取 配置文件

 3.书写了BaseDao   开启 关闭 连接   增删改查 通用操作

 4.创建对应的实体类 News

 5.创建数据访问层的接口  NewsDao

 6. 创建数据访问层的实现类   要继承BaseDao  因为BaseDao中有我需要的获取连接 以及增删改查操作
     实现NewsDao接口

 7.创建业务逻辑层的接口  NewsService  目前 因为没有很复杂的逻辑,所以看的时候  感觉
   NewsService 和 NewsDao代码一致

 8.创建业务逻辑层的实现类  NewsServiceImpl
       类中创建了 NewsDao的实例 ,调用dao层的方法

 9.书写测试类   

  任务

  01.数据库
  创建一个数据库   School
    创建一个表Student
     字段
      id    int
      name  varchar
      age   int
      birthday  date
   至少5条测试数据   

 02.java代码实现的功能
    001.查询所有学生信息
    002.根据ID查询指定学生的信息
    003.修改指定学生的信息
    004.删除指定学生
    */

总结以及任务部分

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

<%@page import="cn.bdqn.bean.News"%>
<%@page import="cn.bdqn.service.impl.NewsServiceImpl"%>
<%@page import="cn.bdqn.service.NewsService"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML>
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP ‘index.jsp‘ starting page</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">
    <style type="text/css">
    <%-- 表格中的数据 居中显示    --%>
     td{
    text-align: center;
     }
    </style>
  </head>

  <body>

  <h1>显示新闻信息</h1>
  <table border="1">
     <tr>
      <td>新闻编号</td>
      <td>新闻标题</td>
      <td>新闻作者</td>
      <td>创建时间</td>
     </tr>

     <jsp:useBean id="service" class="cn.bdqn.service.impl.NewsServiceImpl"/>
  <%
      //NewsService service=new NewsServiceImpl();
     List<News> news= service.getAllNews();
     for(News n:news){
  %>
    <tr>
       <td><%=n.getId()%></td>
      <td><%=n.getTitle()%></td>
      <td><%=n.getAuthor()%></td>
      <td><%=n.getCreateDate()%></td>
    </tr>
    <% }%>
     </table>
  </body>
</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===总记录数   数据库中 一共有多少条(行)数据

问题?

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

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

都有分页的需求!

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

public class PageUtil {   //分页的工具类

    private Integer pageIndex=1;// 当前页
    private Integer pageSize=0;// 每页显示几条数据
    private Integer totalPageCount=1;// 总页数
    private Integer totalCountSize=0;// 总记录数

    //  set   赋值操作
    public void setPageIndex(Integer pageIndex) {
        this.pageIndex = pageIndex;
    }
    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public void setTotalPageCount(Integer totalPageCount) {
        this.totalPageCount = totalPageCount;
    }
    /*
     * 只要我们知道了 总记录数    总页数就可以计算了!
     * 我们如果按照 下面的方式 进行书写
     * 那么 必须先给 总记录数 赋值
     * 之后才能取总页数的值
     */
    public void setTotalCountSize(Integer totalCountSize) {
        if (totalCountSize>0) {  //如果大于0   可以分页
            this.totalCountSize = totalCountSize;
            //计算总页数??   总记录数%页大小==0?(总记录数/页大小):(总记录数/页大小+1)
            totalPageCount=
                    (totalCountSize%pageSize==0)?(totalCountSize/pageSize):(totalCountSize/pageSize+1);
        }
    }

    //   get方法
    public Integer getPageIndex() {
        return pageIndex;
    }
    public Integer getPageSize() {
        return pageSize;
    }
    public Integer getTotalPageCount() {
        return totalPageCount;
    }
    public Integer getTotalCountSize() {
        return totalCountSize;
    }

}

PageUtil工具类

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

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

    //获取新闻的总记录数
    int getTotalCountSize();

NewsDao

//查询总记录数
    public int getTotalCountSize() {
        getConnection();
        String  sql="select  count(*)  as count from news_detail";
        rs=executeQuery(sql);
        //定义变量 来接收 返回的 总记录数
        int totalCountSize=0;
        try {
            if (rs.next()) {
                totalCountSize=rs.getInt("count");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            closeConnection();
        }
        return totalCountSize;
    }

      //分页查询
        public List<News> getNewsByPageList(int pageIndex, int pageSize) {
            //既然返回一个集合  我就创建一个news的泛型集合
            ArrayList <News> list=new ArrayList<News>();
            /*
             *
             * 用户输入的页码pageIndex               转化成第几条给数据库查询
             *           1                                     0
             *           2                                     1
             *           3                                     2
             *  用户传1  我们变成0  代表从第一条数据开始
             *  用户传2 我们变成2 代表从第三条数据开始
             *
             * 我们想给数据库的值=(用户输入的页码-1)*每页显示的数量
             * pageIndex=(pageIndex-1)*pageSize
             */
            String sql="select * from news_detail limit ?,?";
            pageIndex=(pageIndex-1)*pageSize;
            Object [] params={pageIndex,pageSize};
            rs=executeQuery(sql, params);
            try {
                while(rs.next()){
                    News news=new News();
                    news.setId(rs.getInt("id"));
                    news.setTitle(rs.getString("title"));
                    news.setAuthor(rs.getString("author"));
                    news.setCreateDate(rs.getTimestamp("createDate"));
                    //向集合中增加数据
                    list.add(news);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                closeConnection();
            }
            return list;
        }

NewsDaoImpl

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

        //获取新闻的总记录数
        int getTotalCountSize();

NewsService

  // 返回总记录数
    public int getTotalCountSize() {
        return dao.getTotalCountSize();
    }

    // 分页
    public List<News> getNewsByPageList(int pageIndex, int pageSize) {
        return dao.getNewsByPageList(pageIndex, pageSize);
    }

NewsServiceImpl

11.书写测试类

//查询 总记录数
    @Test
    public  void test06(){
        NewsService service=new NewsServiceImpl();
        System.out.println("总记录数:"+service.getTotalCountSize());
    }

    //分页查询
    @Test
    public  void test07(){
        NewsService service=new NewsServiceImpl();
        //这是查询第一个的数据 每页显示三条
        List<News> list = service.getNewsByPageList(1, 3);
        for (News news : list) {
            System.out.println(news);
        }
    }

测试类方法

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

<%@page import="cn.bdqn.bean.News"%>
<%@page import="cn.bdqn.service.impl.NewsServiceImpl"%>
<%@page import="cn.bdqn.service.NewsService"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
            + request.getServerName() + ":" + request.getServerPort()
            + path + "/";
%>

<!DOCTYPE HTML>
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP ‘index.jsp‘ starting page</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">
<style type="text/css">
<%--
表格中的数据 居中显示       --%> td {
    text-align: center;
}
</style>
</head>
<%-- 需要引入了 外部javaBean  --%>
<jsp:useBean id="service" class="cn.bdqn.service.impl.NewsServiceImpl" />
<jsp:useBean id="pageUtil" class="cn.bdqn.util.PageUtil" />
<body>

    <h1>显示新闻信息</h1>
    <table border="1">
        <tr>
            <td>新闻编号</td>
            <td>新闻标题</td>
            <td>新闻作者</td>
            <td>创建时间</td>
        </tr>

        <%
            //获取分页的四要素
            int pageSize = 2; //页大小
            int pageIndex = 1; //当前页面
            String num = request.getParameter("pageIndex");//获取pageIndex
            if (num != null && num != "") { //因为第一次打开页面的时候 请求中 压根没有  pageIndex的属性
                pageIndex = Integer.parseInt(num);
            } else {
                pageIndex = 1;
            }
            //给通用的工具类 赋值
            pageUtil.setPageIndex(pageIndex);
            pageUtil.setPageSize(pageSize);
            pageUtil.setTotalCountSize(service.getTotalCountSize()); //总记录数
            pageUtil.getTotalPageCount(); //获取总页数

            List<News> news = service.getNewsByPageList(pageIndex, pageSize);
            for (News n : news) {
        %>
        <tr>
            <td><%=n.getId()%></td>
            <td><%=n.getTitle()%></td>
            <td><%=n.getAuthor()%></td>
            <td><%=n.getCreateDate()%></td>
        </tr>
        <%
            }
        %>

        <tr>
            <td>当前页:<%=pageUtil.getPageIndex()%></td>
            <td>总页数:<%=pageUtil.getTotalPageCount()%></td>
            <td>总记录数<%=pageUtil.getTotalCountSize()%></td>
        </tr>

        <tr>
            <td><a href="newsList.jsp?pageIndex=1">首页</a>
            </td>
            <td><a
                href="newsList.jsp?pageIndex=<%=pageUtil.getPageIndex() - 1%>">上一页</a>
            </td>
            <td><a
                href="newsList.jsp?pageIndex=<%=pageUtil.getPageIndex() + 1%>">下一页</a>
            </td>
            <td><a
                href="newsList.jsp?pageIndex=<%=pageUtil.getTotalPageCount()%>">最后一页</a>
            </td>
        </tr>

    </table>
</body>
</html>

修改后的NewsList.jsp页面

效果图

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

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

<%@ 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>
   <h1>登录界面</h1>
     <form action="doMain.jsp"  method="post">
         <table>
             <tr>
               <td>用户名:</td>
               <td><input  type="text" name="userName"/></td>
             </tr>
             <tr>
               <td>密码:</td>
               <td><input  type="password" name="password"/></td>
             </tr>
             <tr>
               <td></td>
               <td><input  type="submit" value="登录"/></td>
             </tr>
         </table>
     </form>
  </body>
</html>

login.jsp

public interface UserDao {  //用户接口

    //验证用户名和密码
    boolean  login(User user);

}

UserDao

public class UserDaoImpl extends BaseDao implements UserDao {

    //验证用户登录
    public boolean login(User user) {
        getConnection();
        String sql="select * from  news_user  where userName=?  and password=?";
        Object [] params={user.getUserName(),user.getPassword()};
        rs=executeQuery(sql, params);
        try {
            if (rs.next()) {  //如果找到了匹配的用户
                return  true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            closeConnection();
        }
        return false;
    }

}

UserDaoImpl

public interface UserService {

    //登录
    boolean  login(User user);
}

UserService

public class UserServiceImpl implements UserService {

    private  UserDao dao=new  UserDaoImpl();

    //登录
    public boolean login(User user) {
       return dao.login(user);
    }

    public UserDao getDao() {
        return dao;
    }

    public void setDao(UserDao dao) {
        this.dao = dao;
    }

}

UserServiceImpl

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

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

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

<%@ 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>
  <jsp:useBean id="service"  class="cn.bdqn.service.impl.UserServiceImpl"/>
  <jsp:useBean id="user"  class="cn.bdqn.bean.User"/>
  <body>

    <%
      request.setCharacterEncoding("utf-8");
       //01.获取用户信息
     String  userName= request.getParameter("userName");
     String  password= request.getParameter("password");
     user.setPassword(password);
     user.setUserName(userName);
       //02.从数据库取值
      boolean  flag= service.login(user);
       if(flag){
           //重定向到 新闻列表界面
           response.sendRedirect("newsList.jsp");
       }else{
           //重定向到 新闻登录界面
           response.sendRedirect("login.jsp");
       }
    %>

  </body>
</html>

doMain.jsp

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

<%@ 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">
    -->
<%--  引入我们需要的  富文本 编辑器    --%>
 <script type="text/javascript" src="ckeditor/ckeditor.js"></script>
<style type="text/css">
  div{
  height:900px;
  width:900px;
     margin:auto;
    padding: auto;
  }
</style>
<script type="text/javascript">
<%--验证用户有没有选择 新闻类别 --%>
  function  check(){
      var goryId=  document.getElementById("goryId").value;
      if(goryId==0){
          alert("请选择新闻类别.....");
          return  false;
      }
      return  true;
  }
</script>

</head>
  <body>
  <div>
  <h1>新闻信息新增界面</h1>
   <form action="realAddNews.jsp"  method="post" onsubmit="return  check()">
         <table>
             <tr>
               <td>新闻分类:</td>
               <td>
                 <select name="categoryId" id="goryId">
                   <option  value="0">请选择新闻类别</option>
                   <option  value="1">国内</option>
                   <option  value="2">国际</option>
                   <option  value="3">娱乐</option>
                   <option  value="4">军事</option>
                   <option  value="5">财经</option>
                 </select>
               </td>
             </tr>
             <tr>
               <td>新闻标题:</td>
               <td><input  type="text" name="title"/></td>
             </tr>
             <tr>
               <td>新闻作者:</td>
               <td><input  type="text" name="author"/></td>
             </tr>

             <tr>
               <td>新闻摘要:</td>
               <td><input  type="text" name="summary"/></td>
             </tr>
             <tr>
               <td>创建时间:</td>
               <td><input  type="date" name="createDate"/></td>
             </tr>
              <tr>
               <td>新闻内容:</td>
               <td><textarea class="ckeditor" name="content">

                 </textarea>
               </td>
             </tr>
             <tr>
               <td></td>
               <td><input  type="submit" value="新增"/></td>
             </tr>
         </table>
     </form>
  </div>

  </body>
</html>

addNews.jsp

效果图

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

<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@page import="java.io.File"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ 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>My JSP ‘realAddNews.jsp‘ starting page</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>

<jsp:useBean id="service" class="cn.bdqn.service.impl.NewsServiceImpl" />
<jsp:useBean id="news" class="cn.bdqn.bean.News" />
<body>

    <%
        //解决乱码问题
        request.setCharacterEncoding("utf-8");

        //01.文件上传到 哪里去??? 我们必须指定用户的上传位置
        String uploadFilePath = request.getSession().getServletContext()
                .getRealPath("upload/");
        //不确定文件是否已经存在
        File file = new File(uploadFilePath);
        if (!file.exists()) {
            //不存在  创建
            file.mkdirs();
        }
        //02.判断前台的form表单是否带有文件
        boolean flag = ServletFileUpload.isMultipartContent(request);
        if (flag) { //如果是文件上传
            /*
             如果上传的文件比较小,则直接保存在内存中,速度快!
             文件大的时候,以临时文件的形式,保存在电脑的临时文件夹中!
                 我们使用FileItemFactory 接口的对应 实现类  来完成 上传操作
             */
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            //能把请求中的所有元素进行获取! 返回一个FileItem的集合
            List<FileItem> items = upload.parseRequest(request);
            //获取Iterator迭代器
            Iterator<FileItem> iter = items.iterator();
            //事先给 没给元素定义一个名称
            String fileName = "";
            while (iter.hasNext()) { //遍历出每一个元素
                FileItem item = iter.next();
                if (item.isFormField()) { //如果是普通的元素
                    fileName = item.getFieldName();  //获取普通元素的名称
                    if (fileName.equals("title")) {
                        news.setTitle(item.getString("utf-8"));
                    } else if (fileName.equals("author")) {
                        news.setAuthor(item.getString("utf-8"));
                    } else if (fileName.equals("content")) {
                        news.setContent(item.getString("utf-8"));
                    } else if (fileName.equals("summary")) {
                        news.setSummary(item.getString("utf-8"));
                    } else if (fileName.equals("createDate")) {
                        news.setCreateDate(new SimpleDateFormat(
                                "yyyy-MM-dd").parse(item.getString("utf-8")));
                    } else if (fileName.equals("categoryId")) {
                        news.setCategoryId(Integer.parseInt(item
                                .getString("utf-8")));
                    }
                } else { //操作上传的文件
                    String fimeName = item.getName();  //获取上传文件的名称
                    if (fimeName != null && fimeName != "") {
                        File fullFile = new File(fimeName);
                        //相当于在uploadFilePath 这个文件下面  创建一个文件fullFile.getName()
                        File saveFile = new File(uploadFilePath,
                                fullFile.getName());
                        //写入  真正的上传
                        item.write(saveFile);
                        news.setPicPath(fullFile.getName()); //给news的文件路径赋值
                    }
                }
            }
        }
        service.addNews(news);  //调用底层代码 进行新增操作
         //新增成功了之后  需要返回到新闻列表界面   转发  会引起 表单的重复提交
         //request.getRequestDispatcher("newsList.jsp").forward(request, response);
        //重定向
        response.sendRedirect("newsList.jsp");
    %>

    <%--
  <%  没有文件上传的 处理
      //解决乱码问题
      request.setCharacterEncoding("utf-8");
      //获取用户输入的新闻信息
     String title= request.getParameter("title");
     String author= request.getParameter("author");
     String summary= request.getParameter("summary");
     String content= request.getParameter("content");
     String createDate= request.getParameter("createDate");
     String categoryId= request.getParameter("categoryId");
     news.setTitle(title);
     news.setAuthor(author);
     news.setContent(content);
     news.setSummary(summary);
     news.setCategoryId(Integer.parseInt(categoryId));
     SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
     news.setCreateDate(sdf.parse(createDate));
     //调用后台新增新闻的方法
     service.addNews(news);
     //新增成功了之后  需要返回到新闻列表界面
     request.getRequestDispatcher("newsList.jsp").forward(request, response);
  %> --%>

</body>
</html>

realAddNews.jsp

时间: 2024-10-11 01:10:09

jdbc02的相关文章

2.JDBC-02

常见的配置文件格式: 1.properties 里面内容的格式 key=value 2.xml 若我们的配置文件为properties,并且放在src目录下. 名字存为jdbc.properties 1 driverClass = com.mysql.jdbc.Driver 2 url = jdbc:mysql://localhost:3306/day02 3 user = root 4 password = 123456 我们可以通过 ResourceBundle工具快速获取里面的配置信息 使

JDBC02 加载JDBC驱动 建立连接

JDBC(Java Database Connection)为Java开发者使用数据库提供了统一的编程接口 sun公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库,因此sun公司自己提供一套API,凡是数据库想与Java进行连接的,数据库厂商自己必须实现JDBC这套接口,而数据厂商的JDBC实现,我们就叫他此数据库的数据库驱动 访问数据库流程: try { Class.forName("com.mysql.cj.jdbc.Driver"); long sta

JDBC-02

JDBC 前言 在JDBC-01当中,我们简单地学习了有关JDBC的一些基本操作,现在我们再一次进行深入的学习. 正文 事务 首先,我们来学习的是JDBC中事务的运用,那么让我们再次了解一下事务的概念. 事务的概念 事务指的是逻辑上的一组操作,组成这组操作各个逻辑单元要么全部成功,要么全部失败. 关于事务的API getAutoCommit() commit() rollback() 异常案例: package com.charles.jdbc.high; import org.junit.Te

Java操作mysql数据库简单例子

package com.Jdbc.demo; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import com.mysql.jdbc.Connection; public class jdbc02 { public static final String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&a

Mysql数据库无法使用事务回滚

package jdbc02; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import org.junit.Test; import jdbc02.*; public class TransactionTest { /**  * Tom 给Jerry 汇款500元  *   * 关于事务:  * 1. 如果多个操作,每个操作使用的是自己的单独的连接,则无

day22 Java语言中的------JDBC连接

day22 Java语言中的------JDBC连接 一.JDBC概述: "JDBC"就是Java连接数据库,根据数据库的不同建立的连接也有一定的区别.我们主要还是对MySQL数据库进行数据的操作.JDBC架构中主要包含两种:一种是JDBC应用程序层,一种是JDBC驱动程序层.下表是JDBC与各种数据库连接的图示.下面就具体的来了解一下Java与数据库之间的一个关系. 二.JDBC: 在具体开始学习JDBC之前,做好相应的准备工作.在MySQL数据库官网下载好相应的jar包(mysql