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
jdbc02的更多相关文章
- JDBC02 利用JDBC连接数据库【使用数据库连接池】
目录 1/2/3 Statement 和 Preparedstatement 的区别 4 读取properties配置文件 5 数据库连接池 6 利用数据库连接池连接数据库 1 使用Statemen ...
- JDBC02 加载JDBC驱动 建立连接
JDBC(Java Database Connection)为Java开发者使用数据库提供了统一的编程接口 sun公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库,因此su ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- http协议/获得请求/中文参数处理/访问数据库
# 1. http协议(了解)## (1)什么是http协议?一种网络应用层协议,规定了浏览器与web服务器之间如何通信以及相应的的数据包的结构.注:tcp/ip协议:保证数据可靠的传递.(UDP不可 ...
- ResultSet详解(转)
ResultSet用法集锦 结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成 ...
- java_JDBC,连接数据库方式,RestSet结果集,Statement,PreparedStatement,事务,批处理,数据库连接池(c3p0和Druid)、Apache-DBUtils、
一.JDBC的概述 1.JDBC为访问不同的数据薛是供了统一的接口,为使用者屏蔽了细节问题.2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作 ...
随机推荐
- The ultimate jQuery Plugin List(终极jQuery插件列表)
下面的文章可能出自一位奥地利的作者, 列出很多jQuery的插件.类似的网站:http://jquerylist.com/原文地址: http://www.kollermedia.at/archiv ...
- JQuery Easy Ui dataGrid 数据表格 ---制作查询下拉菜单
JQuery Easy Ui dataGrid 数据表格 数据表格 - DataGrid 继承$.fn.panel.defaults,使用$.fn.datagrid.defaults重载默认值.. 数 ...
- Samba 服务器介绍
Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通 ...
- UVA - 1153 Keep the Customer Satisfied(贪心)
UVA - 1153 Keep the Customer Satisfied Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: ...
- 习题二:string数组应用
说明: 读字符串char buf[100]="xxx:yyy:zzz:aaa:bbb" 按“:”进行分解到string数组中去 逻辑: 通过指针遍历整个字符串 遇到'\0'表示字符 ...
- Xcode7调试-b
Xcode7中苹果为我们增加了两个重要的debug相关功能.了解之后觉得非常实用,介绍给大家. 1.Address Sanitizer: 妈妈再也不用担心 EXC_BAD_ACCESS? EXC_BA ...
- eclipse 重构功能。
1. Rename Rename重构的功能就是重命名Java元素.虽然可以通过手动修改文件的文件名或其它Java元素的名称,但这种方式不会更新与此Java元素相关联的引用,用户必须手动查找和此Java ...
- MYSQL用SOURCE命令时导入乱码的问题解决
现在遇到了,但记得上次辉哥说过的方法,在MYSQL命令行里输入: set names utf8; 再执行SOURCE命令,搞定!
- C#程序设计基础——变量
变量表示数值,字符串值或类的对象.变量存储的值可能会发生更改,但名称保持不变.C#是一种强类型语言,在变量中存储值之前,必须指定变量的类型. 变量的命名规则: 1-变量只能有字母,数字和下划线三种字符 ...
- 【HDOJ】2571 命运
DP. /* 2571 */ #include <cstdio> #include <cstring> #include <cstdlib> #define MAX ...