搜索词>>后端技巧 耗时0.0100
  • 前端状态数据展示小技巧

    前端状态数据展示小技巧在前端展示后端发送过来的状态数据展示的时候,一般会有根据标志解析成中文。比如 status字段 0-正常;1-禁用;翻译中文写法if(status==0){ return "正常"; }else if(status==1){ return "禁用"; }else{ return status;//源字段展示 }通过上面的写法,我们如果遇到接口出现数据问题就能很明显的看出来,减少排查错误的时间。
  • Bootstrap Table 后端分页详解防坑

    Bootstrap Table 后端分页详解防坑$('#tableId').bootstrapTable({ method:'post',//请求方法 url:'',//后台地址 pagination: true,//是否分页,默认fBootstrap Table 后端分页详解防坑$('#tableId').bootstrapTable({ method:'post',//请求方法 url:'',//后台地址 pagination: true,//是否分页,默认false,必须配置 sidePagination: "server",//必须 否则返回得数据可能不会显示到表里面(坑了我很久) pageSize: 10,//分页大小设置 dataType:"json",//请求数据类型 contentType:"application/json;charset=UTF-8",//POST JSON数据必须指定 clickToSelect: true,//点击选中复选框 responseHandler: function (res) { //最终格式为 return {"rows":[],"total":0} },//返回数据自定义处理 queryParams : function(params) { var pageNum=0; console.log(params.offset); console.log(params.limit); if(params.offset>0) { pageNum=params.offset/params.limit; if(pageNum==0) pageNum=1; } return JSON.stringify({ "pageNum": pageNum+1, "pageSize": params.limit, //其他参数 }); }, columns:[ { field: 'id', title: 'ID', checkbox:true, },{ field: 'opField', title: '客户名称', formatter:function (value,row,index) { let clients=row.orderBodies; let names=new Array(); $.each(clients,function (index,item) { names.push(item.enterpriseName); }); return names.join("、"); } }, ], });代码段 小部件
  • 有一些REST技巧

    有一些REST技巧<p style="text-align:start"><span style="color:#333333"><span style="font-family:Tahoma,Arial,Verdana,sans-serif"><span style="background-color:#ffffff">在之前的博客  文章中,我介绍了实现REST体系结构的一些想法和提示。在这篇文章中,我会介绍更多的想法和提示。</span></span></span></p> <h3 style="margin-left:0px; margin-right:0px; text-align:start">高速缓存</h3> <ul style="margin-left:10px; margin-right:0px"> <li>缓存是原始论文的重要组成部分。</li> <li>战略包括验证(<em>客户检查它有最新版本</em>)和到期(<em>客户假定它有最新版本直到指定时间</em>)</li> <li>有效期: <ul style="margin-left:10px; margin-right:0px"> <li>当资源即将到期时,Expires头告诉客户端。值0意味着避免缓存</li> </ul> </li> <li> <ul style="margin-left:10px; margin-right:0px"> <li>缓存控制 <ul style="margin-left:10px; margin-right:0px"> <li>使用max-age指令指定响应应被视为有效的时间长度; s-maxage共享缓存</li> <li>也可以在请求中使用no-cache意味着重新验证服务器的响应</li> </ul> </li> </ul> </li> <li>验证 <ul style="margin-left:10px; margin-right:0px"> <li>Etag - 资源的唯一版本。与If-none-match请求标头一起使用</li> <li>Last-Modified - 告诉客户端资源上次更改的时间</li> </ul> </li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">控制器API</h3> <ul style="margin-left:10px; margin-right:0px"> <li>当某些东西完全适合CRUD操作时,请考虑使用Controller API</li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">处理日期</h3> <ul style="margin-left:10px; margin-right:0px"> <li>在您的日期使用ISO-8601 - 更适合自然分类,处理时区,地区数据,大多数编程语言的支持</li> <li>接受任何时区,因为世界上任何人都可能会调用您的API</li> <li>以UTC格式存储,不在服务器的时区中。坚持时不应该有抵消。</li> <li>以UTC返回。允许客户根据需要调整其时区</li> <li>如果你不需要,不要使用时间。如果只有日期就足够了,只需要保留日期。这意味着,时区复杂性消失。</li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">头</h3> <ul style="margin-left:10px; margin-right:0px"> <li>HEAD操作应该返回响应头</li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">头</h3> <ul style="margin-left:10px; margin-right:0px"> <li>总是返回什么标题是有用的。考虑: <ul style="margin-left:10px; margin-right:0px"> <li>内容类型</li> <li>内容长度</li> <li>上一次更改</li> <li>ETag的</li> <li>位置</li> </ul> </li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">超媒体(优势)</h3> <ul style="margin-left:10px; margin-right:0px"> <li>更少的耦合</li> <li>一致的链接格式=>更干净的客户端代码</li> <li>开发人员的工作效率:API更易于浏览</li> <li>更容易以更细化的方式引入服务</li> <li>代码更易于调试 - 消息始终具有通过自链接创建它们的URL</li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">超媒体(选择)</h3> <ul style="margin-left:10px; margin-right:0px"> <li>HAL - 减少地址耦合</li> <li>SIREN - 减少地址和动作耦合</li> <li>集合+ JSON(CJ) - 减少地址,动作和对象耦合</li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">幂等</h3> <ul style="margin-left:10px; margin-right:0px"> <li>可以多次调用并返回相同的结果</li> <li>选项,GET,HEAD,PUT和DELETE都是幂等的</li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">长时间运行的请求</h3> <ul style="margin-left:10px; margin-right:0px"> <li>有些操作需要很长时间。在这种情况下,请考虑返回202,并将位置字段设置为客户端可以轮询的URL以检查操作进度。</li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">方法不允许</h3> <ul style="margin-left:10px; margin-right:0px"> <li>如果一个API只支持GET,它应该为任何PUT,POST,DELETE等返回一个<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405" rel="external nofollow" style="padding:0px; margin:0px; outline:none; list-style:none; border:0px none; color:#326693; text-decoration:none; transition:all 0.2s ease-in-out" target="_blank">405</a></li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">必须忽略原则</h3> <ul style="margin-left:10px; margin-right:0px"> <li>客户应该忽略他们不感​​兴趣的数据。这使API更容易向后兼容。如果一个API返回额外的数据,而有些客户不期待它,他们会忽略它。</li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">不能接受的</h3> <ul style="margin-left:10px; margin-right:0px"> <li>当某个资源不支持特定的媒体类型时,<em>当所请求的媒体类型无法提供时</em>,它应该返回406(即,<em>Masse,规则:406(“不可接受”)</em></li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">OPTIONS</h3> <ul style="margin-left:10px; margin-right:0px"> <li>选项应该返回资源上可用的操作</li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">部分更新</h3> <ul style="margin-left:10px; margin-right:0px"> <li>使用<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH" rel="external nofollow" style="padding:0px; margin:0px; outline:none; list-style:none; border:0px none; color:#326693; text-decoration:none; transition:all 0.2s ease-in-out" target="_blank">PATCH</a>处理部分更新 </li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">询问</h3> <ul style="margin-left:10px; margin-right:0px"> <li>应该使用URI的查询组件来过滤集合</li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">资源创建</h3> <ul style="margin-left:10px; margin-right:0px"> <li>当一个资源成功创建后,应该返回一个<a href="https://httpstatuses.com/201" rel="external nofollow" style="padding:0px; margin:0px; outline:none; list-style:none; border:0px none; color:#326693; text-decoration:none; transition:all 0.2s ease-in-out" target="_blank">201</a></li> <li>该位置头部应注明网址获取资源。</li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">安全</h3> <ul style="margin-left:10px; margin-right:0px"> <li>如果操作不修改资源,则认为操作是<em>安全的</em></li> <li>选项,GET和HEAD是安全的</li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">自我链接</h3> <ul style="margin-left:10px; margin-right:0px"> <li>响应组织应始终包含一个自我链接 - 用于返回资源的URL。</li> </ul> <h3 style="margin-left:0px; margin-right:0px; text-align:start">单数还是复数?</h3> <ul style="margin-left:10px; margin-right:0px"> <li>对单数文档类型资源使用Singular - 只能有一个。例如:/ humans / 12343343 / head</li> <li>否则是复数</li> </ul>
  • idea 生成vo对象的setter对字符串加trim()

    一、配置idea setter模板首先 按快捷键   Alt+Insert 弹出generater 对话框​弹出对话框​点击箭头指的位置,弹出以下内容:​上面首先点击绿色的‘+’号添加一个模板,名称为 trimSetter,模板内容为红色框一、配置idea setter模板首先 按快捷键   Alt+Insert 弹出generater 对话框​弹出对话框​点击箭头指的位置,弹出以下内容:​上面首先点击绿色的‘+’号添加一个模板,名称为 trimSetter,模板内容为红色框内的,下面以文本方式给大家方便复制:#set($paramName = $helper.getParamName($field, $project)) #if($field.modifierStatic) static ## #end void set$StringUtil.capitalizeWithJavaBeanConvention($StringUtil.sanitizeJavaIdentifier($helper.getPropertyName($field, $project)))($field.type $paramName) { #if ($field.name == $paramName) #if (!$field.modifierStatic) this.## #else $classname.## #end #end $field.name = ## #if($field.string) $paramName == null ? null : $paramName.## trim(); #else $paramName; #end }模板创建完成后点击 ok按钮返回之前的页面,然后在setter 模板的地方选择我们刚才创建的模板 trimSetter,如下图:​接下来,选择字段进行生成,生成效果如下:public class ApplyDataWord { String applyName; String info; public String getApplyName() { return applyName; } public void setApplyName(String applyName) { this.applyName = applyName == null ? null : applyName.trim(); } public String getInfo() { return info; } public void setInfo(String info) { this.info = info == null ? null : info.trim(); } }​​​​​​​搞定,收工;
  • spring boot FastDFS Java client使用-Java编程

    Java编程之spring boot FastDFS Java client使用,Java编程,FastDFS Java客户端<h2>一、获取FastDFS Java的客户端链接工具</h2> 由于maven库中并没有编译好的jar工具包,目前只能通过GitHub下载源码自己打包成jar<br /> 下载地址:<a href="https://github.com/happyfish100/fastdfs-client-java" rel="external nofollow" target="_blank">点击去下去</a><br /> <br /> 如果通过浏览器直接下载,则下载后是一个zip压缩包。<br /> 1.解压zip包<br /> 2.eclipse通过已存在的maven项目方式导入<br /> 3.执行maven install命令打包<br /> <br /> 打包完成后再target目录下有打包好的jar文件:<br /> <strong>fastdfs-client-java-1.27-SNAPSHOT.jar</strong><br />   <h2>二、导入spring boot项目</h2> 创建一个spring boot项目,在创建好的项目中创建一个lib的文件夹,将上面打包的jar文件复制进去。然后打开spring boot项目的pom.xml文件,添加本地依赖如下: <pre> <code class="language-xml"> <!-- fastfds 客户端 |https://github.com/happyfish100/fastdfs-client-java --> <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</artifactId> <version>1.27-SNAPSHOT</version> <scope>system</scope> <systemPath>${project.basedir}/lib/fastdfs-client-java-1.27-SNAPSHOT.jar</systemPath> </dependency></code></pre> <h2>三、配置文件</h2> 在spring boot项目的resource目录下创建一个fdfs_client.conf文件,内容如下: <pre> <code>#注1:tracker_server指向您自己IP地址和端口,1-n个 #注2:除了tracker_server,其它配置项都是可选的 #注3:.conf 配置文件文件所在位置可以是项目classpath(或OS文件系统目录比如/opt/): #注4:.conf 配置文件优先按OS文件系统路径读取,没有找到才查找项目classpath,尤其针对linux环境下的相对路径 #注5:其他相关参考:https://github.com/happyfish100/fastdfs-client-java connect_timeout = 120 network_timeout = 130 charset = UTF-8 http.tracker_http_port = 80 http.anti_steal_token = no http.secret_key = FastDFS1234567890 tracker_server = 192.168.8.202:22122</code></pre> 其中里面的tracker_server 以及端口均需要根据自身使用的实际请来修改 <h2><br /> 四、编写一个公用的Java 的fastdfs客户端</h2> 首先需要创建一个FastDFS的文件辅助类:<br /> <strong>FastDSFile.java</strong> <pre> <code class="language-java">public class FastDSFile { private String name; private byte[] content; private String ext; private String md5; public String getName() { return name; } public void setName(String name) { this.name = name; } public byte[] getContent() { return content; } public void setContent(byte[] content) { this.content = content; } public String getExt() { return ext; } public void setExt(String ext) { this.ext = ext; } public String getMd5() { return md5; } public void setMd5(String md5) { this.md5 = md5; } } </code></pre> <br /> <strong>FastDFSClient.java</strong> <pre> <code class="language-java">import java.io.File; import java.io.IOException; import org.csource.common.MyException; import org.csource.fastdfs.ClientGlobal; import org.csource.fastdfs.StorageClient1; import org.csource.fastdfs.StorageServer; import org.csource.fastdfs.TrackerClient; import org.csource.fastdfs.TrackerServer; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import com.alibaba.fastjson.JSONArray; /** * fastDFS文件服务Java客户端实现,所有执行方法均为静态方法。 * * @author xq * */ public class FastDFSClient { /** * 客户端 */ private static StorageClient1 storageClient1 = null; // 初始化客户端,加载类时候执行片段 static { try { Resource resource = new ClassPathResource("fdfs_client.conf"); File file = resource.getFile(); String configFile = file.getAbsolutePath(); ClientGlobal.init(configFile); // TrackerClient trackerClient = new TrackerClient(ClientGlobal.g_tracker_group); // TrackerServer trackerServer = trackerClient.getConnection(); // StorageServer storageServer = trackerClient.getStoreStorage(trackerServer); // storageClient1 = new StorageClient1(trackerServer, storageServer); System.out.println("FastDFS Client Init Success!"); } catch (Exception e) { e.printStackTrace(); System.out.println("FastDFS Client Init Fail!"); } } /*** * 文件上传 * * @param fastDSFile * @return * @throws IOException * @throws MyException */ public static JSONArray upload(FastDSFile fastDSFile) throws IOException, MyException { String[] uploadResult = storageClient1.upload_file(fastDSFile.getContent(), fastDSFile.getExt(), null); // String arr = JSONArray.toJSONString(uploadResult); JSONArray arr = (JSONArray) JSONArray.toJSON(uploadResult); return arr; } /** * 文件下载 * * @param groupName * @param remoteFileName * @return * @throws IOException * @throws MyException */ public static byte[] download(String groupName, String remoteFileName) throws IOException, MyException { return storageClient1.download_file(groupName, remoteFileName); } /** * 文件删除 * * @param groupName * @param remoteFileName * @throws Exception * @return 返回0成功;非0失败. */ public static int delete(String groupName, String remoteFileName) throws Exception { return storageClient1.delete_file(groupName, remoteFileName); } } </code></pre> <h2>五、编写测试</h2> <strong>DemoSpringbootFastdfsApplicationTests.java</strong> <pre> <code class="language-java">import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import com.alibaba.fastjson.JSONArray; import net.xqlee.project.demo.fastdfs.clients.FastDFSClient; import net.xqlee.project.demo.fastdfs.clients.FastDSFile; @RunWith(SpringRunner.class) @SpringBootTest public class DemoSpringbootFastdfsApplicationTests { @Test public void contextLoads() { try { FileInputStream fis = new FileInputStream(new File("C:/Users/xq/Pictures/tx.jpg")); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] cache = new byte[4096]; while (fis.read(cache) != -1) { bos.write(cache); } fis.close(); FastDSFile fastDSFile = new FastDSFile(); fastDSFile.setContent(bos.toByteArray()); fastDSFile.setExt("jpg"); // -------上传---- JSONArray rs = FastDFSClient.upload(fastDSFile); System.out.println("上传结束:" + rs); // -------下载---- byte[] dfile = FastDFSClient.download(rs.getString(0), rs.getString(1)); FileOutputStream fos = new FileOutputStream(new File("C:/Users/xq/Pictures/tx-fdfs.jpg")); fos.write(dfile); fos.flush(); fos.close(); // -------删除----- int ds=FastDFSClient.delete(rs.getString(0), rs.getString(1)); // System.out.println("Delete:"+ds); System.out.println("---End----"); } catch (Exception e) { e.printStackTrace(); } } } </code></pre> <br /> 运行测试,可以看到在上传图片的目录下多了一个名为tx-fdfs.jpg的文件
  • Word标题自动编号设置_Word多级标题自动编号讲解

    文章简述本文主要通过图文方式讲述在word文档中,如何对标题进行自动编号配置,以及多级标题如何自动编号设置;本文使用的word版本为office 2016;问题来源需求效果:​word 标题自动编排需求默认情况:​上图是一个普通的word文文章简述本文主要通过图文方式讲述在word文档中,如何对标题进行自动编号配置,以及多级标题如何自动编号设置;本文使用的word版本为office 2016;问题来源需求效果:​word 标题自动编排需求默认情况:​上图是一个普通的word文档默认的几个标题格式,默认情况下word文档的标题是没有编号的,当然我们可以手动设置一些序号,手动设置虽能解决一部分问题,但是遇到中间某个需要删除或需要新增,那么就必须刷新后面的全部标题十分费时,本文讲解自动编号就是为了解决以上问题。Word文档设置多级标题自动编号首先找到下面的"多级列表"设置​点击多级列表旁边的小三角弹出下面界面:​从上方界面点击“定义新的多级列表(D)...”进入下一个步骤的界面​点击上方的更多按钮,展开更多的设置项目,如下界面:​接下来就是一个设置的过程,下面以动图的方式展示:​设置标题自动编号经过上面的标题自动编号的结果如下图所示:​标题自动编号结果展示虽然上面word标题已经自动编号了,但是还有些缩进和对其的样式需要修改,我们先对其进行缩机改版一下​​​​​​​:​格式微调提示:上面的格式可以根据自己的详细需求进行微调最终效果图:​最终效果图好了本技巧到此结束,感谢阅读。
  • centos6.8 yum安装和配置ftp server(vsftpd)客服端

    centos6.8 yum安装和配置ftp server(vsftpd)客服端以及ftp常见问题解决,vsftpd################################ FTP Server ##########################<br /> centos6.8 yum安装和配置ftp server(vsftpd)<br /> 安装前提<br /> <strong>1.root用户<br /> 2.主机联网</strong><br /> 安装命令: <pre> <code class="language-bash"> yum install vsftpd</code></pre> <br /> 安装过程:<br /> <br /> <img alt="安装过程" class="img-thumbnail" src="/assist/images/blog/2a19add45c0746c59ced57324b655948.png" /><br /> <br /> 查看是否安装成功<br />   <pre> <code>[root@VM_xx_xx_centos ~]# rpm -qa | grep vsftpd vsftpd-2.2.2-21.el6.x86_64</code></pre> <br /> 如果查询出来有vsftpd-版本号说明已经安装成功。<br /> <br /> 查看yum安装的配置信息: <pre> <code>[root@VM_xx_xx_centos ~]# whereis vsftpd vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz</code></pre> <br /> 安装的配置目录基本这里就三个: <pre> <code>/usr/sbin/vsftpd /etc/vsftpd ​​​​​​​/usr/share/man/man8/vsftpd.8.gz</code></pre> <br /> 很明显,核显配置文件sftpd.conf在/etc/vsftpd中<br /> 切换目录,修改配置.<br /> <span style="color:#e74c3c">注意修改前最好先备份一个原有的,纯属个人习惯</span><br /> sftp.conf常用配置信息说明 <pre> <code> # 允许本地用户登录 local_enable=YES # 本地用户的写权限 write_enable=YES # 使用FTP的本地文件权限,默认为077 # 一般设置为022 local_umask=022 # 切换目录时 # 是否显示目录下.message的内容 dirmessage_enable=YES dirlist_enable = NO #验证方式 #pam_service_name=vsftpd # 启用FTP数据端口的数据连接 connect_from_port_20=YES # 以独立的FTP服务运行 listen=yes # 修改连接端口 #listen_port=2121 ######### 匿名登录设置 ########### # 允许匿名登录 anonymous_enable=NO # 如果允许匿名登录 # 是否开启匿名上传权限 #anon_upload_enable=YES # 如果允许匿名登录 # 是否允许匿名建立文件夹并在文件夹内上传文件 #anon_mkdir_write_enable=YES # 如果允许匿名登录 # 匿名帐号可以有删除的权限 #anon_other_write_enable=yes # 如果允许匿名登录 # 匿名的下载权限 # 匿名为Other,可设置目录/文件属性控制 #anon_world_readable_only=no # 如果允许匿名登录 # 限制匿名用户传输速率,单位bite #anon_max_rate=30000 ######### 用户限制设置 ########### #### 限制登录 # 用userlist来限制用户访问 #userlist_enable=yes # 名单中的人不允许访问 #userlist_deny=no # 限制名单文件放置的路径 #userlist_file=/etc/vsftpd/userlist_deny.chroot #### 限制目录 # 限制所有用户都在家目录 #chroot_local_user=yes # 调用限制在家目录的用户名单 chroot_list_enable=YES # 限制在家目录的用户名单所在路径 chroot_list_file=/etc/vsftpd/chroot_list ######### 日志设置 ########### # 日志文件路径设置 xferlog_file=/var/log/vsftpd.log # 激活上传/下载的日志 xferlog_enable=YES # 使用标准的日志格式 #xferlog_std_format=YES ######### 安全设置 ########### # 用户空闲超时,单位秒 #idle_session_timeout=600 # 数据连接空闲超时,单位秒 #data_connection_timeout=120 # 将客户端空闲1分钟后断开 #accept_timeout=60 # 中断1分钟后重新连接 #connect_timeout=60 # 本地用户传输速率,单位bite #local_max_rate=50000 # FTP的最大连接数 #max_clients=200 # 每IP的最大连接数 #max_per_ip=5 ######### 被动模式设置 ########### # 是否开户被动模式 pasv_enable=yes # 被动模式最小端口 pasv_min_port=5000 # 被动模式最大端口 pasv_max_port=6000 ######### 其他设置 ########### # 欢迎信息 ftpd_banner=Welcome to Ftp Server!</code></pre> <br /> 添加ftp防火墙规则,一般用于安全策略 <pre> <code> /sbin/iptables -I INPUT -p tcp --dport 21 -j ACCEPT /etc/rc.d/init.d/iptables save /etc/init.d/iptables restart</code></pre> <br /> 常用启动重启停止ftp命令: <pre> <code>#启动 service vsftpd start #停止 service vsftpd stop #重启 service vsftpd restart #查看运行状态 service vsftpd status</code></pre> <br /> ftp server 分两种模式<br /> 主动模式配置 <pre> <code>#主动模式 #开启主动模式 port_enable=YES #当主动模式开启的时候 是否启用默认的20端口监听 connect_from_port_20=YES #上一选项使用NO参数是 指定数据传输端口 ftp_date_port=%portnumber%</code></pre> 被动模式配置 <pre> <code>#开启被动模式 pasv_enable=YES #被动模式最低端口 pasv_min_port=5100 #被动模式最高端口 pasv_max_port=5200</code></pre> <br /> 推荐使用被动模式<br /> <br /> <span style="color:#ff0000"><strong>注意:配置文件配置内容后面不允许有空格,所以最好注释写上面配置内容后无任何东西,否则会莫名奇妙报错</strong></span><br /> <br /> ################################ FTP Client ##########################<br /> 安装命令 <pre> <code>yum install ftp</code></pre> <br /> 安装过程<br /> <img alt="client" class="img-thumbnail" src="/assist/images/blog/f54420cbd14f477282a1ecb09260402a.jpg" /><br /> <br /> 安装完成后执行ftp就可以进入ftp客服端<br /> <img alt="client" class="img-thumbnail" src="/assist/images/blog/22b4ae19a1af4f62aec556baa0d514e7.jpg" /><br /> <br /> ################################ 常见问题 QA ################################<br /> 227 Entering Passive Mode<br /> 200 PORT command successful. Consider using PASV.<br /> 解决:<br /> 服务端配置文件中添加或修改以下内容,核心内容是最后一个pasv_address该参数必须绑定<br /> #sv_enable=YES<br /> #被动模式最低端口<br /> pasv_min_port=3100<br /> #被动模式最高端口<br /> pasv_max_port=3200<br /> <strong><span style="color:#cc0000">pasv_address=123.206.71.187(必须项,你自己主机的IP地址)</span></strong><br />   <p>227 Entering Passive Mode<br /> 解决:</p> <pre> <code>ftp> passive Passive mode on.</code></pre> <br /> <p> </p>
  • Java编程纯jdk java编写webservice服务和客服端

    Java编程中纯jdk java方式编写webservice服务(server)和客服端(client)Java编程中纯jdk java方式编写webservice服务(server)和客服端(client)<br /> <br /> 1.server<br /> <br /> 编写一个简单的server接口 <pre> <code class="language-java">package com.leftso.ws; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface CommService { // 使用@WebMethod注解标注WebServiceI接口中的方法 @WebMethod String sayHello(String name); } </code></pre> <br /> 编写接口实现: <pre> <code class="language-java">package com.leftso.ws; import javax.jws.WebService; /** * 使用@WebService注解标注WebServiceI接口的实现类WebServiceImpl * * @author leftso * */ @WebService public class CommServiceImp implements CommService { @Override public String sayHello(String name) { return "Hello ," + name; } } </code></pre> <br /> 将该接口以webservice方式发布出去: <pre> <code class="language-java">package com.leftso.ws; import javax.xml.ws.Endpoint; public class WebServicePublish { public static void main(String[] args) { // 定义WebService的发布地址,这个地址就是提供给外界访问Webervice的URL地址,URL地址格式为:http://ip:端口号/xxxx // String address = "http://192.168.1.100:8989/";这个WebService发布地址的写法是合法的 // String address = // "http://192.168.1.100:8989/Webservice";这个WebService发布地址的是合法的 String address = "http://127.0.0.1:9000/WS_Server/Webservice"; // 使用Endpoint类提供的publish方法发布WebService,发布时要保证使用的端口号没有被其他应用程序占用 Endpoint.publish(address, new CommServiceImp()); System.out.println("发布webservice成功!"); System.out.println("请使用:"+address+"?wsdl 访问"); } } </code></pre> <br /> 运行main方法,访问地址http://127.0.0.1:9000/WS_Server/Webservice?wsdl<br /> 可以看见wsdl文档如下<br /> <img alt="wsdl" class="img-thumbnail" src="/assist/images/blog/f26343d873c54ffd93e74e4b14952f0f.png" /><br /> 2.client<br /> 调用,可以用最简单的jdk自带的工具wsimport生成本地Java代码,以类的方式直接调用方法就行 <pre> <code>wsimport -keep url_wsdl(自己的wsdl地址)</code></pre> <br />  
  • linux中samba客服端smbclient整合shell脚本

    linux中samba客服端smbclient整合shell脚本实现类似ftp脚本下载上传文件,Linux,samba,smbclientlinux中samba客服端smbclient整合shell脚本实现类似ftp脚本下载上传文件<br />   <pre> <code class="language-bash">#!/bin/bash localDir=/smb/media #smbclient //10.1.1.1/XiaoMi-usb0 -U guest%1 #其中上面的用户名和密码是guest%1 用户是guest 密码是1,链接操作 smbclient //10.1.1.1/XiaoMi-usb0 -U guest%1 <<- EOF #切换本地目录,类似ftp lcd $localDir #切换远程目录 cd 下载 prompt #下载需要下载的文件或匹配文件 mget $1 exit EOF</code></pre> <br /> 执行: <pre> <code class="language-bash">./download-route-samba.sh *速度与激情*.mkv</code></pre> <br /> 执行脚本将会把满足条件的文件全部download到本地。<br /> <br /> 脚本中的很多参数可以根据自身需要进行修改。<br /> <br /> 至次 samba客服端smbclient整合shell脚本实现脚本批处理自动处理等功能。<br /> <br />  
  • spring mvc传递list集合对象到后端方法实现

    本文主要说明在spring mvc框架中如何接收前端发过来的集合对象和相关的处理。主要讲解两种方式,form表单提交方式和ajax提交的方式<h2>1.spring mvc 接收form表单传递的list对象集合处理</h2> 首先是前端页面代码: <pre> <code class="language-html"><!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>list对象参数测试</title> </head> <body> <h1>list对象参数测试</h1> <form action="/sendFormData.do" method="post"> 用户1姓名: <input type="text" name="param.users[0].name" /> 用户1性别 <input type="text" name="users[0].sex" /> 用户1年龄 <input type="number" name="users[0].age" /> <hr /> 用户2姓名: <input type="text" name="param.users[1].name" /> 用户2性别 <input type="text" name="users[1].sex" /> 用户2年龄 <input type="number" name="users[1].age" /> <button type="submit">提交</button> </form> <button type="button" id="json-btn">JSON集合对象参数测试</button> </body> </html></code></pre> <strong><span style="color:#e67e22">注意:这里只用看form表单包裹的内容js部分是后面讲解ajax做的准备</span></strong><br /> <br /> spring mvc 的controller处理方法 <pre> <code class="language-java">@PostMapping("/sendFormData.do") public Object sendFormData(ParamVO users) { System.out.println(users.getUsers().size()); return "/test"; } </code></pre> 这里或许你看出来了使用的一个对象去接收form表单提交的数组。这个对象的内容如下 <pre> <code class="language-java">package com.example.vo; import java.io.Serializable; import java.util.List; /** * 接收数组对象必须使用对象封装一次 * @author xq * */ public class ParamVO implements Serializable { /** * */ private static final long serialVersionUID = 1L; private List<UserVO> users; public List<UserVO> getUsers() { return users; } public void setUsers(List<UserVO> users) { this.users = users; } } </code></pre> spring mvc里面必须进行封装一次List<UserVO>集合就是我们需要得到的前端数据 <h2>2.spring mvc 接收ajax传递list集合对象方法实现</h2> 页面: <pre> <code class="language-html"><!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>list对象参数测试</title> </head> <body> <h1>list对象参数测试</h1> <button type="button" id="json-btn">JSON集合对象参数测试</button> <script type="text/javascript" src="/jquery.min.js"></script> <script type="text/javascript"> $(function() { $('#json-btn').click(function() { send1(); }); }); function send1() { var saveDataAry = []; var data1 = { "name" : "test", "sex" : "男", "age" : 20 }; var data2 = { "name" : "ququ", "sex" : "女", "age" : 30 }; saveDataAry.push(data1); saveDataAry.push(data2); $.ajax({ type : "POST", url : "/sendData.json", dataType : "json",//必须json contentType : "application/json", // 指定这个协议很重要 data : JSON.stringify(saveDataAry), success : function(res) { alert("后端返回请求数据为:" + JSON.stringify(res)); } }); } </script> </body> </html></code></pre> <br /> 注意点是ajax的设置 <pre> <code class="language-html">dataType : "json",//必须json contentType : "application/json", // 指定这个协议很重要</code></pre> 后端spring mvc 接收方法: <pre> <code class="language-java"> @PostMapping("/sendData.json") @ResponseBody public Object sendData(@RequestBody List<UserVO> users) {// @RequestBody该注解很重要 System.out.println(users.size()); for (UserVO userVO : users) { System.out.println(userVO.toString()); } return users; }</code></pre>