当前位置:   article > 正文

4.Java Web开发模式(javaBean+servlet+MVC)

4.Java Web开发模式(javaBean+servlet+MVC)

Java Web开发模式

一、Java Web开发模式

1.javaBean简介

JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。名称中的“Bean”是用于Java的可重用软件组件的惯用叫法。 --from 维基百科

JavaBean是一种可重复使用、且跨平台的软件组件。JavaBean可分为两种:

  • 一种是有用户界面(UI,User Interface)的JavaBean;
  • 另一种是没有用户界面,==主要负责处理事务(如数据运算,操纵数据库)的JavaBean
1)特点:
  1. JavaBean是一种Java类,而且是一种特殊的、可重用的类。
  2. JavaBean必须具有无参数的构造器,所有的属性都是private的,通过提供setter和getter方法来实现对成员属性的访问。
  3. Javabean 是为了和 jsp 页面传数据化简交互过程而产生的。

2.开发模式分类

  • 模式一(JSP+JavaBean): 简便、灵活,在小规模、业务逻辑简单的项目开发中有一定优势,开发效率高

    JSP页面通过JavaBean处理数据,响应请求并返回结果

  • 模式二(JSP+Servlet+JavaBean): 程序层次清晰、分工明确,可维护性、扩展性高,尤其在规模较大或是业务逻辑复杂的项目中倾向使用

1)模式一特点
  • 模式 一 体系结构用于开发简单的应用程序
  • 模式 一体系结构包括多个用户可与之交互的页面
  • 客户端能够直接访问到服务器上的JSP页面
  • 在采用模式 一 开发的Web 应用程序中混杂了大量的业务逻辑代码,HTML内容、Java代码交织在一起,使程序的维护性和扩展性较差
  • 在JSP页面中可以通过链接等方式直接转向其他页面。在业务逻辑较为复杂的项目中管理页面流程较为困难。
2)模式二特点

模式 二 体系结构结合使用 JSP 页面、Servlet和 JavaBean 来开发 Web 应用程序

二、MVC模式

1.简介

MVC是英文“Model-View-Controller”的缩写,最初是在Smalltalk-80中被用来构建用户界面的。其中M代表模型Model,V代表视图View,C代表控制器Controller。

通过模型视图控制器来

采用MVC模式的目的,就是为了增加代码的重用率,减少数据表达、数据描述和提高应用操作的偶合度。同时也使得软件的可维护性、可修复性、可扩展性、灵活性以及封装性大大提高。

2.MVC模式结构

MVC,把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用将被分成三层:模型层、视图层、控制层。

  1. 输入>>模型层(Model)
  2. 处理>>视图层(View)
  3. 输出>>控制层(Controller)

controller负责处理客户端发送的请求,经过service层业务处理并间接调用mapper接口层的数据库操作,后将结果返回给视图层

客户端请求>>controller>>service>>mapper

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1)Model层

分为: DAO层、service层

  1. 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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  2. 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
2)View层

负责处理用户界面的显示细节,以及如何向用户展示业务处理的结果(页面效果)

<%@ 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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
3)Cotroller层

处理客户端请求

叫做控制层,主要的功能是处理用户发送的请求。

负责协调视图与模型,在两者之间处于桥梁和纽带的位置

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);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
@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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109

3.MVC的优点:

  • 1、耦合性低

    视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。

  • 2、重用性高

    MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。

  • 3、部署快,生命周期成本低

    MVC使开发和维护用户接口的技术含量降低。使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。

  • 4、可维护性高

    分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。

4.MVC框架

  1. Struts2框架:Struts2是基于MVC的轻量级的web应用框架

规则。

  • 2、重用性高

    MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。

  • 3、部署快,生命周期成本低

    MVC使开发和维护用户接口的技术含量降低。使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。

  • 4、可维护性高

    分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。

4.MVC框架

  1. Struts2框架:Struts2是基于MVC的轻量级的web应用框架

  2. SpringMVC:Spring家族产品,我们后期重点使用的框架

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/884135
推荐阅读
相关标签
  

闽ICP备14008679号