
java开发工程狮一枚
我们在使用bootstrap下拉框组件时,有时会有如下需求,比如,下拉框中有分页的需求,如果你点击翻页时那下拉框会自动关闭,再打开下拉框又会重新刷新,这肯定是不满足条件的。所以就会有点击后不关闭的需求。这种需求实现的方法其实不难,就两个步骤: 第一步:在你需要点击后不关闭的组件的标签中加入一个属性:data-stopPropagation="true",例如: <ul class="dropdown-menu" role="menu" id="channel-menu"> <li class="divider"></li> <li id="paging"> <ul class="pagination pagination-sm" style="margin: 0 0;"> <li><a href="#" id="previous" data-stopPropagation="true" onclick="prevPage()">&laquo;</a></li> <!-- <li><a href="#" data-stopPropagation="true">1</a></li> <li><a href="#" data-stopPropagation="true">2</a></li> <li><a href="#" data-stopPropagation="true">3</a></li> <li><a href="#" data-stopPropagation="true">4</a></li> --> <li><a href="#" id="next" data-stopPropagation="true" onclick="nextPage()">&raquo;</a></li> </ul> </li> </ul> 此段代码就是一个下拉框组,在下拉框中有分页设置,在分页部分的每个标签中都添加了data-stopPropagation="true"这个属性。这只是第一步,第二步也很简单。 第二步:在js代码中注册一个监听器,监听具有这个data-stopPropagation属性的标签,点击时不关闭,代码如下: $("ul.dropdown-menu").on("click", "[data-stopPropagation]",function(e) { e.stopPropagation(); }); 这时再去尝试下发现点击后下拉框组不会自动关闭,大功告成。
这几天做了一个前端html页面,基于bootstrap框架开发,里面有个需求就是在输入框中输入字母或者文字时,下拉框自动刷新模糊查询出的信息。最初我的想法是监控键盘上的按键输入,每次输入一个字母后,发送异步请求至服务端进行数据查询。但是后来发现,这种方式做出来会有一个问题,就是这个监控是全局的,也就是页面刷新后,只要你按键盘,就会调用异步请求发送数据,这样跟我的设计思路是有出入的。 然后我查了很多资料,发现有一种方式可以监控某个输入框体中的变化,只要框体内容有变化,就会触发函数。具体实现如下。 首先先写好前端html,前端开发时先引入jquery和bootstrap相关组件: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="../bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="../bootstrap/css/bootstrap-theme.min.css"> <script type="text/javascript" src="../jquery/jquery-1.12.4.min.js"></script> <script type="text/javascript" src="../bootstrap/js/bootstrap.min.js"></script> <script type="text/javascript" src="../include/js/einvoice/einvoice-mobile.js"></script> <title>电子发票相关</title> </head> <body> <div class="container"> <div class="panel panel-primary"> <div class="panel-heading"> <h2 class="panel-title">电子发票申请与下载</h2> </div> <div class="panel-body"> <div class="row"> <div class="col-sm-6 col-md-6 col-lg-6"> <!-- <div class="form-group has-error"style="margin-bottom: 10px;" id="policyNoModule"> <div class="input-group input-group-sm"> <span class="input-group-addon">保单号</span> <input type="text" class="form-control" id="policyNo" placeholder="请输入保单号"> </div><br> </div> --> <!-- <div class="form-group has-success has-feedback"> --> <div id="policyNoInputBox"> <label class="control-label" for="policyNo">保单号</label> <input type="text" class="form-control" aria-describedby="inputSuccess2Status" id="policyNo" placeholder="请输入保单号(必填)"> <!-- <span class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true"></span> <span id="inputSuccess2Status" class="sr-only">(success)</span> --> </div> </div> <div class="col-sm-6 col-md-6 col-lg-6"> <!-- <div class="input-group input-group-sm"> <span class="input-group-addon">产品代码</span> <input type="text" class="form-control" id="productCode" placeholder="请输入产品代码"> </div><br> --> <!-- <div class="form-group has-success has-feedback"> --> <div id="productCodeInputBox"> <label class="control-label" for="productCode">产品代码</label> <input type="text" class="form-control" aria-describedby="inputSuccess2Status" id="productCode" placeholder="请输入产品代码(必填)"> <!-- <span class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true"></span> <span id="inputSuccess2Status" class="sr-only">(success)</span> --> </div> </div> </div> <div class="row"> <div class="col-sm-6 col-md-6 col-lg-6"> <!-- <div class="input-group input-group-sm"> <span class="input-group-addon">发票抬头</span> <input type="text" class="form-control" id="invoiceTitle" placeholder="请输入发票抬头"> </div><br> --> <!-- <div class="form-group has-success has-feedback"> --> <div id="invoiceTitleInputBox"> <label class="control-label" for="invoiceTitle">发票抬头</label> <input type="text" class="form-control" aria-describedby="inputSuccess2Status" id="invoiceTitle" placeholder="请输入发票抬头(必填)"> <!-- <span class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true"></span> <span id="inputSuccess2Status" class="sr-only">(success)</span> --> </div> </div> <div class="col-sm-6 col-md-6 col-lg-6"> <!-- <div class="input-group input-group-sm"> <span class="input-group-addon">纳税人识别号</span> <input type="text" class="form-control" id="taxPayerNo" placeholder="请输入纳税人识别号"> </div><br> --> <!-- <div class="form-group has-success has-feedback"> --> <div id="taxPayerNoInputBox"> <label class="control-label" for="taxPayerNo">纳税人识别号</label> <input type="text" class="form-control" aria-describedby="inputSuccess2Status" id="taxPayerNo" placeholder="请输入纳税人识别号(必填)"> <!-- <span class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true"></span> <span id="inputSuccess2Status" class="sr-only">(success)</span> --> </div> </div> </div> <div class="row"> <div class="col-sm-6 col-md-6 col-lg-6"> <div id="channelNoInputBox"> <label class="control-label" for="channelText">投保渠道</label> <input type="text" class="channel form-control dropdown-toggle" data-toggle="dropdown" aria-describedby="inputSuccess2Status" id="channelText" placeholder="请选择投保渠道(必填)"> <!-- <span class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true"></span> <span id="inputSuccess2Status" class="sr-only">(success)</span> --> <input type="hidden" id="channelNo"> <input type="hidden" id="currentpage" value="1"> <ul class="dropdown-menu" role="menu" id="channel-menu"> <li class="divider"></li> <li id="paging"> <ul class="pagination pagination-sm" style="margin: 0 0;"> <li><a href="#" id="previous" data-stopPropagation="true" onclick="prevPage()">&laquo;</a></li> <!-- <li><a href="#" data-stopPropagation="true">1</a></li> <li><a href="#" data-stopPropagation="true">2</a></li> <li><a href="#" data-stopPropagation="true">3</a></li> <li><a href="#" data-stopPropagation="true">4</a></li> --> <li><a href="#" id="next" data-stopPropagation="true" onclick="nextPage()">&raquo;</a></li> </ul> </li> </ul> </div> </div> <div class="col-sm-6 col-md-6 col-lg-6"> <div id="isPersonalInputBox"> <label class="control-label" for="isPersonalText">发票类型</label> <input type="text" class="channel form-control dropdown-toggle" data-toggle="dropdown" aria-describedby="inputSuccess2Status" id="isPersonalText" placeholder="请选择发票类型"> <!-- <span class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true"></span> <span id="inputSuccess2Status" class="sr-only">(success)</span> --> <input type="hidden" id="isPersonal"> <ul class="dropdown-menu" role="menu"> <li> <a href="#">个人发票</a> <input type="hidden" value="true"> </li> <li> <a href="#">公司发票</a> <input type="hidden" value="false"> </li> </ul> </div> </div> </div> <div class="form-group"> <label for="name">备注</label> <textarea class="form-control" rows="3" id="extend"></textarea> </div> <div class="row"> <div class="col-sm-2 col-md-2 col-lg-2"></div> <div class="col-sm-8 col-md-8 col-lg-8"> <!-- 按钮触发模态框 --> <button type="button" class="btn btn-info btn-block" data-toggle="modal" id="openModal">确定</button> </div> <div class="col-sm-2 col-md-2 col-lg-2"></div> </div> </div> <!-- 模态框(Modal) --> <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> <h4 class="modal-title" id="myModalLabel">电子发票信息</h4> </div> <div class="modal-body"> <table class="table table-striped"> <caption>电子发票基本信息</caption> <thead> <tr> <th>参数</th> <th>参数内容</th> </tr> </thead> <tbody id="einvoice-msg-tbody"> <tr id="tr-policyNo"> <td>保单号</td> </tr> <tr id="tr-productCode"> <td>产品代码</td> </tr> <tr id="tr-channelName"> <td>投保渠道</td> </tr> <tr id="tr-personalName"> <td>发票类型</td> </tr> <tr id="tr-taxPayerNo"> <td>纳税人识别号</td> </tr> <tr id="tr-invoiceTitle"> <td>发票抬头</td> </tr> <tr id="tr-extend"> <td>备注</td> </tr> </tbody> </table> <!-- <div class="alert alert-success">该电子发票已申请,并且申请成功!</div> <div class="alert alert-info">此电子发票还未申请!请核对后提交!</div> --> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button> <button type="button" class="btn btn-primary" id="applyButton">申请</button> <button type="button" class="btn btn-primary" id="downloadButton">下载</button> </div> </div><!-- /.modal-content --> </div><!-- /.modal --> </div> </div> </div> </body> </html> 我需要在焦点锁定投保渠道的输入框时弹出下拉组件(bootstrap中有案例可以直接使用),在输入时像后台发送异步请求,获取想要的数据信息,具体js的实现方法如下://监控渠道信息输入状态,根据渠道开头字母模糊查询渠道信息并加载下拉框。 $("#channelText").bind('input propertychange',function(){ delectChannelMenu(); getPageChannelMenu(currentpage,$("#channelText").val()); });``` jquery中的bind(type,[data],fn)方法,为每个匹配元素的特定事件绑定事件处理函数。type为```input propertychange```就是译为当input标签中的属性发生改变时触发函数fn,触发后先执行删除菜单中的内容,再更新菜单中的内容。两个方法具体如下: 清空渠道下拉菜单*/ function delectChannelMenu(){ var count=$('#channel-menu').children().length; for(var i=0;i<count-2;i++){ $('#paging').prev().prev().remove(); } var pagesCount=$($('#paging').children()[0]).children().length; for(var i=0;i<pagesCount-2;i++){ $('#next').parent().prev().remove(); } }` * 发送请求获取渠道 */ function getPageChannelMenu(currentpage,channelCode){ //发送请求获取渠道 var url = '/NCPI/thridPlatform_getPageMsg.do'; $.ajax({ type:"POST", url:url, //防止自动转换数据格式。 data: {currentPage:currentpage,channelCode:channelCode}, async :false, success:function(msg){ pageCount=msg.pageCount; LoadChannelMenu(msg.thridPlatformList,msg.pageCount); } }); }``` 加载渠道菜单 @param obj 渠道对象数组*/ function LoadChannelMenu(obj,pageCount){ var menuObj = $('#paging').prev(); for(var i=0;i<obj.length;i++){ menuObj.before('<li><a href="#">'+obj[i].channelCode+'|'+obj[i].channelName+'</a><input type="hidden" value="'+obj[i].channelCode+'"></li>'); } var htmlObj=""; for(var i=1;i<=pageCount;i++){ htmlObj+='<li><a href="#" data-stopPropagation="true" onclick="turnPage(this)">'+i+'</a></li>' if(i==5){ break; } } $('#next').parent().before(htmlObj); $('a').click(function(){ var id=$(this).parent().parent().parent().attr("id"); if(id=='channelNoInputBox'){ //操作选择渠道 $('#channelText').val($(this).html()); $('#channelNo').val($(this).next().val()); } }); $("ul.dropdown-menu").on("click", "[data-stopPropagation]", function(e) { e.stopPropagation(); }); }` 这样就可以实现在输入框中输入的同时对数据进行模糊查询。
第一篇我们讲了JDK的安装,安装完毕后,我们就已经搭建了一个Java程序能够运行的环境,我们都知道,基于Java开发的服务端的程序,需要在容器中才能使用,所以这里我们讲下期中一种服务器容器Tomcat的安装,安装完Tomcat,你开发的服务端代码就可以在服务器环境下真正的运行起来了 下载Tomcat 下载Tomcat的官方网址:link 在这里选择你想要的版本,这里我选择Tomcat 8的版本,点击之后选择相应的系统环境的压缩包这里我们选择tar.gz的版本点击之后下载,下载完毕后,我们使用Xftp工具在/urs/java下新建一个tomcat的文件夹,并将下载好的Tomcat安装包上传至服务器上传完毕后打开XShell,进行下一步骤 安装Tomcat 执行命令cd ../usr/java/tomcat, 进入tomcat文件夹下,然后再执行命令:tar -xzvf apache-tomcat-8.5.29.tar.gz, 或者也可以直接执行命令:tar -xzvf apache-tomcat-8.5.29.tar.gz -C /usr/java/tomcat 执行完毕之后,在tomcat文件夹下可以看见解压出来的文件夹然后进入该文件夹下的bin目录使用ll命令,我们可以看到bin目录下的所有内容,可以看见里面有一个setclasspath.sh的文件,执行命令:vim setclasspath.sh在最下方加入:export JAVA_HOME=/usr/java/jdk/1.8.0_162保存后退出。 启动Tomcat 在启动之前先执行下命令:netstat -apn|grep 8080看下Tomcat的默认端口8080是否被占用。如果被占用会出现下图的信息显示 如果被占用则需要修改Tomcat的端口。 进入conf文件夹执行命令:vim server.xml找到<Connector/>标签,将里面的端口号修改后保存退出完成后进入bin目录下,执行命令:./startup.sh 启动完毕后依次执行命令:cd ../logstail -200f catalina.out如果没有报错就说明启动成功。打开浏览器输入http://ip:8080如果看到这个网页说明你的Tomcat启动成功了 tomcat启动成功了但是无法连接到服务器如何处理第一次使用阿里云的小伙伴大多数都会遇到一个问题,就是我服务器明明启动成功了,也没报错,但是网页就是怎么也连接不上,遇到这种问题该如何解决。 首先第一步,先将Linux的8080端口上的防火墙关闭,步骤如下: 执行命令:vim /etc/sysconfig/iptables 在文档中添加:-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT 保存关闭。 将iptables重启服务:service iptables restart 之后再次尝试连接服务器,如果还是无法连接上服务器,那就需要登录阿里云,进入你的云服务器实例,找到安全组配置项进入后点击配置规则点击【添加安全组规则】,按图示添加规则后点击确定添加成功后再去尝试连接服务器的8080端口,发现可以登录了。 关闭Tomcat服务关闭Tomcat的服务的方式有两种,一种是执行bin目录下的shutdown.sh文件,不过这里我推荐使用第二种方式。 执行命令:ps -ef|grep tomcat我们可以看到当前tomcat的进程的一些信息这里我的tomcat的进程号可以看到是5401,找到之后执行命令:kill -9 5401这样就可以停止当前的tomcat服务了。
前两天,搞了个Linux系统想尝试一下如何搭建一个服务器,在过程中遇到了一些问题,我觉得需要做个记录。PS:阿里云服务器的购买啥的我就不细说了。 一切都准备就绪之后,首先,是Linux命令。因为之前在工作中很少接触Linux操作,所以除了常见的cd、ll、ls、./等命令符有些操作都需要通过资料查阅来确认。这些操作接下来的搭建过程中会一一说明。 XShell、Xftp的使用。首先,我们需要准备两款软件:XShell和Xftp,XShell用于连接Linux系统,执行Linux命令,Xftp用于上传文件至Linux服务器上,软件的下载和安装在这里就不做说明,网上搜索引擎搜索下就有。下载完毕后打开XShell,新建一个会话,输入IP地址等基本信息后,点击确认,如下图: 连接成功后会提示输入用户名密码,对应地输入系统的用户名和密码就ok了,然后就可以肆无忌惮地操作Linux系统了。如果你需要传一些文件等至服务器时,可以打开Xftp进行操作,打开Xftp的方式有两种:一种是在XShell连接上服务器后,点击【窗口】→【传输新建文件】(快捷键:Ctrl+Alt+F)就OK了。第二种方法就是打开Xftp软件手动创建会话,这种方式比较步骤太多,等于重复了一遍XShell新建会话的操作。做好如上准备后,准备开始搭建Java的运行环境JDK了。 2.JDK的安装 先去JDK官网上下载所需版本的JDK压缩包,如图所示选择对应的JDK版本,我这里选择的是jdk-8u162-linux-x64.tar.gz版本。下载完毕后将JDK上传至服务器,这里我在系统的/usr文件夹下新建了一个文件夹,命名为java,再在java文件夹下创建一个文件夹命名为jdk,然后将JDK包上传至/usr/java/jdk的路径下,如图所示:上传完毕后,打开XShell,通过命令进入/usr/java/jdk文件夹下,使用命令cd ../usr/java/jdk直接就可以进入,如果不熟练Linux的用户,可以一步一步拆解命令进行操作。总之最终目的就是进入jdk文件夹。进入jdk文件夹后,输入命令:tar -xzvf jdk-8u162-linux-x64.tar.gz,将JDK包解压缩至当前文件夹下熟悉Linux的人可以直接执行命令tar -xzvf jdk-8u162-linux-x64.tar.gz -C /usr/java/jdk解压完毕之后,执行命令vim /etc/profile,进入环境变量编辑界面,输入i 进入编辑模式。如图在下方输入三行代码:export JAVA_HOME=/usr/java/jdk/jdk1.8.0_162export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/libexport PATH=$JAVA_HOME/bin:$PATH输入完毕后,按Esc退出编辑,并输入:wq回车后保存文本修改并退出。退出之后执行命令source /etc/profile可以使配置不用重启就能生效,然后执行命令java version如果安装成功就能看到当前的jdk版本这里显示当前java的版本为1.8.0_162
【设置】→【通知】