赞
踩
JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。名称中的“Bean”是用于Java的可重用软件组件的惯用叫法。 --from 维基百科
JavaBean是一种可重复使用、且跨平台的软件组件。JavaBean可分为两种:
模式一(JSP+JavaBean): 简便、灵活,在小规模、业务逻辑简单的项目开发中有一定优势,开发效率高
JSP页面通过JavaBean处理数据,响应请求并返回结果
模式二(JSP+Servlet+JavaBean): 程序层次清晰、分工明确,可维护性、扩展性高,尤其在规模较大或是业务逻辑复杂的项目中倾向使用
模式 二 体系结构结合使用 JSP 页面、Servlet和 JavaBean 来开发 Web 应用程序
MVC是英文“Model-View-Controller”的缩写,最初是在Smalltalk-80中被用来构建用户界面的。其中M代表模型Model,V代表视图View,C代表控制器Controller。
通过模型视图控制器来
采用MVC模式的目的,就是为了增加代码的重用率,减少数据表达、数据描述和提高应用操作的偶合度。同时也使得软件的可维护性、可修复性、可扩展性、灵活性以及封装性大大提高。
MVC,把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用将被分成三层:模型层、视图层、控制层。
- 输入>>模型层(Model)
- 处理>>视图层(View)
- 输出>>控制层(Controller)
controller负责处理客户端发送的请求,经过service层业务处理并间接调用mapper接口层的数据库操作,后将结果返回给视图层
客户端请求>>controller>>service>>mapper
分为: DAO层、service层
DAO层:
负责访问数据库进行数据的操作,取得结果集之后将结果集中的数据取出封装到VO类对象之后返回给service层
负责数据库操作,取得结果返回给service层
public interface HrMapper { int deleteByPrimaryKey(Long id); int insert(Hr record); int insertSelective(Hr record); Hr selectByPrimaryKey(Long id); int updateByPrimaryKeySelective(Hr record); int updateByPrimaryKey(Hr record); Hr login(@Param("username") String username, @Param("password") String password); List<Hr> queryAll(); List<Hr> queryByUsername(String username); }
service层:
主要负责一些业务处理,比如多个操作需要放在一个事务中进行管理,事务回滚,一些复杂的逻辑业务处理就放到service层
通过调用DAO层接口实现业务功能
Service层的业务实现,具体要调用到已定义的DAO层的接口。封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性。
@Service("hrService") public class HrServiceImpl implements HrService { @Autowired private HrMapper hrMapper; @Override public Hr login(String username, String password) { return hrMapper.login(username, password); } @Override public List<Hr> queryAll() { return hrMapper.queryAll(); } @Override public int insertSelective(Hr record) { return hrMapper.insertSelective(record); } @Override public int deleteByPrimaryKey(Long id) { return hrMapper.deleteByPrimaryKey(id); } @Override public Hr selectByPrimaryKey(Long id) { return hrMapper.selectByPrimaryKey(id); } @Override public int updateByPrimaryKeySelective(Hr record) { return hrMapper.updateByPrimaryKeySelective(record); } @Override public List<Hr>queryByUsername(String username) { return hrMapper.queryByUsername(username); } }
负责处理用户界面的显示细节,以及如何向用户展示业务处理的结果(页面效果)
<%@ page import="com.woniuxy.hrms.entity.Hr" %> <%@ page import="java.util.List" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <base href="<%=basePath%>"/> <!DOCTYPE html> <head> <meta charset="UTF-8"> <title>Title</title> </head> <link rel="stylesheet" type="text/css" href="static/bootstrap/css/bootstrap.min.css"> <script type="text/javascript" src="static/bootstrap/js/bootstrap.min.js"></script> <script type="text/javascript" src="static/bootstrap/js/jquery.min.js"></script> <script type="text/javascript"> function check(id) { var flag = confirm("确认要删除吗?"); if (flag) { //删除确认,服务器请求跳转至delete方法处理数据库数据 location.href = "hr/delete?id=" + id; } } </script> <body> <div class="container" style="padding-top: 40px;"> <div class="form-group"> <div class="row"> <div class="col-md-8"> <form id="searchForm" action="hr/queryByUsername" method="post"> <input type="text" class="form-control" id="selectUserName" name="username" placeholder="请输入用户名"/> <button type="submit" class="btn btn-danger search" id="searchBtn">搜索</button> </form> </div> <div class="col-md-3"> <a class="btn btn-round btn-square btn-default" href="manage/hr/add.jsp">添加<i class="mdi mdi-eye"></i></a> <!-- <button class="btn btn-default add" data-toggle="modal" data-target="#addModel">增加</button>--> </div> </div> </div> <% List<Hr> list = (List<Hr>) request.getAttribute("list"); %> <table class="table table-bordered text-center"> <tr> <td>编号</td> <td>姓名</td> <td>用户名</td> <td>电话</td> <td>地址</td> <td>操作</td> </tr> <%-- 迭代集合--%> <% for (Hr hr : list) { %> <tr> <td><%=hr.getId()%> </td> <td><%=hr.getRealName()%> </td> <td><%=hr.getUsername()%> </td> <td><%=hr.getPhone()%> </td> <td><%=hr.getAddress()%> </td> <td> <%-- 点击编辑链接,传递当前对象id,并向服务器发送请求--%> <%-- href="hrms/queryById?id=<%=hr.getId()% 查询字符串以?字符开始 --%> <%-- <%=hr.getId()%>jsp脚本表达式 --%> <a class="btn btn-round btn-square btn-info" href="hr/queryById?id=<%=hr.getId()%>">编辑<i class="mdi mdi-eye"></i></a> <a class="btn btn-round btn-square btn-warning" href="javascript:check(<%=hr.getId()%>)">删除<i class="mdi mdi-eye"></i></a> </td> </tr> <% } %> </table> </div> </body> </html>
处理客户端请求
叫做控制层,主要的功能是处理用户发送的请求。
负责协调视图与模型,在两者之间处于桥梁和纽带的位置
public class BaseServlet extends HttpServlet { //HttpServlet生命周期: 初始化init(),服务运行service(),销毁destroy() //1.init()仅加载一次 //2.service()随时响应客户端请求,每次获取请求对象调用此方法 //3.destroy()仅调用一次, 释放servlet所占用的资源。如关闭文件输入输出流,关闭与数据库的连接。 //多次调用,每次服务器获取请求对象调用service方法,随时响应客户端请求 @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取请求路径 String requestURI = req.getRequestURI(); //检索请求路径最后的方法名 String methodName = requestURI.substring(requestURI.lastIndexOf("/") + 1); Method declaredMethod; try { //动态调用对象方法 declaredMethod = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); declaredMethod.invoke(this, req, resp); } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { throw new RuntimeException(e); } } }
@WebServlet(value = "/hr/*", loadOnStartup = 1) public class HrServlet extends BaseServlet { HrService hrService; @Override public void init(ServletConfig config) throws ServletException { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml"); //config.getServletContext()创建ServletContext对象,用来存储applicationContext对象,整个Web应用范围内访问它 config.getServletContext().setAttribute("applicationContext", applicationContext); hrService = applicationContext.getBean("hrService", HrService.class); } protected void queryByUsername(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); List<Hr> list = hrService.queryByUsername(username); list.forEach(System.out::println); req.setAttribute("list", list); req.getRequestDispatcher("../manage/hr/show.jsp").forward(req, resp); } protected void queryAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List<Hr> list = hrService.queryAll(); req.setAttribute("list", list); req.getRequestDispatcher("../manage/hr/show.jsp").forward(req, resp); } protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // req.setCharacterEncoding("utf-8"); Hr hr = new Hr(); hr.setRealName(req.getParameter("realName")); hr.setUsername(req.getParameter("username")); hr.setAddress(req.getParameter("address")); hr.setPhone(req.getParameter("phone")); System.out.println(hr); int i = hrService.insertSelective(hr); //数据库添加数据,并重新调用queryAll走页面展示流程 queryAll(req, resp); } protected void queryById(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String id = req.getParameter("id"); Hr hr = hrService.selectByPrimaryKey(Long.parseLong(id)); req.setAttribute("hr", hr); // 跳转页面,带着对象forward(),地址栏不变 req.getRequestDispatcher("../manage/hr/update.jsp").forward(req, resp); // 单纯跳转页面,并不能携带对象,地址栏更新 // resp.sendRedirect("/hr/update.jsp"); } protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // req.setCharacterEncoding("utf-8"); Hr hr = new Hr(); //更新必须有id,负责更新所有内容,依据id更新 // where dept_id = #{deptId,jdbcType=INTEGER} //获取页面update.jsp请求对象传递的参数 hr.setId(Integer.parseInt(req.getParameter("id"))); hr.setRealName(req.getParameter("realName")); hr.setUsername(req.getParameter("username")); hr.setAddress(req.getParameter("address")); hr.setPhone(req.getParameter("phone")); int update = hrService.updateByPrimaryKeySelective(hr); //更新完显示全部数据(查询全部数据反馈给show.jsp) queryAll(req, resp); } protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String id = req.getParameter("id"); hrService.deleteByPrimaryKey(Long.parseLong(id)); queryAll(req, resp); } protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //负责处理login.jsp提交 //获取提交对象的username和password String username = req.getParameter("username"); String password = req.getParameter("password"); Hr hr = hrService.login(username, password); // HttpSession session = req.getSession(); session.setAttribute("hr", hr); if (hr != null) { //本地存储,在浏览器存储数据 Cookie[] cookies = req.getCookies(); boolean flag = false; for (Cookie cookie : cookies) { String name = cookie.getName(); if (name.equals("username")) { flag = true; } } if (!flag) { Cookie username1 = new Cookie("username", username); Cookie password1 = new Cookie("password", password); //设置cookie存储路径 username1.setPath("/hrms"); password1.setPath("/hrms"); username1.setMaxAge(60 * 60 * 24); password1.setMaxAge(60 * 60 * 24); resp.addCookie(username1); resp.addCookie(password1); } //路径可以: ../或/hrms根路径下的页面 resp.sendRedirect("/hrms/admin.jsp"); } else { resp.sendRedirect("../login.jsp"); } } }
1、耦合性低
视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
2、重用性高
MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。
3、部署快,生命周期成本低
MVC使开发和维护用户接口的技术含量降低。使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
4、可维护性高
分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
规则。
2、重用性高
MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。
3、部署快,生命周期成本低
MVC使开发和维护用户接口的技术含量降低。使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
4、可维护性高
分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
Struts2框架:Struts2是基于MVC的轻量级的web应用框架
SpringMVC:Spring家族产品,我们后期重点使用的框架
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。