MVC2 项目实践
组员:黄杰辉 201731062223
谢仁峻 201731062209
一、数据库访问层
创建一个BaseDao,用于继承,方便之后的操作
package Dao.Impl; import Utils.JdbcUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import java.sql.Connection; import java.sql.SQLException; import java.util.List; public abstract class BaseDao { private QueryRunner queryRunner = new QueryRunner(); public int update(String sql, Object... args) { Connection connection = JdbcUtils.getConnection(); try { return queryRunner.update(connection, sql, args); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.close(connection); } return -1; } public <T> T queryForOne(Class<T> type, String sql, Object... args) { Connection con = JdbcUtils.getConnection(); try { return queryRunner.query(con, sql, new BeanHandler<T>(type), args); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.close(con); } return null; } public <T> List<T> queryForList(Class<T> type, String sql, Object... args) { Connection con = JdbcUtils.getConnection(); try { return queryRunner.query(con, sql, new BeanListHandler<T>(type), args); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.close(con); } return null; } public Object queryForSingleValue(String sql, Object... args){ Connection conn = JdbcUtils.getConnection(); try { return queryRunner.query(conn, sql, new ScalarHandler(), args); } catch (Exception e) { e.printStackTrace(); } finally { JdbcUtils.close(conn); } return null; } }
创建NewsDao接口,定义增删改查的方法
package Dao; import Entity.News; import java.util.List; public interface NewsDao { public int addNews(News news); public int deleteNews( Integer id); public int updateNews(News news); public News queryNewsById(Integer id); public List<News> queryNews(); }
创建NewsDaoImpl实现NewsDao接口,具体实现新闻数据的增删改查
package Dao.Impl; import Dao.NewsDao; import Entity.News; import java.util.List; public class NewsDaoImpl extends BaseDao implements NewsDao { @Override public int addNews(News news) { String sql = "insert into news(`title`,`content`,`author`,`date`) values(?,?,?,?)"; return update(sql,news.getTitle(),news.getContent(),news.getAuthor(),news.getDate()); } @Override public int deleteNews(Integer id) { String sql = "delete from news where id = ?"; return update(sql,id); } @Override public int updateNews(News news) { String sql = "update news set `title` = ?, `content`= ?,`author`= ?,`date`= ? where id = ?"; System.out.println(news); return update(sql,news.getTitle(),news.getContent(),news.getAuthor(),news.getDate(),news.getId()); } @Override public News queryNewsById(Integer id) { String sql = "select * from news where id = ?"; return queryForOne(News.class,sql,id); } @Override public List<News> queryNews() { String sql = "select * from news"; return queryForList(News.class,sql); } }
二、业务逻辑层
创建NewsService
package Service; import Entity.News; import java.util.List; public interface NewsService { public void addNews(News news); public void deleteNewsById(Integer id); public void updateNews(News news); public News queryNewsById(Integer id); public List<News> queryNews(); }
创建NewsService的实现类
package Service.Impl; import Dao.Impl.NewsDaoImpl; import Dao.NewsDao; import Entity.News; import Service.NewsService; import java.util.List; public class NewsServiceImpl implements NewsService { private NewsDao newsDao = new NewsDaoImpl(); @Override public void addNews(News news) { newsDao.addNews(news); } @Override public void deleteNewsById(Integer id) { newsDao.deleteNews(id); } @Override public void updateNews(News news) { newsDao.updateNews(news); } @Override public News queryNewsById(Integer id) { return newsDao.queryNewsById(id); } @Override public List<News> queryNews() { return newsDao.queryNews(); } }
三、控制层
创建BaseServlet,用于继承
package Controller; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Method; public abstract class BaseServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); String action = req.getParameter("action"); try { Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class); method.invoke(this, req, resp); } catch (Exception e) { e.printStackTrace(); } } }
创建WebUtil工具类,将参数转化为实体对象
package Utils; import org.apache.commons.beanutils.BeanUtils; import java.util.Map; public class WebUtils { public static <T> T copyParamToBean( Map value , T bean ){ try { System.out.println("注入之前:" + bean); BeanUtils.populate(bean, value); System.out.println("注入之后:" + bean); } catch (Exception e) { e.printStackTrace(); } return bean; } public static int parseInt(String strInt,int defaultValue) { try { return Integer.parseInt(strInt); } catch (Exception e) { e.printStackTrace(); } return defaultValue; } }
创建NewsServlet类
package Controller; import Entity.News; import Service.Impl.NewsServiceImpl; import Service.NewsService; import Utils.WebUtils; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; @WebServlet("/Controller.NewsServlet") public class NewsServlet extends BaseServlet { private Service.NewsService NewsService = new NewsServiceImpl(); protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { News News = WebUtils.copyParamToBean(req.getParameterMap(),new News()); NewsService.addNews(News); resp.sendRedirect(req.getContextPath() + "/Controller.NewsServlet?action=list"); } protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int id = WebUtils.parseInt(req.getParameter("id"), 0); NewsService.deleteNewsById(id); resp.sendRedirect(req.getContextPath() + "/Controller.NewsServlet?action=list"); } protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { News News = WebUtils.copyParamToBean(req.getParameterMap(),new News()); NewsService.updateNews(News); resp.sendRedirect(req.getContextPath() + "/Controller.NewsServlet?action=list"); } protected void getNews(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int id = WebUtils.parseInt(req.getParameter("id"), 0); News News = NewsService.queryNewsById(id); req.setAttribute("News", News) ; req.getRequestDispatcher("/pages/manager/news_edit.jsp").forward(req,resp); } protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List<News> News = NewsService.queryNews(); req.setAttribute("News", News); req.getRequestDispatcher("/pages/manager/news_manager.jsp").forward(req,resp); System.out.println(News); } }
四、视图层
创建news_manager.jsp,用于显示新闻列表
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>产品管理</title> <link rel="stylesheet" type="text/css" href="css/Iframe.css" /> <link rel="stylesheet" href="css/bootstrap.min.css" type="text/css" media="screen" /> </head> <body> <span class="cp_title">新闻管理</span> <div class="add_cp"> <a href="pages/manager/news_edit.jsp">+添加产品</a> </div> <div class="table_con"> <table> <tr > <tr class="tb_title"> <td width="10%">ID</td> <td width="12%">标题</td> <td width="30%">内容</td> <td width="12%">作者</td> <td width="10%">时间</td> <td width="26%">操作</td> </tr> </tr> <c:forEach items="${requestScope.News}" var="news"> <tr> <td width="10%">${news.id}</td> <td width="12%">${news.title}</td> <td width="30%">${news.content}</td> <td width="12%">${news.author}</td> <td width="10%">${news.date}</td> <td><a class="bj_btn" href="Controller.NewsServlet?action=getNews&id=${news.id}">修改</a></td> <td><a class="del_btn" class="deleteClass" href="Controller.NewsServlet?action=delete&id=${news.id}">删除</a></td> </tr> </c:forEach> </table> </div> </body> </html>
创建news_edit,作为添加,修改信息的界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>编辑图书</title> </head> <body> <div id="main"> <form action="/ServletDemo_war_exploded/Controller.NewsServlet" method="get"> <input type="hidden" name="action" value="${ empty param.id ? "add" : "update" }" /> <input type="hidden" name="id" value="${ requestScope.News.id }" /> <table> <tr> <td>标题</td> <td>内容</td> <td>作者</td> <td>日期</td> <td colspan="2">操作</td> </tr> <tr> <td><input name="title" type="text" value="${requestScope.News.title}"/></td> <td><input name="content" type="text" value="${requestScope.News.content}"/></td> <td><input name="author" type="text" value="${requestScope.News.author}"/></td> <td><input name="date" type="text" value="${requestScope.News.date}"/></td> <td><input type="submit" value="提交"/></td> </tr> </table> </form> </div> </body> </html>
代码地址:https://gitee.com/ioklkiol/javaee_second_job/tree/master/MVC2