补充知识点:
    一、lombook
    lombook可以通过简单的注解的形式来帮助我们简化和消除一些必须有但显得很臃肿的Java代码,比如常见的Getter&Setter、toString()、构造函数等等。lombok不仅方便编写,同时也让我们的代码更简洁。
    lombok提供了一个功能完整的jar包,可以很方便的与我们的项目进行集成
    详见:https://blog.csdn.net/qq3399013670/article/details/81948737

    二、dhtml
    DHTML是Dynamic HTML的简称,就是动态的html(标准通用标记语言下的一个应用),是相对传统的静态的html而言的一种制作网页的概念。
    DHTML建立在原有技术的基础上,可分为三个方面:
    一是HTML(XHTML),也就是页面中的各种页面元素对象,它们是被动态操纵的内容;
    二是CSS,CSS属性也是动态操纵的内容,从而获得动态的格式效果;
    三是客户端脚本(例如JavaScript),它实际操纵Web页上的HTML和CSS。
    使用DHTML技术,可使网页设计者创建出能够与用户交互并包含动态内容的页面。实际上,DHTML使网页设计者可以动态操纵网页上的所有元素——甚至是在这些页面被装载以后。利用DHTML,网页设计者可以动态地隐藏或显示内容、修改样式定义、激活元素以及为元素定位。DHTML还可使网页设计者在网页上显示外部信息,方法是将元素捆绑到外部数据源(如文件和数据库)上。所有这些功能均可用浏览器完成而无需请求Web服务器,同时也无需重新装载网页。这是因为一切功能都包含在HTML文件中,随着对网页的请求而一次性下载到浏览器端。

    三、热部署和热加载
    在应用运行的时升级软件,无需重新启动的方式有两种,热部署和热加载。
    对于Java应用程序来说,热部署就是在服务器运行时重新部署项目,热加载即在在运行时重新加载class,从而升级应用。
    详见:https://blog.csdn.net/xiufengwu/article/details/80658750

    =============================================================================================
    web封装:
    原来浏览器每次请求到服务器
    服务器参考web.xml调用不同servlet的service方法
    n次请求对应n个servlet的方法
    每次都需要自己接收参数,转换类型,组装参数
    每次都需要了自己实现响应
    直接响应
    直接字符串
    直接响应集合对象(json转换)
    间接响应
    转发
    重定向
    现在有了封装框架后
    1) 在web.xml中配置框架核心入口,将请求交给框架
    2)web.xml配置时指定框架的一些配置信息
    mvc.xml 配置请求映射关系
    (包含注解的类所在的)包 配置请求映射关系
    通过反射不可以获得参数
    (jdk1.8之后可以,但是需要加入一些配置,不是所以java环境都可以加入配置;不能保证所有运行该程序时都是jdk1.8的)
    所以用注解是最稳妥的
    3) 浏览器发送请求到服务器后
    服务器将请求交给框架
    框架根据请求映射关系,调用指定的controller中的指定方法
    4) 通过框架获得请求的参数
    一 一对应的关系 一个名对应一个参数
    名称一一对应的参数 (包括简单类型和文件类型) + @RequestParam
    public void t1(@RequestParam(“age”) int age){
    //req.getParameter(“age”)
    }
    public void t1(@RequestParam(“excel”) MultipartFile excel){
    }
    将参数组成domain对象,对象本身名称任意,但要对象中的属性名和参数名对应
    public void save(Car car){
    //class Car{cno,cname,color,price}
    }
    主要的接参方式,一种是一 一对应,一种是对象
    5) 请求处理完毕后通过返回值命令给与响应
    a) 方法上跟有 @ResponseBody注解表示直接响应
    return String 直接返回字符串
    return List 先json转换,再直接响应字符串
    b) 方法上没有 @ResposneBody注解,表示间接响应
    return “” 不含参数响应
    return “01.jsp” 转发
    return “redirect:01.jsp” 重定向
    return ModelAndView 含参数的响应
    HIS项目:
    权限管理
    用户管理
    角色管理
    功能管理
    基本信息管理
    医生管理
    护士管理
    科室管理
    房间管理
    药品管理
    药品单位管理
    药品类别管理
    药局管理
    药库管理
    供应商管理
    检查项目管理
    门诊
    挂号
    划价
    缴费
    退费
    药局管理
    进药
    取药
    退药
    盘点
    住院管理
    入院登记
    护士站管理
    医嘱
    执行医嘱
    押金管理
    出院管理
    押金报表
    手术室
    院长办公室
    财务


    权限管理
    需要3个基本信息
    用户管理 (登录控制,基本管理CR UD)
    1 dmc 123 flag=1(帐号状态1 正常,2 冻结,3未分配)
    2 zzt 123
    角色管理
    1 管理员
    2 院长
    功能管理
    * 在程序中以按钮或菜单项形式存在
    按钮和请求不一定对应
    菜单有对应的请求,按钮没有
    table t_fun(
    fid
    fname
    ftype 1 菜单,2 按钮
    fhref 菜单请求 “”/null
    pid 所属父级的id
    auth 权限范围 com.qxgl.user
    )
    保存


    1. <button onclick="f3()">修改<button><br /> function f3(){<br />location.href="t3.do";<br /> }<br />按钮和菜单存在所属关系<br />菜单不需要请求,所以为null<br /> 1 权限管理 1(菜单) null -1(没有父级)<br /> 2 用户管理 1(菜单) users 1(权限管理)<br /> 3 角色管理 1(菜单) roles 1(权限管理)<br /> 4 用户新建 2(按钮) null 2(用户管理)<br /> 5 用户修改 2(按钮) null 2(用户管理)<br /> * 功能管理概要设计<br /> * 建表,建实体<br /> create table t_fun(<br /> fid int primary key auto_increment,<br /> fname varchar(32),<br /> ftype int,<br /> fhref varchar(32),<br /> pid int,<br /> auth varchar(32),<br /> yl1 varchar(32),<br /> yl2 varchar(32)<br /> );<br /> insert into t_fun values(1,'权限管理',1,null,-1,"com.qxgl.auth",null,null);<br /> insert into t_fun values(2,'用户管理',1,'userFindAll',1,"com.qxgl.auth.user",null,null);<br /> insert into t_fun values(3,'角色管理',1,'roleFindAll',1,"com.qxgl.auth.role",null,null);<br /> insert into t_fun values(4,'功能管理',1,'funFindAll',1,"com.qxgl.auth.fun",null,null);<br /> insert into t_fun values(5,'基本信息管理',1,null,-1,"com.qxgl.base",null,null);<br /> insert into t_fun values(6,'药品管理',1,'ypFindAll',5,"com.qxgl.base.yp",null,null);<br /> insert into t_fun values(7,'供应商管理',1,'gysFindAll',5,"com.qxgl.base.gys",null,null);<br /> insert into t_fun values(8,'药局管理',1,'yjFindAll',5,"com.qxgl.base.yj",null,null);<br /> insert into t_fun values(9,'用户新建',2,null,2,"com.qxgl.auth.user.add",null,null);<br /> insert into t_fun values(10,'用户删除',2,null,2,"com.qxgl.auth.user.delete",null,null);<br />* 功能列表展示<br /> * ajax + layui<br /> * ajax特点:<br /> * 传统浏览器请求与ajax请求<br /> * 传统浏览器请求就是由浏览器发送的请求<br /> <a href=""><br /> <form action=""><br /> <script><br /> location.href='';<br /> window.open();<br /> </script><br /> 响应回来的内容就返回给了浏览器<br /> 浏览器如何处理响应内容呢?<br /> 会覆盖原浏览器窗口内容(网页刷新)<br /> <br /> 一般列表页面都是动态页面(jsp)<br /> 页面中的数据是动态,不确定的,需要从数据库获取的<br /> 也就是当请求列表页时,其实需要2部分内容<br /> * 网页<br /> * 数据<br /> * 需要将数据拼到网页上,将拼装后的完整体响应给浏览器<br /> 既然列表请求需要2部分,能不能发送2次请求,一次页面效果,一次请求数据呢?<br /> 不能:因为浏览器请求会将响应内容覆盖原内容<br /> 所以如果用浏览器发送了2次请求,最终只能展示1次请求的效果<br /> * ajax请求是由js对象发送的<br /> <script><br /> ajax代码系列<br /> <script><br /> js-ajax对象发送的请求,响应回来的内容就返回给了js-ajax对象<br /> js-ajax对象自己并不知道如何处理响应的内容<br /> 需要js编写人员提供回调函数(响应回来以后调用函数)<br /> 在回调函数中自定义对响应内容的处理<br /> 由于是在js代码中,可以使用js的dom操作<br /> 将响应内容处理到网页的指定标签中(局部刷新)<br /> * dom : 通过js代码,操作html 实现动态效果<br /> * js+html = dhtml<br /> <br /> 使用ajax技术请求,既可以获得请求的内容,又可以保留原有内容。<br /> * ajax发送的请求能不能像传统浏览器一样,在后台将数据与网页拼装好在返回呢?<br />