精华内容
下载资源
问答
  • 走进信息隐藏的世界,全面讲解信息隐藏——第1节:信息隐藏技术简介 专栏题记:奥斯卡优秀电影《美丽心灵》里面有讲述一位优秀数学家为政府破译敌国通讯的情节,如电影所讲,现实中也有着类似的情节,在我们的生活...

    走进信息隐藏的世界,全面讲解信息隐藏——第1节:信息隐藏技术简介


    专栏题记:奥斯卡优秀电影《美丽心灵》里面有讲述一位优秀数学家为政府破译敌国通讯的情节,如电影所讲,现实中也有着类似的情节,在我们的生活中,我们所看过的图片、视频和游览过的网页,也许就隐藏着他人需要传输的秘密信息(是不是有点恐怖,差一点成为帮凶了),这就是信息隐藏!由于应用场景一般比较神秘,导致很多人其实都不太了解信息隐藏技术。由于国家越来越重视网络信息的安全,现在也是有越来越多的研究人员进行着这方面的研究工作。本人也是其中一位非常平凡的研究人员,笔者抱着学习和分享的态度,希望略尽绵薄之力让大家对信息隐藏技术不再陌生,同时慢慢掌握如何进行信息隐藏的技术。接下来本人会不定时更新信息隐藏技术的相关原理和关键技术实现过程,同时会提供程序代码给大家学习,也欢迎有志之士可以和我一同创建学习平台,也可以在评论下建议下一节希望学习的研究内容。谢谢!


    目录

    1、信息隐藏概念

    2、信息隐藏系统模型

    3、信息隐藏技术的分支简介

    4、信息隐藏技术的特性和要求

    5、信息隐藏关键技术

    6、信息隐藏的应用实例

    案例一:信息隐藏技术在电子商务中的应用

    案例二:信息隐藏技术在网络战中的运用



    • 信息隐藏概念

           信息隐藏也称数据隐藏,信息隐藏技术是指在不对载体数据产生可察觉影响的前提下,将密信数据隐藏到载体中实现隐蔽通讯的技术。是集多学科理论与技术于一身的新兴技术领域。信息隐藏技术主要是指将特定的信息嵌入数字化宿主信息(如文本,数字化的声音、图像、视频信号等)中,信息隐藏的目的不在于限制正常的信息存取和访问,而在于保证隐藏的信息不引起监控者的注意和重视,从而减少被攻击的可能性,在此基础上再使用密码术来加强隐藏信息的安全性,因此信息隐藏比信息加密更为安全。应该注意到,密码术和信息隐藏技术不是互相矛盾、互相竞争的技术,而是相互补充的技术,他们的区别在于应用的场合不同,对算法的要求不同,但可能在实际应用中需要互相配合。特定的信息一般就是保密信息,信息隐藏的历史可以追溯到古老的隐写术,但推动了信息隐藏的理论和技术研究始于1996年在剑桥大学召开的国际第一届信息隐藏研究会,之后国际机构在信息隐藏领域中的隐写术、数字水印、版权标识,可视密码学等方面取得大量成果。


    • 信息隐藏系统模型

           广义的信息隐藏系统模型主要有四部分组成:(1)信息嵌入,即利用嵌入秘钥来实现嵌入对象的隐藏过程;(2)信息提取,即利用提取秘钥从隐藏对象或可能经过修改的隐藏对象中提取或恢复出嵌入对象,在提取时,原始的载体对象可能需要参与也可能不需要参与;(3)秘钥生成,根据安全参数生成嵌入秘钥和提取秘钥;(4)隐藏分析,隐藏对象在传输过程中可能会被隐藏分析者截获并进行处理。信息隐藏系统模型如下图所示:

           在信息隐藏系统模型中,在嵌入过程中我们使用嵌入密钥将嵌入对象嵌入掩护对象中,生成隐藏对象,如下图将一个txt的文本嵌入到一张JPEG的图像中。嵌入对象和掩护对象可以是文本、图像或音频等等。在我们没有使用工具进行分析时,我们觉得掩护对象与隐藏对象几乎没有差别,这就是信息隐藏概念中所说的“利用人类感觉器官的不敏感性”。隐藏对象在信道中进行传输,在传输的过程中,有可能会遭到隐藏分析者的攻击,隐藏分析者的目标在于检测出隐藏对象、查明被嵌入对象、向第三方证明消息被嵌入、删除被嵌入对象、阻拦等。其中前三个目标通常可以由被动观察完成,称为被动攻击,后两个目标通常可以由主动攻击实现。提取过程则是在提取密钥的参与下从所接收到的隐藏对象中提取出嵌入对象,如将上述txt文件从JPG的图像中提取出来。有些提取过程并不需要掩护对象的参与,这样的系统称为盲隐藏技术,而需要掩护对象参与的系统则称为非盲隐藏技术。


    • 信息隐藏技术的分支简介

           作为信息安全领域的一个重要组成部分,信息隐藏技术已成为信息安全领域中一个既具有研究价值、同时又极具挑战性的热门课题,信息隐藏技术的分支主要包括:隐写术、数字水印、数字指纹、隐蔽信道、阈下信道、低截获概率通信和匿名通信等等。其分类示意图如下图所示:


    • 信息隐藏技术的特性和要求

           信息隐藏不同于传统的加密,因为其目的不在于限制正常的资料存取,而在于保证隐藏数据不被发现。因此,信息隐藏技术必须考虑正常的信息操作所造成的威胁,即要使机密数据对正常的数据操作技术具有免疫力。根据信息隐藏的不同目的和技术要求,该技术的存在以下特性和要求:

    1. 透明性或不可感知性:利用人类视觉系统或人类听觉系统属性,经过一系列的隐藏处理,使得载体对象没有明显的降质现象,如LSB算法等。当然,有些场合可能需要使用可见水印,例如某些版权维护的场合。
    2. 鲁棒性:指不因隐藏对象通过某些常用操作而导致嵌入对象丢失的能力。这里的常用操作包括滤波操作、有损压缩、几何变换、D/A或A/D等。
    3. 安全性:指算法具有较强的抗恶意攻击能力。
    4. 不可检测性:指载体数据嵌入数据后无明显改变,至少肉眼看不出变化

    • 信息隐藏关键技术

      近年来,信息隐藏技术的研究取得了很大的进步,已经提出了各种各样的隐藏算法。关键的信息隐藏技术有如下几种。

        (1)替换技术

        所谓替换技术,就是试图用秘密信息比特替换掉伪装载体中不重要的部分,以达到对秘密信息进行编码的目的。替换技术包括最低比特位替换、伪随机替换、载体区域的奇偶校验位替换和基于调色板的图像替换等。替换技术是在空间域进行的一种操作,通过选择合适的伪装载体和适当的嵌入区域,能够有效地嵌入秘密信息比特,同时又可保证数据的失真度在人的视觉允许范围内。

        已经提出的各种算法大都给出了其实现思想,如对于基于调色板的图像格式,可操作其调色板来嵌入信息,也可以利用它的量化值来隐藏秘密信息,因此该技术在数据伪装中得到了广泛的应用。

        替换技术算法简单,容易实现,但是鲁棒性很差,不能抵抗图像尺寸变化、压缩等一些基本的攻击,因此在数字水印领域中一般很少使用。

        (2)变换技术

        大部分信息隐藏算法都是在变换域进行的,其变换技术包括离散傅里叶变换(DFT)、离散余弦变换(DFT)、离散小波变换(DWT)和离散哈达玛特变换(DHT)等。这些变换技术都有各自的特点。

        DFT在信号处理中有着广泛应用,在信息隐藏领域也同样得到了应用。它将图像分割成多个感觉频段,然后选择合适部分来嵌入秘密信息。D CT使空间域的能量重新分布,从而降低了图像的相关性。在DCT域中嵌入信息的方法,通常是在一个图像块中调整两个(或多个)DCT系数的相对大小。DWT是对图像的一种多尺度、空间频率分解,即将输入信号分解为低分辨率参考信号和一系列细节信号。在一个尺度下,参考信号和细节信号包含了完全恢复上一尺度下信号的全部信息。

        (3)扩频技术

        当对伪装对象进行过滤操作时可能会消除秘密信息,解决的方法就是重复编码,即扩展隐藏信息。在整个伪装载体中多次嵌入一个比特,使得隐藏信息在过滤后仍能保留下来,这种方法虽然传输效率不高,但却具有较好的健壮性。扩频技术一般是使用比发送的信息数据速率高许多倍的伪随机码,将载有信息数据的基带信号频谱进行扩展,形成宽带低功率谱密度信号。最典型的扩频技术,为直序扩频和跳频扩频。直序扩频是在发端直接用具有高码率的扩频编码去扩展信号的频谱,而在接收端用相同的扩频编码解扩,将扩频信号还原为原始信号。跳频扩频是在发端将信息码序列与扩频码序列组合,然后按照不同的码字去控制频率合成器,使输出频率根据码字的改变而改变,形成频率的跳变;在接收端为了解跳频信号,要用与发端完全相同的本地扩频码发生器去控制本地频率合成器,从中恢复出原始信息


    • 信息隐藏的应用实例

    案例一:信息隐藏技术在电子商务中的应用

      目前信息隐藏技术在电子商务中的应用主要体现在以下几个方面:

      1.数据保密

      在具体电子商务活动中,数据在Internet上进行传输一定要防止非授权用户截获并使用,如敏感信息,谈判双方的秘密协议合同网上银行交易中的敏感数据信息,重要文件的数字签名和个人隐私等等。另外,还可以对一些不愿为别人所知道的内容使用信息隐藏的方式进行隐藏存储。

      2.数据的不可抵赖性

      在网上交易中,交易双方的任何一方不能抵赖自己曾经做出的行为,也不能否认曾经接收到的对方的信息,这是交易系统中的一个重要环节。这可以使用信息隐藏技术中的水印技术,在交易体系的任何一方发送或接收信息时,将各自的特征标记以水印的形式加入到传递的信息中,这咱水印应是不能被去除的,可达到确认其行为的目的。

      3.防伪

      商务活动中的各种票据的防伪也是信息隐藏技术的用武之地。在数字票据中隐藏的水印经过打印后仍然存在,可以通过再扫描回数字形式,提取防伪水印,以证实票据的真实性。

      4.数据的完整性

      对于数据完整性的验证是要确认数据在网上传输或存储过程中并没有被窜改,可通过使用脆弱水印技术保护的媒体一旦被窜改就会破坏水印,从而很容易被识别。

    案例二:信息隐藏技术在网络战中的运用[2]

      信息隐藏之所以比密码加密的方法进行保密通信具有更大优势,是因为以信息隐藏方式实现隐蔽通信,除通信双方以外的任何第三方并不知道秘密通信这个事实的存在,这就较之单纯的密码加密更多了一层保护,使得网络加密机制从“看不懂”变为“看不见”,以不至成为好事者攻击的目标。

      (1)数据保密

      在因特网上防止非授权用户截获并使用传输的一些秘密数据,是网络安全的一个重要内容。信息隐藏技术在军事上的应用,可以将一些不愿为人所知的重要标识信息用信息隐藏的方式进行隐蔽存储,像军事地图中标明的军备部署、打击目标,卫星遥感图像的拍摄日期、经纬度等等,都可用隐藏标记的方法使其以不可见的形式隐藏起来,只有掌握识别软件的人才能读出标记所在。

      (2)数据保护

      数据保护主要是保证传输信息的完整性。由于隐藏的信息是被藏在宿主图像等媒体的内容中,而不是文件头等处,因而不会因格式的变换而遭到破坏。同时隐藏的信息具有很强的对抗非法探测和非法破解的能力,可以对数据起到安全保护的作用。对于数据完整性的验证是要确认数据在网上传输或存储过程中并没有被窜改。通过使用脆弱水印技术保护的媒体一旦被窜改就会破坏水印,从而很容易被识别。

      (3)数据免疫

      所谓免疫是指不因宿主文件经历了某些变化或处理而导致隐藏信息丢失的能力。某些变化和处理包括:传输过程中的信道噪声干扰,过滤操作,再取样,再量化,数/模、模/数转换,无损、有损压缩,剪切,位移等。


    作者:Daniel
    来源:CSDN 
    版权声明:本文为原创文章,转载请附上博文链接:
    https://blog.csdn.net/qq_26464039/article/details/85779870


    展开全文
  • IOS开发中UIBarButtonItem上按钮切换或隐藏案例实现案例是本文要介绍的内容,这个代码例子的背景是:导航条右侧有个 edit button,左侧是 back button 和 add button。 AD:【线下活动】三大新锐HTML 5企业汇聚51...

    IOS开发中UIBarButtonItem上按钮切换或隐藏案例实现案例是本文要介绍的内容,这个代码例子的背景是:导航条右侧有个 edit button,左侧是 back button 和 add button。

    AD:【线下活动】三大新锐HTML 5企业汇聚51CTO—大话移动前端技术

    IOS开发中UIBarButtonItem上按钮切换或隐藏案例实现案例是本文要介绍的内容,这个代码例子的背景是:导航条右侧有个 edit button,左侧是 back button 和 add button。代码实现的按钮切换/隐藏功能具体就是:点击 edti button 的话,back button 隐藏,同时显示 add button。

    用户编辑完以后则显示 back button 隐藏 add button。这一功能在很多应用里都会用到,而且适当隐藏掉无用按钮对保持界面简洁以及引导用户操作都是有意义的。

    代码

    1. - (void)viewDidLoad {  
    2. [super viewDidLoad];  
    3. selfself.navigationItem.rightBarButtonItem = self.editButtonItem;  
    4. }  
    5. - (void)setEditing:(BOOL)editing animated:(BOOL)animated {  
    6.  
    7.     [super setEditing:editing animated:animated];  
    8.  
    9. // Don't show the Back button while editing.  
    10. [self.navigationItem setHidesBackButton:editing animated:YES];  
    11.  
    12. if (editing) {  
    13. self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
    14. target:self action:@selector(insertMe)] autorelease];  
    15. }else {  
    16. self.navigationItem.leftBarButtonItem = nil;  
    17. //self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel 
    18. target:self action:@selector(backButton) ] autorelease];  
    19. }  
    20.  

    其中 back button 是系统默认的,去掉 else 里面的注释,就可以加入其他按钮

    展开全文
  • Web渗透技术及实战案例解析 PDF 分享

    千次阅读 2019-07-14 15:20:31
    链接:...         提取码:b9p1 ...黑客攻防技术宝典:系统实战篇(第2版) Android安全攻防权威指南 Python灰帽子 黑客与逆向工程师的P...

    链接:https://pan.baidu.com/s/1XsI2AemiPZH0UqFRfQZIjw           提取码:b9p1

    相关推荐
    WEB之困-现代WEB应用安全指南
    黑客攻防技术宝典:系统实战篇(第2版)
    Android安全攻防权威指南
    Python灰帽子 黑客与逆向工程师的Python编程之道
    代码审计:企业级Web代码安全架构

    在这里插入图片描述

    《Web渗透技术及实战案例解析》是2012年电子工业出版社出版的图书,作者是陈小兵、范渊、孙立伟。本书从Web渗透的专业角度,结合网络安全中的实际案例,图文并茂地再现Web渗透的精彩过程。

    《Web渗透技术及实战案例解析》从Web渗透的专业角度,结合网络安全中的实际案例,图文并茂地再现Web渗透的精彩过程。《Web渗透技术及实战案例解析》共分7章,由浅入深地介绍和分析了目前网络流行的Web渗透攻击方法和手段,并结合作者多年的网络安全实践经验给出了相对应的安全防范措施,对一些经典案例还给出了经验总结和技巧,通过阅读《Web渗透技术及实战案例解析》可以快速掌握目前Web渗透的主流技术。《Web渗透技术及实战案例解析》最大的特色就是实用和实战性强,思维灵活。内容主要包括Web渗透必备技术、Google黑客技术、文件上传渗透技术、SQL注入、高级渗透技术、0day攻击和Windows提权与安全防范等。
    《Web渗透技术及实战案例解析》内容丰富包括Web渗透必备技术,Google黑客技术,文件上传渗透技术,SOL注入,高级渗透技术,Oday攻防,Windows提权与安全防范等。

    内容简介
    本书共分7章,由浅入深地介绍和分析了目前网络流行的Web渗透攻击方法和手段,并结合作者多年的网络安全实践经验给出了相对应的安全防范措施,对一些经典案例还给出了经验总结和技巧,通过阅读本书可以快速掌握目前Web渗透的主流技术。本书最大的特色就是实用和实战性强,思维灵活。内容主要包括Web渗透必备技术、Google黑客技术、文件上传渗透技术、SQL注入、高级渗透技术、0day攻击和Windows提权与安全防范等。
    前言
    经过近一年时间的艰辛苦战,终于将本书完成。本书是我写的第三本书,主要从Web渗透的专业角度来讨论网络安全的攻防技术,尽可能地再现Web渗透场景,每一个小节都代表某一个场景,此书是我工作数年的总结,最后终于不辱使命将所有成果放在本书中与大家分享。
    本书是在我上一本书《黑客攻防及实战案例解析》基础上的又一本安全类书籍,主要讨论Web渗透攻防技术。攻击与防护是辩证统一的关系,掌握了攻击技术,也就掌握了防护技术。Web渗透是网络安全攻防的最热门技术,通过渗透Web服务器,利用已有信息,逐渐深入公司或者大型网络,最终完成渗透目标。
    最近二年来网络安全特别火爆,可以说从事网络安全还是蛮有前途的职业之一。目前网络安全界非常缺人,特别是在2011年CSDN、天涯等大型网站用户数据库泄露后,各大公司对安全人士求贤若渴,掌握网络安全攻防技术,拥有丰富经验的从业人员,年薪一般在10万以上,能够独立挖掘漏洞的从业人员年薪一般在20万以上。其实Web安全渗透技术也不是那么高不可攀,只要自己锁定这个方向,持之以恒,不断地进行试验和研究,终将成为一名高手,而且安全攻防技术还跟学历无关,很多技术高手都没有上过大学。
    Web渗透攻防技术可以通过以下方法来自学,一是通过安全站点漏洞更新通告、安全文章,了解漏洞的形成原理和利用过程,掌握漏洞的核心原理;二是在本地搭建试验环境进行实际测试,掌握漏洞利用方法;三是在互联网上对存在漏洞的站点进行实际操作,在真实环境下进行验证,提出修补漏洞的方法。在技术研究的同时还要做好记录,总结失败和成功的方法,积累技巧和经验,我曾经看过一位牛人,Web漏洞收集超过10GB数据!
    本书以Web渗透攻击与防御为主线,主要通过典型的渗透实际案例来介绍Web渗透和防御技术,在每一个小节中除了技术原理外,还对这些技术进行总结和提炼,掌握和理解这些技术后,读者在遇到类似的渗透场景时可以自己去进行渗透。本书采用最为通俗易懂的图文解说,按照书中的步骤即可还原当时的攻防情景。通过阅读本书,初学者可以很快掌握Web攻防的流程、最新的一些技术和方法,有经验的读者可以在技术上更上一层楼,使攻防技术从理论和实践中更加系统化,同时可以使用本书中介绍的一些防御方法来加固服务器系统。
    本书共分为7章,由浅入深,依照Web攻防的一些技术特点安排内容,每一小节都是一个具体Web攻防技术的典型应用,同时结合案例给予讲解,并给出一些经典的总结。本书主要内容安排如下。
    第1章 Web渗透必备技术
    介绍Web渗透的一些必备的基本知识,创建和使用VPN隐藏自己,获取操作系统密码、破解MD5密码、破解MySQL密码、数据库还原等,这些技术可以在Web渗透中使用,也可以在网络管理中使用。
    第2章 Google——我爱你又恨你
    利用Google等搜索引擎技术来获取信息,辅助Web渗透,在某些场景中往往会起到意想不到的效果,也被称为Nday攻击(0day后的数天持续攻击)。在进行Web攻防技术研究的同时,可以通过Google来进行实际演练,最好的效果就是网上爆出漏洞后利用Goolge技术来抓肉鸡。
    第3章 都是上传惹的祸
    上传是Web渗透中最容易获得WebShell的捷径之一,在本章中介绍了如何利用WebEditor、FCKeditor、CuteEditor等典型编辑器漏洞来获取WebShell的方法,同时还对登录绕过后通过Flash上传、文件上传等方法来获取WebShell进行探讨。
    第4章 SQL注入——渗透主乐章
    SQL注入是Web渗透的核心技术,本章主要介绍使用SQL注入方法获取WebShell,穿插介绍使用多种扫描软件、攻击工具来渗透Web服务器并提权。
    第5章 高级渗透技术
    本章介绍如何充分利用多种技术组合,结合巧妙的思路,最终成功渗透一些高难度的Web服务器。
    第6章 0day攻击
    0day是Web渗透中的“神器”,几乎是无往不胜,所向披靡,本章介绍利用Discuz!6.0、Discuz!7.2、Discuz!NT、PHP168、WordPress、Citrix、Art2008cms、Phpcms2008sp4等0day渗透Web服务器的一些方法。
    第7章 Windows提权与安全防范
    获取WebShell后,获得服务器权限一直是Web渗透的终极目标,本章对主流的一些提权方法进行介绍,掌握这些方法和原理后,可以举一反三,触类旁通。最后还对如何设置一个安全“变态”的Web服务器进行介绍。
    虽然本书内容已经很丰富与完整,但仍然无法涵盖所有的Web渗透的技术,但通过本书的学习,可以快速了解和掌握Web渗透技术,加固自己的服务器。本书的目的是通过Web渗透技术并结合一些案例来探讨网络安全,更好地加固Web服务器、远离黑客的威胁。

    目录
    第1章 Web渗透必备技术
    第2章 Google ——爱你又恨你
    第3章 都是文件上传惹的祸
    第4章 SQL注入——渗透主乐章
    第5章 高级渗透技术
    第6章 0day攻击
    第7章 Windows提权与安全防范

    展开全文
  • JavaWeb案例——用户信息管理系统

    万次阅读 多人点赞 2019-08-28 22:56:23
    概要设计2.1 技术选型2.2 数据库设计2.3 分页展示用户功能设计2.4 添加用户功能设计2.5 删除用户功能设计2.6 删除选中用户功能设计2.7 修改用户功能设计2.8 查询用户功能设计3. 开发阶段3.1 环境搭建3.2 前端代码...

    需要源码的同学私信我吧,打赏我 20 元吃顿饭就好,万分感谢。

    1. 需求分析

    1. 完成一个用户信息管理系统(基于 BS 架构),功能如下:

      • 分页展示用户信息
      • 添加用户信息
      • 删除用户信息(可以删除选中用户)
      • 修改用户信息(包括用户数据的回显)
      • 查询用户信息(可以输入条件,模糊查询)
    2. 效果图如下:

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    2. 概要设计

    2.1 技术选型

    • Tomcat 服务器
    • Servlet
    • JSP
    • Bootstrap
    • Mysql 数据库
    • Spring JDBC
    • Druid 连接池
    • BeanUtils

    2.2 数据库设计

    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) NOT NULL,
      `gender` varchar(5) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      `address` varchar(32) DEFAULT NULL,
      `qq` varchar(20) DEFAULT NULL,
      `email` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    

    2.3 分页展示用户功能设计

    在这里插入图片描述

    在这里插入图片描述

    2.4 添加用户功能设计

    在这里插入图片描述

    2.5 删除用户功能设计

    在这里插入图片描述

    2.6 删除选中用户功能设计

    在这里插入图片描述

    2.7 修改用户功能设计

    在这里插入图片描述

    2.8 查询用户功能设计

    在这里插入图片描述

    3. 开发阶段

    3.1 环境搭建

    1. 创建数据库环境

      1. 打开 Navicat,新建一个数据库 day17
      2. 创建 user 表(表的结构概要设计中已给出)
    2. 创建项目

      打开 IDEA,创建一个 Java EE 项目,Java EE version 为 Java EE 7,勾选 Web Application,不勾选 Create web.xml,项目名称为 day17_2

    3. 导入需要的 jar 包

      导入需要的 jar 包到 web/WEB-INF/lib 中,右键 Add as Library

      • commons-beanutils-1.8.3.jar
      • jstl-impl.jar
      • commons-logging-1.1.1.jar
      • spring-core-4.2.4.RELEASE.jar
      • spring-beans-4.2.4.RELEASE.jar
      • javax.servlet.jsp.jstl.jar
      • druid-1.0.9.jar
      • spring-jdbc-4.2.4.RELEASE.jar
      • mysql-connector-java-5.1.18-bin.jar
      • spring-tx-4.2.4.RELEASE.jar
    4. 创建配置文件

      在 src 下创建 Druid 配置文件 druid.properties

      driverClassName=com.mysql.jdbc.Driver
      url=jdbc:mysql://127.0.0.1:3306/day17
      username=root
      password=123456
      initialSize=5
      maxActive=10
      maxWait=3000
      
      
    5. 修改 Tomcat 配置

      1. 热部署:将 On ‘Update’ action 修改为 Redeploy 和 On frame deactivation 修改为 Update classes and resourses
      2. 修改端口号:将 HTTP Port 修改为 80
      3. 修改虚拟目录:将 Application context 修改为 /day17_2

    3.2 前端代码

    1. 将 Bootstrap 相关的 css,fonts,js 三个文件夹复制到 web 目录下

    2. 首页 index.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <!DOCTYPE html>
      <html lang="zh-CN">
      <head>
        <meta charset="utf-8"/>
        <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
        <meta name="viewport" content="width=device-width, initial-scale=1"/>
        <title>首页</title>
      
        <!-- 1. 导入CSS的全局样式 -->
        <link href="css/bootstrap.min.css" rel="stylesheet">
        <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
        <script src="js/jquery-2.1.0.min.js"></script>
        <!-- 3. 导入bootstrap的js文件 -->
        <script src="js/bootstrap.min.js"></script>
        <script type="text/javascript">
        </script>
      </head>
      <style>
        div{
          text-align: center;
        }
        a{
          font-size:33px;
        }
      </style>
      <body>
      <div>
        <a
              href="${pageContext.request.contextPath}/FindUserByPageServlet">进入用户信息管理系统
        </a>
      </div>
      </body>
      </html>
      
    3. 用户信息列表页面 list.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <!DOCTYPE html>
      <!-- 网页使用的语言 -->
      <html lang="zh-CN">
      <head>
          <!-- 指定字符集 -->
          <meta charset="utf-8">
          <!-- 使用Edge最新的浏览器的渲染方式 -->
          <meta http-equiv="X-UA-Compatible" content="IE=edge">
          <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
          width: 默认宽度与设备的宽度相同
          initial-scale: 初始的缩放比,为1:1 -->
          <meta name="viewport" content="width=device-width, initial-scale=1">
          <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
          <title>用户信息管理系统</title>
      
          <!-- 1. 导入CSS的全局样式 -->
          <link href="css/bootstrap.min.css" rel="stylesheet">
          <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
          <script src="js/jquery-2.1.0.min.js"></script>
          <!-- 3. 导入bootstrap的js文件 -->
          <script src="js/bootstrap.min.js"></script>
          <style>
              h3 {
                  text-align: center;
              }
      
              #search {
                  float: left;
                  margin: 10px;
              }
      
              #search div {
                  margin-right: 5px;
              }
      
              #add_del {
                  float: right;
                  margin: 10px;
              }
      
              #add_del a {
                  margin-left: 5px;
              }
      
              td, th {
                  text-align: center;
              }
      
              #paging_info {
                  font-size: 15px;
                  margin-left: 10px;
                  line-height: 35px;
              }
          </style>
          <script>
              function deleteUser(id) {
                  //用户安全提示
                  if (confirm("您确定要删除吗?")) {
                      //访问路径
                      location.href = "${pageContext.request.contextPath}/DelUserServlet?id=" + id;
                  }
              }
      
              window.onload = function () {
                  // 给删除选中按钮添加删除事件
                  document.getElementById("delSelected").onclick = function () {
                      if (confirm("您确定要删除吗?")) {
                          var flag = false;
                          // 判断是否有选中条目
                          var cbs = document.getElementsByName("id");
                          for (var i = 0; i < cbs.length; i++) {
                              if (cbs[i].checked) {
                                  // 有一个条目选中了
                                  flag = true;
                                  break;
                              }
                          }
                          // 有条目被选中
                          if (flag) {
                              // 表单提交
                              document.getElementById("form").submit();
                          }
                      }
                  }
      
                  // 全选按钮
                  // 1.获取第一个 cb
                  document.getElementById("firstCb").onclick = function () {
                      //2.获取下边列表中所有的 cb
                      var cbs = document.getElementsByName("id");
                      //3.遍历
                      for (var i = 0; i < cbs.length; i++) {
                          //4.设置这些cbs[i]的checked状态 = firstCb.checked
                          cbs[i].checked = this.checked;
      
                      }
      
                  }
              }
          </script>
      </head>
      <body>
      <div class="container">
          <%--标题--%>
          <h3>用户信息列表</h3>
      
          <%--查询用户信息--%>
          <form id="search" class="form-inline" action="${pageContext.request.contextPath}/FindUserByPageServlet" method="post">
              <div class="form-group">
                  <label for="exampleInputName2">姓名</label>
                  <input type="text" name="name" value="${condition.name[0]}" class="form-control" id="exampleInputName2">
              </div>
              <div class="form-group">
                  <label for="exampleInputName3">籍贯</label>
                  <input type="text" name="address" value="${condition.address[0]}" class="form-control" id="exampleInputName3">
              </div>
              <div class="form-group">
                  <label for="exampleInputEmail2">Email</label>
                  <input type="email" name="email" value="${condition.email[0]}" class="form-control" id="exampleInputEmail2">
              </div>
              <div class="form-group">
                  <button type="submit" class="btn btn-default">查询</button>
              </div>
          </form>
      
          <%--增加和删除用户信息按钮--%>
          <div id="add_del">
              <a class="btn btn-primary" href="${pageContext.request.contextPath}/add.jsp">添加用户</a>
              <a class="btn btn-primary" href="javascript:void(0);" id="delSelected">删除选中</a>
          </div>
              
          <%--用户信息表单--%>
          <form id="form" action="${pageContext.request.contextPath}/DelSelectedServlet" method="post">
              <table border="1" class="table table-bordered table-hover">
                  <tr class="success">
                      <th><input type="checkbox" id="firstCb"></th>
                      <th>编号</th>
                      <th>姓名</th>
                      <th>性别</th>
                      <th>年龄</th>
                      <th>籍贯</th>
                      <th>QQ</th>
                      <th>邮箱</th>
                      <th>操作</th>
                  </tr>
                  <c:forEach items="${userByPage.list}" var="user" varStatus="s">
                      <tr>
                          <td><input type="checkbox" name="id" value="${user.id}"></td>
                          <td>${s.count}</td>
                          <td>${user.name}</td>
                          <td>${user.gender}</td>
                          <td>${user.age}</td>
                          <td>${user.address}</td>
                          <td>${user.qq}</td>
                          <td>${user.email}</td>
                          <td><a class="btn btn-default btn-sm"
                                 href="${pageContext.request.contextPath}/FindUserServlet?id=${user.id}">修改</a>&nbsp;
                              <a class="btn btn-default btn-sm" href="javascript:deleteUser(${user.id});">删除</a>
                          </td>
                      </tr>
                  </c:forEach>
              </table>
          </form>
      
          <%--分页--%>
          <nav>
              <ul class="pagination">
                  <%--上一页--%>
                  <c:if test="${userByPage.currentPage == 1}">
                      <li class="disabled">
                          <a href="#" aria-label="Previous">
                              <span aria-hidden="true">&laquo;</span>
                          </a>
                      </li>
                  </c:if>
                  <c:if test="${userByPage.currentPage != 1}">
                      <li>
                          <a href="${pageContext.request.contextPath}/FindUserByPageServlet?currentPage=${userByPage.currentPage-1}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}"
                             aria-label="Previous">
                              <span aria-hidden="true">&laquo;</span>
                          </a>
                      </li>
                  </c:if>
                  <%--第 n 页面--%>
                  <c:forEach begin="1" end="${userByPage.totalPage}" step="1" var="i">
                      <c:if test="${userByPage.currentPage == i}">
                          <li class="active">
                              <a href="${pageContext.request.contextPath}/FindUserByPageServlet?currentPage=${i}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}">${i}</a>
                          </li>
                      </c:if>
                      <c:if test="${userByPage.currentPage != i}">
                          <li>
                              <a href="${pageContext.request.contextPath}/FindUserByPageServlet?currentPage=${i}&rows=5&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}">${i}</a>
                          </li>
                      </c:if>
                  </c:forEach>
                  <%--下一页--%>
                  <c:if test="${userByPage.currentPage == userByPage.totalPage}">
                      <li class="disabled">
                          <a href="#" aria-label="Next">
                              <span aria-hidden="true">&raquo;</span>
                          </a>
                      </li>
                  </c:if>
                  <c:if test="${userByPage.currentPage != userByPage.totalPage}">
                      <li>
                          <a href="${pageContext.request.contextPath}/FindUserByPageServlet?currentPage=${userByPage.currentPage+1}&rows=5&&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}"
                             aria-label="Next">
                              <span aria-hidden="true">&raquo;</span>
                          </a>
                      </li>
                  </c:if>
                  <%--分页信息--%>
                  <span id="paging_info">共${userByPage.totalCount}条记录,共${userByPage.totalPage}页</span>
              </ul>
          </nav>
      </div>
      </body>
      </html>
      
      
    4. 添加用户页面 add.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <!-- HTML5文档-->
      <!DOCTYPE html>
      <!-- 网页使用的语言 -->
      <html lang="zh-CN">
      <head>
          <!-- 指定字符集 -->
          <meta charset="utf-8">
          <!-- 使用Edge最新的浏览器的渲染方式 -->
          <meta http-equiv="X-UA-Compatible" content="IE=edge">
          <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
          width: 默认宽度与设备的宽度相同
          initial-scale: 初始的缩放比,为1:1 -->
          <meta name="viewport" content="width=device-width, initial-scale=1">
          <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
          <title>添加用户</title>
      
          <!-- 1. 导入CSS的全局样式 -->
          <link href="css/bootstrap.min.css" rel="stylesheet">
          <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
          <script src="js/jquery-2.1.0.min.js"></script>
          <!-- 3. 导入bootstrap的js文件 -->
          <script src="js/bootstrap.min.js"></script>
          <style>
              #add {
                  width:400px;
              }
              h3 {
                  text-align: center;
              }
              #btn {
                  text-align: center;
              }
          </style>
      </head>
      <body>
      <div class="container" id="add">
          <h3>添加用户</h3>
      
          <form action="${pageContext.request.contextPath}/AddUserServlet" method="post">
              <div class="form-group">
                  <label for="name">姓名:</label>
                  <input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名">
              </div>
      
              <div class="form-group">
                  <label>性别:</label>
                  <input type="radio" name="gender" value="男" checked="checked"/>男
                  <input type="radio" name="gender" value="女"/>女
              </div>
      
              <div class="form-group">
                  <label for="age">年龄:</label>
                  <input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄">
              </div>
      
              <div class="form-group">
                  <label for="address">籍贯:</label>
                  <select name="address" class="form-control" id="address">
                      <option value="北京">北京</option>
                      <option value="上海">上海</option>
                      <option value="广州">广州</option>
                  </select>
              </div>
      
              <div class="form-group">
                  <label for="qq">QQ:</label>
                  <input type="text" class="form-control" id="qq" name="qq" placeholder="请输入QQ号码"/>
              </div>
      
              <div class="form-group">
                  <label for="email">Email:</label>
                  <input type="text" class="form-control" id="email" name="email" placeholder="请输入邮箱地址"/>
              </div>
      
              <div class="form-group" id="btn">
                  <input class="btn btn-primary" type="submit" value="提交" />
                  <input class="btn btn-default" type="reset" value="重置" />
                  <a class="btn btn-default" href="${pageContext.request.contextPath}/FindUserByPageServlet">返回</a>
              </div>
          </form>
      </div>
      </body>
      </html>
      
    5. 修改用户页面 update.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <!DOCTYPE html>
      <!-- 网页使用的语言 -->
      <html lang="zh-CN">
      <head>
          <!-- 指定字符集 -->
          <meta charset="utf-8">
          <meta http-equiv="X-UA-Compatible" content="IE=edge">
          <meta name="viewport" content="width=device-width, initial-scale=1">
          <title>修改用户</title>
      
          <link href="css/bootstrap.min.css" rel="stylesheet">
          <script src="js/jquery-2.1.0.min.js"></script>
          <script src="js/bootstrap.min.js"></script>
      
      </head>
      <style>
          #update {
              width:400px;
          }
          h3 {
              text-align: center;
          }
          #btn {
              text-align: center;
          }
      </style>
      <body>
      <div class="container" id="update">
          <h3>修改用户</h3>
          <form action="${pageContext.request.contextPath}/UpdateUserServlet" method="post">
              <%--隐藏域提交 id--%>
              <input type="hidden" name="id" value="${user.id}">
      
              <div class="form-group">
                  <label for="name">姓名:</label>
                  <input type="text" class="form-control" id="name" name="name" value="${user.name}" readonly="readonly" placeholder="请输入姓名" />
              </div>
      
              <div class="form-group">
                  <label>性别:</label>
                  <c:if test="${user.gender == '男'}">
                      <input type="radio" name="gender" value="男" checked />男
                      <input type="radio" name="gender" value="女" />女
                  </c:if>
                  <c:if test="${user.gender == '女'}">
                      <input type="radio" name="gender" value="男" />男
                      <input type="radio" name="gender" value="女" checked />女
                  </c:if>
              </div>
      
              <div class="form-group">
                  <label for="age">年龄:</label>
                  <input type="text" class="form-control" id="age"  name="age" value="${user.age}" placeholder="请输入年龄" />
              </div>
      
              <div class="form-group">
                  <label for="address">籍贯:</label>
                  <select name="address" class="form-control" id="address">
                      <c:if test="${user.address == '北京'}">
                          <option value="北京" selected>北京</option>
                          <option value="上海">上海</option>
                          <option value="广州">广州</option>
                      </c:if>
                      <c:if test="${user.address == '上海'}">
                          <option value="北京">北京</option>
                          <option value="上海" selected>上海</option>
                          <option value="广州">广州</option>
                      </c:if>
                      <c:if test="${user.address == '广州'}">
                          <option value="北京">北京</option>
                          <option value="上海">上海</option>
                          <option value="广州" selected>广州</option>
                      </c:if>
                  </select>
              </div>
      
              <div class="form-group">
                  <label for="qq">QQ:</label>
                  <input type="text" class="form-control" id="qq" name="qq" value="${user.qq}" placeholder="请输入QQ号码"/>
              </div>
      
              <div class="form-group">
                  <label for="email">Email:</label>
                  <input type="text" class="form-control" id="email" name="email" value="${user.email}" placeholder="请输入邮箱地址"/>
              </div>
      
              <div class="form-group" id="btn">
                  <input class="btn btn-primary" type="submit" value="提交" />
                  <input class="btn btn-default" type="reset" value="重置" />
                  <a class="btn btn-default" href="${pageContext.request.contextPath}/FindUserByPageServlet">返回</a>
              </div>
          </form>
      </div>
      </body>
      </html>
      
      

    3.3 后端代码

    1. 在 src 中创建 com.zt 包,在其中创建以下包:

      • utils
      • domain
      • dao
        • impl
      • service
        • impl
      • web
        • servlet
    2. utils 包

      • JDBCUtils

        package com.zt.utils;
        
        import com.alibaba.druid.pool.DruidDataSourceFactory;
        
        import javax.sql.DataSource;
        import java.io.IOException;
        import java.io.InputStream;
        import java.sql.Connection;
        import java.sql.ResultSet;
        import java.sql.SQLException;
        import java.sql.Statement;
        import java.util.Properties;
        
        public class JDBCUtils {
        
            // 1.定义静态变量 dataSource
            private static DataSource dataSource;
        
            static {
                try {
                    // 2.加载配置文件
                    Properties properties = new Properties();
                    InputStream resourceAsStream = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
                    properties.load(resourceAsStream);
                    // 3.创建数据库连接池对象,并赋值给 dataSource
                    dataSource = DruidDataSourceFactory.createDataSource(properties);
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        
            /**
             * 获取连接池方法
             */
            public static DataSource getDataSource() {
                return dataSource;
            }
        
            /**
             * 通过数据库连接池获取连接对象
             */
            public static Connection getConnection() throws SQLException {
                return dataSource.getConnection();
            }
        
            /**
             * 释放资源
             */
            public static void close(ResultSet resultSet, Statement statement, Connection connection) {
                if (resultSet != null) {
                    try {
                        resultSet.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if (statement != null) {
                    try {
                        statement.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
                if (connection != null) {
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        
            public static void close(Statement statement, Connection connection) {
                close(null, statement, connection);
            }
        
        
        }
        
        
    3. domain 包

      • User

        package com.zt.domain;
        
        /**
         * 用户对象
         */
        public class User {
            private int id;
            private String name;
            private String gender;
            private int age;
            private String address;
            private String qq;
            private String email;
        
            public int getId() {
                return id;
            }
        
            public void setId(int id) {
                this.id = id;
            }
        
            public String getName() {
                return name;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public String getGender() {
                return gender;
            }
        
            public void setGender(String gender) {
                this.gender = gender;
            }
        
            public int getAge() {
                return age;
            }
        
            public void setAge(int age) {
                this.age = age;
            }
        
            public String getAddress() {
                return address;
            }
        
            public void setAddress(String address) {
                this.address = address;
            }
        
            public String getQq() {
                return qq;
            }
        
            public void setQq(String qq) {
                this.qq = qq;
            }
        
            public String getEmail() {
                return email;
            }
        
            public void setEmail(String email) {
                this.email = email;
            }
        
            @Override
            public String toString() {
                return "User{" +
                        "id=" + id +
                        ", name='" + name + '\'' +
                        ", gender='" + gender + '\'' +
                        ", age=" + age +
                        ", address='" + address + '\'' +
                        ", qq='" + qq + '\'' +
                        ", email='" + email + '\'' +
                        '}';
            }
        
        
        }
        
        
      • PageBean

        package com.zt.domain;
        
        import java.util.List;
        
        /**
         * 分页对象
         */
        public class PageBean<T> {
            private int totalCount; // 总记录数
            private int totalPage; // 总页码数
            private int currentPage; // 当前页码
            private int rows; // 每页显示的条数
            private List<T> list; // 每页的数据
        
            public int getTotalCount() {
                return totalCount;
            }
        
            public void setTotalCount(int totalCount) {
                this.totalCount = totalCount;
            }
        
            public int getTotalPage() {
                return totalPage;
            }
        
            public void setTotalPage(int totalPage) {
                this.totalPage = totalPage;
            }
        
            public int getCurrentPage() {
                return currentPage;
            }
        
            public void setCurrentPage(int currentPage) {
                this.currentPage = currentPage;
            }
        
            public int getRows() {
                return rows;
            }
        
            public void setRows(int rows) {
                this.rows = rows;
            }
        
            public List<T> getList() {
                return list;
            }
        
            public void setList(List<T> list) {
                this.list = list;
            }
        
            @Override
            public String toString() {
                return "PageBean{" +
                        "totalCount=" + totalCount +
                        ", totalPage=" + totalPage +
                        ", currentPage=" + currentPage +
                        ", rows=" + rows +
                        ", list=" + list +
                        '}';
            }
        }
        
        
    4. dao 包

      • UserDao

        package com.zt.dao;
        
        import com.zt.domain.User;
        
        import java.util.List;
        import java.util.Map;
        
        public interface UserDao {
        
            /**
             * 添加用户信息
              * @param user
             */
            public void add(User user);
        
            /**
             * 删除用户信息
             * @param id
             */
            public void delete(int id);
        
            /**
             * 查询用户信息
             * @param id
             * @return
             */
            public User find(int id);
        
            /**
             * 更新用户信息
             * @param user
             */
            public void update(User user);
        
            /**
             * 查询总记录数
             * @return
             * @param condition
             */
            public int findTotalCount(Map<String, String[]> condition);
        
            /**
             * 分页条件查询用户信息
             * @param start
             * @param rows
             * @param condition
             * @return
             */
            public List<User> findByPage(int start, int rows, Map<String, String[]> condition);
        }
        
        
      • UserDaoImpl

        package com.zt.dao.impl;
        
        import com.zt.dao.UserDao;
        import com.zt.domain.User;
        import com.zt.utils.JDBCUtils;
        import org.springframework.jdbc.core.BeanPropertyRowMapper;
        import org.springframework.jdbc.core.JdbcTemplate;
        
        import java.util.ArrayList;
        import java.util.List;
        import java.util.Map;
        import java.util.Set;
        
        public class UserDaoImpl implements UserDao {
            // 使用 Spring JDBC 操作数据库
            private JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDataSource());
        
            @Override
            public void add(User user) {
                String sql = "insert into user values(null,?,?,?,?,?,?)";
                jdbcTemplate.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail());
            }
        
            @Override
            public void delete(int id) {
                String sql = "delete from user where id = ?";
                jdbcTemplate.update(sql,id);
            }
        
            @Override
            public User find(int id) {
                String sql = "select * from user where id = ?";
                User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), id);
                return user;
            }
        
            @Override
            public void update(User user) {
                String sql = "update user set name = ?, gender = ?, age = ?, address = ?, qq = ?, email = ? where id = ?";
                jdbcTemplate.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail(),user.getId());
            }
        
            @Override
            public int findTotalCount(Map<String, String[]> condition) {
                // 1.定义初始化 sql,注意 sql语句后加空格
                String sql = "select count(*) from user where 1 = 1 ";
                StringBuilder stringBuilder = new StringBuilder(sql);
                // 2.定义参数的集合 params
                List<Object> params = new ArrayList<Object>();
                // 3.遍历 condition
                Set<String> keySet = condition.keySet();
                for (String key : keySet) {
                    // 排除分页条件参数
                    if("currentPage".equals(key) || "rows".equals(key)){
                        continue;
                    }
                    // 获取 value
                    String value = condition.get(key)[0];
                    // 判断 value 是否有值
                    if(value != null || !"".equals(value)){
                        // 给 sql 附加条件语句,注意 sql语句前后加空格
                        stringBuilder.append(" And " + key +" like ? ");
                        // 将 value 放入 params 集合
                        params.add("%"+value+"%");
                    }
                }
        
                return jdbcTemplate.queryForObject(stringBuilder.toString(), Integer.class, params.toArray());
            }
        
            @Override
            public List<User> findByPage(int start, int rows, Map<String, String[]> condition) {
                // 1.定义初始化 sql,注意 sql语句后加空格
                String sql = "select * from user where 1 = 1 ";
                StringBuilder stringBuilder = new StringBuilder(sql);
                // 2.定义参数的集合 params
                List<Object> params = new ArrayList<Object>();
                // 3.遍历 condition
                Set<String> keySet = condition.keySet();
                for (String key : keySet) {
                    // 排除分页条件参数
                    if("currentPage".equals(key) || "rows".equals(key)){
                        continue;
                    }
                    // 获取 value
                    String value = condition.get(key)[0];
                    // 判断 value 是否有值
                    if(value != null || !"".equals(value)){
                        // 给 sql 附加条件语句,注意 sql语句前后加空格
                        stringBuilder.append(" And " + key +" like ? ");
                        // 将 value 放入 params 集合
                        params.add("%"+value+"%");
                    }
                }
                // 4.添加分页条件
                stringBuilder.append(" limit ?,? ");
                // 5.添加分页条件参数值
                params.add(start);
                params.add(rows);
        
                return jdbcTemplate.query(stringBuilder.toString(), new BeanPropertyRowMapper<User>(User.class), params.toArray());
            }
        }
        
        
    5. service 包

      • UserService

        package com.zt.service;
        
        import com.zt.domain.PageBean;
        import com.zt.domain.User;
        
        import java.util.Map;
        
        public interface UserService {
        
            /**
             * 添加用户信息
             * @param user
             */
            public void addUser(User user);
        
            /**
             * 删除用户信息
             * @param id
             */
            public void deleteUser(String id);
        
            /**
             * 查询用户信息
             * @param id
             */
            public User findUser(String id);
        
            /**
             * 更新用户信息
             * @param user
             */
            public void updateUser(User user);
        
            /**
             * 分页条件查询用户信息
             * @param currentPage
             * @param rows
             * @param condition
             * @return
             */
            public PageBean<User> findUserByPage(String currentPage, String rows, Map<String, String[]> condition);
        
        }
        
        
      • UserServiceImpl

        package com.zt.service.impl;
        
        import com.zt.dao.UserDao;
        import com.zt.dao.impl.UserDaoImpl;
        import com.zt.domain.PageBean;
        import com.zt.domain.User;
        import com.zt.service.UserService;
        
        import java.util.List;
        import java.util.Map;
        
        public class UserServiceImpl implements UserService {
            // 调用 UserDaoImpl 来实现业务逻辑
            private UserDao userDao = new UserDaoImpl();
        
            @Override
            public void addUser(User user) {
                userDao.add(user);
            }
        
            @Override
            public void deleteUser(String id) {
                userDao.delete(Integer.parseInt(id));
            }
        
            @Override
            public User findUser(String id) {
                return userDao.find(Integer.parseInt(id));
            }
        
            @Override
            public void updateUser(User user) {
                userDao.update(user);
            }
        
            @Override
            public PageBean<User> findUserByPage(String currentPage, String rows, Map<String, String[]> condition) {
                int currentPage1 = Integer.parseInt(currentPage);
                int rows1 = Integer.parseInt(rows);
                // 1.创建一个空的 PageBean 对象
                PageBean<User> userPageBean = new PageBean<>();
                // 2.设置属性
                userPageBean.setCurrentPage(currentPage1);
                userPageBean.setRows(rows1);
                // 3.调用 dao 查询总记录数
                int totalCount = userDao.findTotalCount(condition);
                userPageBean.setTotalCount(totalCount);
                // 4.调用 dao 查询 list 集合
                // 计算开始的记录索引
                int start = (currentPage1 - 1) * rows1;
                List<User> byPage = userDao.findByPage(start, rows1, condition);
                userPageBean.setList(byPage);
                // 5.计算总页码数
                int totalPage = totalCount % rows1 == 0 ?  totalCount/rows1 : totalCount/rows1 + 1;
                userPageBean.setTotalPage(totalPage);
        
                return userPageBean;
            }
        }
        
        
    6. servlet 包

      • FindUserByPageServlet

        package com.zt.web.servlet;
        
        import com.zt.domain.PageBean;
        import com.zt.domain.User;
        import com.zt.service.UserService;
        import com.zt.service.impl.UserServiceImpl;
        
        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.Map;
        
        @WebServlet("/FindUserByPageServlet")
        public class FindUserByPageServlet extends HttpServlet {
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // 1.设置编码
                request.setCharacterEncoding("utf-8");
                // 2.获取参数
                String currentPage = request.getParameter("currentPage"); // 当前页码
                String rows = request.getParameter("rows"); // 每页显示条数
                Map<String, String[]> condition = request.getParameterMap();
        
                // 3.参数为空的情况
                if(currentPage == null || "".equals(currentPage)) {
                    currentPage = "1";
                }
                if(rows == null || "".equals(rows)) {
                    rows = "5";
                }
        
                // 4.调用 UserService 完成查询
                UserService userService = new UserServiceImpl();
                PageBean<User> userByPage = userService.findUserByPage(currentPage, rows, condition);
                // 5.将 userByPage 存入 request
                request.setAttribute("userByPage",userByPage);
                // 6.将 condition 存入 request
                request.setAttribute("condition",condition);
                // 7.转发到 list.jsp
                request.getRequestDispatcher("/list.jsp").forward(request,response);
        
            }
        
            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                this.doPost(request, response);
            }
        }
        
        
      • AddUserServlet

        package com.zt.web.servlet;
        
        import com.zt.domain.User;
        import com.zt.service.UserService;
        import com.zt.service.impl.UserServiceImpl;
        import org.apache.commons.beanutils.BeanUtils;
        
        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.InvocationTargetException;
        import java.util.List;
        import java.util.Map;
        
        @WebServlet("/AddUserServlet")
        public class AddUserServlet extends HttpServlet {
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // 1.设置编码
                request.setCharacterEncoding("utf-8");
                // 2.获取参数
                Map<String, String[]> parameterMap = request.getParameterMap();
                // 3.封装对象
                User user = new User();
                try {
                    BeanUtils.populate(user,parameterMap);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
                // 4.调用 UserService 完成添加
                UserService userService = new UserServiceImpl();
                userService.addUser(user);
        
                //5.重定向到 FindUserByPageServlet
                response.sendRedirect(request.getContextPath()+"/FindUserByPageServlet");
            }
        
            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                this.doPost(request, response);
            }
        }
        
        
      • DelUserServlet

        package com.zt.web.servlet;
        
        import com.zt.service.UserService;
        import com.zt.service.impl.UserServiceImpl;
        
        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;
        
        @WebServlet("/DelUserServlet")
        public class DelUserServlet extends HttpServlet {
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // 1.获取参数
                String id = request.getParameter("id");
                // 2.调用 UserService 完成删除
                UserService userService = new UserServiceImpl();
                userService.deleteUser(id);
                // 3.重定向到 FindUserByPageServlet
                response.sendRedirect(request.getContextPath()+"/FindUserByPageServlet");
            }
        
            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                this.doPost(request, response);
            }
        }
        
        
      • DelSelectedServlet

        package com.zt.web.servlet;
        
        import com.zt.service.UserService;
        import com.zt.service.impl.UserServiceImpl;
        
        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;
        
        @WebServlet("/DelSelectedServlet")
        public class DelSelectedServlet extends HttpServlet {
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // 1.获取参数
                String[] ids = request.getParameterValues("id");
                // 2.调用 UserService 完成删除
                UserService userService = new UserServiceImpl();
                for (String id : ids) {
                    userService.deleteUser(id);
                }
                // 3.重定向到 FindUserByPageServlet
                response.sendRedirect(request.getContextPath()+"/FindUserByPageServlet");
        
            }
        
            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                this.doPost(request, response);
            }
        }
        
        
      • FindUserServlet

        package com.zt.web.servlet;
        
        import com.zt.domain.User;
        import com.zt.service.UserService;
        import com.zt.service.impl.UserServiceImpl;
        
        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;
        
        @WebServlet("/FindUserServlet")
        public class FindUserServlet extends HttpServlet {
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // 1.获取参数
                String id = request.getParameter("id");
                // 2.调用 UserService 完成查询
                UserService userService = new UserServiceImpl();
                User user = userService.findUser(id);
                // 3.将 user 存入 request
                request.setAttribute("user",user);
                // 4.转发到 update.jsp
                request.getRequestDispatcher("/update.jsp").forward(request,response);
            }
        
            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                this.doPost(request, response);
            }
        }
        
        
      • UpdateUserServlet

        package com.zt.web.servlet;
        
        import com.zt.domain.User;
        import com.zt.service.UserService;
        import com.zt.service.impl.UserServiceImpl;
        import org.apache.commons.beanutils.BeanUtils;
        
        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.InvocationTargetException;
        import java.util.Map;
        
        @WebServlet("/UpdateUserServlet")
        public class UpdateUserServlet extends HttpServlet {
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // 1.设置编码
                request.setCharacterEncoding("utf-8");
                // 2.获取参数
                Map<String, String[]> parameterMap = request.getParameterMap();
                // 3.封装对象
                User user = new User();
                try {
                    BeanUtils.populate(user,parameterMap);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
                // 4.调用 UserService 完成修改
                UserService userService = new UserServiceImpl();
                userService.updateUser(user);
        
                //5.重定向到 FindUserByPageServlet
                response.sendRedirect(request.getContextPath()+"/FindUserByPageServlet");
            }
        
            protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                this.doPost(request, response);
            }
        }
        
        
    展开全文
  • 好的类接口就像是冰山的尖儿一样,让类的大部分内容都不会暴露出来什么是信息隐藏信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。...
  • 部署案例 单节点 Network 模式部署 多节点 Network 模式部署 多节点 Neutron 模式部署 单节点 Neutron 模式部署 安装 最后前言在继上一个系列博文 &amp;lt;&amp;lt; 用 Flask 来写个轻博客 &amp;gt;&...
  • 本文介绍了如何利用 Microsoft SQL Server 中的 CASE 表达、len、left、right、stuff、concat 等字符串函数实现信息隐藏,也就是将其中部分内容显示为星号(*)。具体案例包括姓名、手机号、身份证号以及银行卡号...
  • 常见信息安全威胁与经典案例

    千次阅读 2020-04-15 18:35:05
    文章目录 信息安全威胁现状 网络战争的开端:“震网”病毒 信息安全攻击事件的演变 安全威胁分类 网络安全威胁 案例 美国Dyn DNS服务遭受DDoS攻击 Mirai病毒发动攻击过程(DDos攻击过程) 扫描 获取控制权限 发起...
  • 信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是透明的。传统的信息隐藏起源于古老的隐写术。如在古希腊战争中,为了安全地传送军事情报,奴隶主...
  • 信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是透明的。传统的信息隐藏起源于古老的隐写术。如在古希腊战争中,为了安全地传送军事情报,奴隶主...
  • 本文源自【大学之旅_谙忆的博客】 本来本篇博客在上个月就已经发表的,但...AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。AJAX = 异步 JavaScript 和 XML。 AJAX 是一种用于创建快速动态网
  • 废话不多说,这回看的是一直很膜拜的李智慧大神写的大型网站技术架构-核心原理与案例分析。简短的读后感极其推荐的一本书,其实我是第二遍读这本书了,第一遍读的时候还没有毕业,读到一半发现很多都没有经历过,便...
  • 信息安全技术】期末复习考点...02密码与隐藏技术测试卷: 02密码与隐藏技术 03数字签名与认证测试卷: 03数字签名与认证 04身份与访问安全测试卷: 04身份与访问安全 05计算机病毒与黑客测试卷: 05计算机病毒与黑客
  • Winform技术要点及案例项目开发小结

    千次阅读 2017-01-17 15:18:35
    近期帮朋友开发了一个小型WINFORM的软件,即在软件窗体中显示相关表格的数据。由于长时期未操作WINFORM了,有点手生,尤其是对于EXCEL...1.winform虽然目前已不再是主流的开发技术, 但对于小型的需求,仍不失为一个
  • //3.5.2隐藏全屏按钮 vrPanoramaView.setFullscreenButtonEnabled(false); //3.5.3.展示全屏 //FULLSCREEN_MONO 全屏模式 //FULLSCREEN_STEREO CardBoard 纸盒 vrPanoramaView.setDisplayMode(VrWidgetView....
  • 文章目录1 情感分析简述2 情感分类2.1 基于语义的情感词典方法2.2 基于机器学习的情感分类方法3 情感检索4 情感抽取5 情感...目前,文本情感分析研究涵盖了包括自然语言处理、文本挖掘、信息检索、信息抽取、机器学习
  • 网站信息页面案例 网站图片信息页面案例 网站友情链接页面案例 网站首页案例 网站注册页面案例 网站后台页面案例 教学导航 教学目标 了解什么是标记语言 教学目标 了解HTML主要特性,主要变化及发展趋势...
  • Android中Xposed框架篇...前文已经介绍了Xposed框架的基本使用规则,本文主要来介绍一个实际案例就是如何通过这个框架来修改系统的地理位置信息来实现隐藏功能,在如今社交工具的发展特别是微信,他有一个实时位置共享
  • 通道取消可动态显示和隐藏,并可动态调整显示颜色   6.一定范围的X轴、全范围Y轴、支持自动X轴、自动Y轴   7.清除图表(实际数据不清除),方便对比跟踪   8.支持将已有的采集数据按照指定规则导出到excel表 ...
  • 1.权限控制:三种权限,分为...5.生产类界面:生产运行状态、工件信息、工件对应的参数套(1对多);6.维护类界面:所有事件与报警,专家可以全面控制并编辑一些维护信息;7.每个界面存在列表则可以导出excel和导入...
  • BootStrap的介绍与案例使用

    万次阅读 2018-09-06 10:31:47
    BootStrap的介绍与案例使用  1.案例一:使用Bootstrap重写网站首页   1.1案例介绍 本案例使用Bootstrap重写首页,整个案例中将使用到Bootstrap 中的各个模块。... 1.2案例相关技术  1.2.1Boo...
  • http://blog.csdn.net/jiangwei0910410003/article/details/52836241一、前言前文已经介绍了Xposed框架的基本使用规则,本文主要来介绍一个实际案例就是如何通过这个框架来修改系统的地理位置信息来实现隐藏功能,...
  • CSS入门学习笔记+案例

    万次阅读 多人点赞 2020-06-16 11:45:19
    CSS入门学习 一、CSS简介 1、什么是CSS CSS:Cascading Style Sheet 层叠样式表 是一组样式设置的规则,用于控制页面的外观样式 2、为什么使用CSS 实现内容与样式的分离,便于团队开发 样式复用,便于网站的后期维护...
  • LoRa是一种低功耗、远距离、低速率无线通信技术,广泛应用与物联网通信领域。 本文在介绍LoRa的基本概述、网络架构与终端的数据收发过程的基础之上,重点拆解LoRa的空口技术:频移键控FSK与扩频通信的基本原理。
  • 这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,...这篇文章将分享APT攻击检测溯源与常见APT组织的攻击案例,并介绍防御措施。希望文章对您有所帮助~
  • VRTK案例讲解

    千次阅读 2017-12-07 20:19:51
    原链接有图片!!! DEMO 1 查询硬件手柄头显 在VRTK插件 的第一个demo 001_CameraRig_VR_PlayArea 案例这个demo 显示的功能: 按下任一手柄上的按键,便载入下一个场景找到demo场景中##Scene Changer##
  • SOA协会和CIO杂志刚刚宣布了SOA案例研究竞赛的优胜者。SynovusFinancial是这次竞赛的全场总冠军,另有几家其他公司分别在各个单项中获得了特别认可。他们是:保险类的Penn NationalInsurance,运输类的Con-way, Inc...
  • 热烈祝贺王家林大咖人工智能领域经典著作《企业级AI技术内幕:深度学习框架开发+机器学习案例实战+Alluxio解密》 清华大学出版社发行上市! 目录大咖心声新书图片内容简介作者简介目录前言/序言新书案例案例一:自研...
  • HTML入门学习笔记+案例

    万次阅读 2020-02-21 15:30:02
    一、HTML简介 ... ...2.作用 制作网页,控制网页和内容的显示 插入图片、音乐、视频、动画等多媒体 ...通过链接来检索信息 ...使用表单获取用户的信息,实现交互 3.版本 W3C:world wide web consortium...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,075
精华内容 15,230
关键字:

信息隐藏技术的案例