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);
    }
    
  2. service层:

    主要负责一些业务处理,比如多个操作需要放在一个事务中进行管理,事务回滚,一些复杂的逻辑业务处理就放到service层

    通过调用DAO层接口实现业务功能

    Service层的业务实现,具体要调用到已定义的DAO层的接口。封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性。

    @Service("hrService")
    public class HrServiceImpl implements HrService {@Autowiredprivate HrMapper hrMapper;@Overridepublic Hr login(String username, String password) {return hrMapper.login(username, password);}@Overridepublic List<Hr> queryAll() {return hrMapper.queryAll();}@Overridepublic int insertSelective(Hr record) {return hrMapper.insertSelective(record);}@Overridepublic int deleteByPrimaryKey(Long id) {return hrMapper.deleteByPrimaryKey(id);}@Overridepublic Hr selectByPrimaryKey(Long id) {return hrMapper.selectByPrimaryKey(id);}@Overridepublic int updateByPrimaryKeySelective(Hr record) {return hrMapper.updateByPrimaryKeySelective(record);}@Overridepublic  List<Hr>queryByUsername(String username) {return hrMapper.queryByUsername(username);}
    }
    
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">添加<iclass="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()%>">编辑<iclass="mdi mdi-eye"></i></a><a class="btn btn-round btn-square btn-warning" href="javascript:check(<%=hr.getId()%>)">删除<iclass="mdi mdi-eye"></i></a></td></tr><%}%></table>
</div>
</body>
</html>
3)Cotroller层

处理客户端请求

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

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

public class BaseServlet extends HttpServlet {//HttpServlet生命周期: 初始化init(),服务运行service(),销毁destroy()//1.init()仅加载一次//2.service()随时响应客户端请求,每次获取请求对象调用此方法//3.destroy()仅调用一次, 释放servlet所占用的资源。如关闭文件输入输出流,关闭与数据库的连接。//多次调用,每次服务器获取请求对象调用service方法,随时响应客户端请求@Overrideprotected 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;@Overridepublic 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和passwordString 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");}}
}

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家族产品,我们后期重点使用的框架

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/381702.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java之 jvm

jvm之管理内存 程序计数器&#xff1a;当前线程所执行的字节码的行号指示器。程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域&#xff0c;它的生命周期随着线程的创建而创建&#xff0c;随着线程的结束而死亡。Java虚拟机栈 方法调用 一个方法调用都会有对应的栈帧…

set(集合),multiset容器及pair队组的创建

1.set的基本概念&#xff1a;所有元素再插入时自动按升序排序&#xff0c;set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现的 set与multiset区别&#xff1a; set中不允许容器中有重复的元素 multiset允许容器中有重复的元素 2.set的构造函数 3.set的大小和…

MT6701磁编码IC在自动化插件流水线中的应用

艾毕胜马达控制平台专家 MT6701磁编码IC作为现代工业自动化领域的重要组成部分&#xff0c;其在自动化插件流水线中的应用日益广泛。本文将从MT6701磁编码IC的特性、工作原理、在自动化插件流水线中的具体应用、以及未来的发展趋势等方面&#xff0c;详细探讨其在工业自动化领…

Apache POI-Excel入门与实战

目录 一、了解Apache POI 1.1 什么是Apache POI 1.2 为什么要使用ApaChe POI 1.3 Apache POI应用场景 1.4 Apache POI 依赖 二、Apache POI-Excel 入门案例 2.1 写入Excel文件 2.2 读取文件 四、Apache POI实战 4.1 创建一个获取天气的API 4.2高德天气请求API与响应…

volatile,最轻量的同步机制

目录 一、volatile 二、如何使用&#xff1f; 三、volatile关键字能代替synchronized关键字吗&#xff1f; 四、总结&#xff1a; 还是老样子&#xff0c;先来看一段代码&#xff1a; 我们先由我们自己的常规思路分析一下代码&#xff1a;子线程中&#xff0c;一直循环&…

小技巧:如何在已知PDF密码情况下去掉PDF的密码保护

第一步&#xff0c;用Edge打开你的pdf&#xff0c;输入密码进去 第二步&#xff0c;点击打印 第三步&#xff0c;选择导出PDF&#xff0c;选择彩印 第四步&#xff0c;选择导出位置&#xff0c;导出成功后打开发现没有密码限制了&#xff01;

物联网mqtt网关搭建背后的技术原理

前言 物联网是现在比较热门的软件领域&#xff0c;众多物联网厂商都有自己的物联网平台&#xff0c;而物联网平台其中一个核心的模块就是Mqtt网关。这篇文章的目的是手把手教大家写书写一个mqtt网关&#xff0c;后端存储支持Kafka/Pulsar&#xff0c;支持mqtt 连接、断链、发送…

DevExpress中文教程 - 如何在.NET MAUI应用中实现Material Design 3?

DevExpress .NET MAUI多平台应用UI组件库提供了用于Android和iOS移动开发的高性能UI组件&#xff0c;该组件库包括数据网格、图表、调度程序、数据编辑器、CollectionView和选项卡组件等。 获取DevExpress v24.1正式版下载 Material Design是一个由Google开发的跨平台指南系统…

