分层实现新闻管理系统
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