计算机毕业设计hadoop+spark+hive物流大数据分析平台 仓储数据分析 物流预测系统 物流信息爬虫 物流大数据 机器学习 深度学习 知识图谱 大数据

Hadoop物流可视化系统的开题报告 一、课题名称 Hadoop物流可视化系统设计与实现 二、研究背景与意义 随着信息技术的飞速发展&#xff0c;物流行业产生了海量的数据&#xff0c;这些数据包含了订单信息、运输路线、仓储状态等丰富的信息和价值。然而&#xff0c;传统的数据…

谷粒商城实战笔记-44-前端基础-Vue-整合ElementUI快速开发/设置模板代码

文章目录 一&#xff0c;安装导入ElementUI1&#xff0c;安装 element-ui2&#xff0c;导入 element-ui 二&#xff0c;ElementUI 实战1&#xff0c;将 App.vue 改为 element-ui 中的后台布局2&#xff0c;开发导航栏2.1 开发MyTable组件2.2 注册路由2.3 改造App.vue2.4 新增左…

AV1技术学习:Coding Structure

一、SuperBlock SuperBlock 是AV1编解码器可以处理的最大编码块。SuperBlock 大小可以是128 128 或64 64&#xff0c;由 sequence header 控制。SuperBlock 可以进一步划分为更小的编码块&#xff0c;每个编码块都有自己的预测和变换模式。SuperBlock 编码只依赖于它的上侧和…

【jmeter边界值提取器】

【目的】 从响应头中取token的内容 【方案】 使用后置处理器-边界值提取器 【组件路径】HTTP请求->右键添加->后置处理器->边界提取器 用途&#xff1a;边界提取器(Boundary Extractor)是放在Sample请求之后执行的&#xff0c;用于获取左右边界中间的所有字符&#xf…

Anaconda下安装配置Jupyter

Anaconda下安装配置Jupyter 1、安装 conda activate my_env #激活虚拟环境 pip install jupyter #安装 jupyter notebook --generate-config #生成配置文件提示配置文件的位置&#xff1a; Writing default config to: /root/.jupyter/jupyter_notebook_config.py检查版本&am…

指针!!C语言(第二篇)

目录 一. 数组名的理解 二. 一维数组传参的本质 三. 冒泡排序法 四. 二级指针与指针数组 五. 字符指针变量与数组指针 一. 数组名的理解 在我们对指针有了初步的理解之外&#xff0c;今天我们来掌握一些新的知识就是数组与指针&#xff0c;第一个对数组名的了解&#xff…

基于R语言复杂数据回归与混合效应模型【多水平/分层/嵌套】技术与代码

回归分析是科学研究特别是生态学领域科学研究和数据分析十分重要的统计工具&#xff0c;可以回答众多科学问题&#xff0c;如环境因素对物种、种群、群落及生态系统或气候变化的影响&#xff1b;物种属性和系统发育对物种分布&#xff08;多度&#xff09;的影响等。纵观涉及数…

excel批量新建多个同类型的表格

背景引入 比如&#xff0c;一个企业有多个部门&#xff0c;现在需要按照某一个excel表模板收集各个部门的信息&#xff0c;需要创建数十个同类型表格&#xff0c;且标题要包含部门名称。 1.修改模板表格标题 在一个文件夹下面放入需要发放给各个部门的表格&#xff0c;将标题…

初识godot游戏引擎并安装

简介 Godot是一款自由开源、由社区驱动的2D和3D游戏引擎。游戏开发虽复杂&#xff0c;却蕴含一定的通用规律&#xff0c;正是为了简化这些通用化的工作&#xff0c;游戏引擎应运而生。Godot引擎作为一款功能丰富的跨平台游戏引擎&#xff0c;通过统一的界面支持创建2D和3D游戏。…

Dav_笔记10:Using SQL Plan Management之1

SQL计划基准概述 SQL计划管理是一种预防机制&#xff0c;可以记录和评估SQL语句的执行计划。此机制可以构建SQL计划基准&#xff0c;这是一组SQL语句的已接受计划。已接受的计划已被证明表现良好。 SQL计划基准的目的 SQL计划基准的目标是保持相应SQL语句的性能&#xff0c;…

函数的参数

函数的参数 函数的参数可以增加函数的通用性 # 没有函数参数的函数 def num_add():a 1b 2return a bs1 num_add() print(s1) # 局限性&#xff1a;只可以计算两个数字的和&#xff0c;无法实现具有较高的通用性# 没有函数参数的函数 def num_add(a, b):return a bs num…

idea如何让包结构分层

文章目录 前言1.选中前项目包结构2.取消后项目包结构3.情况二 前言 在大型项目中&#xff0c;代码的分层管理至关重要。IDEA编辑器提供了强大的package分层结构功能&#xff0c;帮助开发者更好地组织和管理代码。通过合理配置&#xff0c;我们可以清晰地看到各个package之间的…