首页
归档
留言
友链
广告合作
壁纸
更多
美女主播
Search
1
博瑞GE车机升级/降级
5,649 阅读
2
Mac打印机设置黑白打印
5,043 阅读
3
修改elementUI中el-table树形结构图标
4,946 阅读
4
Mac客户端添加腾讯企业邮箱方法
4,705 阅读
5
intelliJ Idea 2022.2.X破解
4,454 阅读
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
登录
/
注册
Search
标签搜索
Spring Boot
Java
Vue
Mac
Spring Cloud
MyBatis
WordPress
MacOS
asp.net
Element UI
Nacos
MySQL
.Net
Spring Cloud Alibaba
Mybatis-Plus
Typecho
jQuery
Java Script
IntelliJ IDEA
微信小程序
Laughing
累计撰写
629
篇文章
累计收到
1,421
条评论
首页
栏目
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
页面
归档
留言
友链
广告合作
壁纸
美女主播
搜索到
629
篇与
的结果
2019-07-26
Spring Boot过滤器Filter
单个过滤器如果只是定义一个过滤器,直接通过@Configuration注解即可。package Cc.LiSen.Configurations; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Configuration; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; /** * ClassName: CustomFilter <br/> * Description: <br/> * date: 2019/7/25 22:04<br/> * * @since JDK 1.8 */ @WebFilter(filterName = "CustomFilter", urlPatterns = "{/*}") public class CustomFilter implements Filter { private Logger logger = LoggerFactory.getLogger(this.getClass()); @Override public void init(FilterConfig filterConfig) throws ServletException { logger.info("初始化过滤器CustomFilter"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { logger.info("过滤器CustomFilter开始工作,并转入下一个过滤"); chain.doFilter(request, response); logger.info("CustomFilter继续过滤"); } @Override public void destroy() { logger.info("过滤器CustomFilter销毁"); } }多个过滤器如果定义多个过滤器,需要通过FilterRegistrationBean提供setOrder方法,可以为filter设置排序值,让spring在注册web filter之前排序后再依次注册。启动类中利用@bean注册FilterRegistrationBean*温馨提示过滤器定义与上面类似,去掉@Configuration注解即可,这里不再赘述,然后修改启动类,增加以下代码package Cc.LiSen; import Cc.LiSen.Configurations.CustomFilter; import Cc.LiSen.Configurations.CustomFilterOther; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication //SpringBoot 默认从App类往下面的包扫描 //所以如果控制器、实体等类与App不在一个包,同时不在下面的包时,必须手动指定包 @EnableJpaRepositories(basePackages = {"Cc.LiSen.Repositories", "Cc.LiSen.Services"}) public class App { private static final Logger logger = LoggerFactory.getLogger(App.class); public static void main(String[] args) { // System.setProperty("log.root","DEBUG,info,error"); // // System.setProperty("log.base","D:\\log4j\\base"); SpringApplication.run(App.class, args); } @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new CustomFilter()); filterRegistrationBean.setOrder(10); return filterRegistrationBean; } @Bean public FilterRegistrationBean filterRegistrationBeanOther() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new CustomFilterOther()); filterRegistrationBean.setOrder(20); return filterRegistrationBean; } }
2019年07月26日
1,263 阅读
0 评论
0 点赞
2019-07-25
jquery ias流式分页插件添加
下载ias插件下载地址:https://github.com/webcreate/Infinite-Ajax-Scroll引入js插件<div class="content"> <#if articles?exists> <!--这里的#if是freemarker语法,用来判断是否有数据,然后进行循环展示--> <#list articles as article> <article class="excerpt excerpt-1"><a class="focus" href="/article/${article.contentId}.html" title=""> <img class="thumb" data-original="${article.imgurl}" src="${article.imgurl}" alt=""></a> <header><a class="cat" href="/category/${article.categoryId}.html">${article.categoryValue}<i></i></a> <h2><a href="/article/${article.contentId}.html" title="">${article.title}</a></h2> </header> <p class="meta"> <time class="time"><i class="glyphicon glyphicon-time"></i> ${article.createDate}</time> <span class="views"><i class="glyphicon glyphicon-eye-open"></i> 共${article.click}人围观</span> <a class="comment" href="article.html#comment"> <i class="glyphicon glyphicon-comment"></i> ${article.comment}个评论</a></p> <p class="note">${article.abstr} ... </p> </article> </#list> </#if> <nav class="pagination" style="display: none;"> <ul> <li class="prev-page"></li> <#if nextPage?exists> <li class="next-page"><a href="/page/${nextPage}">下一页</a></li> </#if> <li><span>共 ${pageNum} 页</span></li> </ul> </nav> </div> 温馨提示需要注意的是container,item,pagination,next,必须要一一对应//无限滚动反翻页 jQuery.ias({ history: false, container: '.content', item: '.excerpt', pagination: '.pagination', next: '.next-page a', trigger: '查看更多', loader: '<div class="pagination-loading"><img src="/images/loading.gif" /></div>', triggerPageThreshold: 5, onRenderComplete: function () { $('.excerpt .thumb').lazyload({ placeholder: '/images/occupying.png', threshold: 400 }); $('.excerpt img').attr('draggable', 'false'); $('.excerpt a').attr('draggable', 'false'); } });分页java代码@RequestMapping("/page/{num}") public String page(Model model, @PathVariable int num) { //获取点击量和评论量 List<Count> countList = countService.getCountList(); //获取最新发布的文章 List<Article> list = articleService.getArticleList(num, countList); model.addAttribute("articles", list); //总数 int count = articleService.getArticleSize(); //总页数 int pageNum = count / 5; model.addAttribute("pageNum", pageNum); if (pageNum > num) { model.addAttribute("nextPage", num + 1); } //今日推荐 List<Article> top2 = articleService.getTopArticleList("2"); model.addAttribute("now", top2.get(0)); return "homepage/index"; }
2019年07月25日
1,086 阅读
0 评论
0 点赞
2019-07-22
Spring Boot通过Redis共享Session
温馨提示以下内容基于SpringBoot 1.2.7版本<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.7.RELEASE</version> </parent>添加依赖主要是添加如下两个依赖<!-- 添加redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.3.8.RELEASE</version> </dependency> <!-- session依赖--> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>1.3.5.RELEASE</version> </dependency> 安装Redis具体操作方法请自行百度,不是本文重点配置Redis找到application.yml文件,添加如下内容#redis配置 redis: host: 我是IP port: 6379 password: 我是密码 timeout: 0 pool: max-active: 100 max-idle: 10 max-wait: 100000 database: 0 增加Redis配置类RedisConfiguration.javapackage Cc.LiSen.Configurations; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import redis.clients.jedis.JedisPoolConfig; /** * ClassName: RedisConfiguration <br/> * Description: <br/> * date: 2019/7/22 9:17<br/> * * @since JDK 1.8 */ @Configuration @EnableAutoConfiguration public class RedisConfiguration { /* @Bean @ConfigurationProperties(prefix = "spring.redis.pool") public JedisPoolConfig getJedisPoolConfig() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); return jedisPoolConfig; } @Bean @ConfigurationProperties(prefix = "spring.redis") public JedisConnectionFactory getConnectionFactory() { JedisConnectionFactory factory = new JedisConnectionFactory(); factory.setUsePool(true); JedisPoolConfig jedisPoolConfig = getJedisPoolConfig(); factory.setPoolConfig(jedisPoolConfig); return factory; } @Bean public RedisTemplate<?,?> redisTemplate(){ JedisConnectionFactory factory=getConnectionFactory(); RedisTemplate<?,?> redisTemplate=new StringRedisTemplate(factory); return redisTemplate; } */ /** * redisTemplate 序列化使用的jdkSerializeable, 存储二进制字节码, 所以自定义序列化类 * @param redisConnectionFactory * @return */ @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>(); redisTemplate.setConnectionFactory(redisConnectionFactory); // 使用Jackson2JsonRedisSerialize 替换默认序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); // 设置value的序列化规则和 key的序列化规则 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; } }增加Session配置SessionConfiguration.javapackage Cc.LiSen.Configurations; import org.springframework.context.annotation.Configuration; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; /** * ClassName: SessionConfiguration <br/> * Description: <br/> * date: 2019/7/22 10:45<br/> * * @since JDK 1.8 */ @Configuration @EnableRedisHttpSession public class SessionConfiguration { }简单测试UUID uid = (UUID) session.getAttribute("uid"); if (uid == null) { uid = UUID.randomUUID(); } session.setAttribute("uid", uid); request.getSession().setAttribute("user",JSON.toJSONString(checkUser));
2019年07月22日
1,347 阅读
0 评论
0 点赞
2019-07-21
Spring Boot使用FastJson
什么是FastJson?FastJson是阿里巴巴旗下的一个开源项目之一,顾名思义它专门用来做快速操作json的序列化与反序列化的组件。它是目前json解析最快的开源组件没有之一!在这之前JackJson是最为出名的快速操作json的工具,当然,现在也很出名。阿里巴巴的FastJson虽然速度快,但是bug也是相当多,如果是在大型系统中并且对系统安全性要求比较高,仍然建议使用Jackjson。maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency>{message type="warning" content="fastjson虽然是阿里巴巴出品的,但是最近爆出很多bug,所以大项目上还是慎重使用"/}创建配置信息类我们接下来创建一个FastJsonConfiguration配置信息类,添加@Configuration注解让SpringBoot自动加载类内的配置,有一点要注意我们继承了WebMvcConfigurerAdapter这个类,这个类是SpringBoot内部提供专门处理用户自行添加的配置,里面不仅仅包含了修改视图的过滤还有其他很多的方法,比如拦截器,过滤器,Cors配置等。方式一:fastJson视图过滤配置package cn.notemi.configuration; import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.util.List; /** * Title:FastJsonConfiguration * Description:FastJson配置信息 * * @create 2017-08-08 下午 4:33 **/ @Configuration public class FastJsonConfiguration extends WebMvcConfigurerAdapter { /** * 修改自定义消息转换器 * @param converters 消息转换器列表 */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { //调用父类的配置 super.configureMessageConverters(converters); //创建fastJson消息转换器 FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); //创建配置类 FastJsonConfig fastJsonConfig = new FastJsonConfig(); //修改配置返回内容的过滤 fastJsonConfig.setSerializerFeatures( SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty ); fastConverter.setFastJsonConfig(fastJsonConfig); //将fastjson添加到视图消息转换器列表内 converters.add(fastConverter); } }方式二:自定义FastJsonHttpMessageConverter@Configuration public class FastJsonConfig { @Bean public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() { FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter(); com.alibaba.fastjson.support.config.FastJsonConfig fastJsonConfig = new com.alibaba.fastjson.support.config.FastJsonConfig(); fastJsonConfig.setDateFormat("yyyy-MM-dd"); fastJsonConfig.setCharset(StandardCharsets.UTF_8); fastJsonConfig.setSerializerFeatures( // SerializerFeature.WriteClassName, SerializerFeature.WriteMapNullValue, SerializerFeature.PrettyFormat, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty ); fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig); // 解决中文乱码 List<MediaType> fastMediaTypes = new ArrayList<>(); fastMediaTypes.add(MediaType.APPLICATION_JSON); fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes); return fastJsonHttpMessageConverter; } }FastJson配置实体调用setSerializerFeatures方法可以配置多个过滤方式,下面我们来介绍下常用的SerializerFeatures配置。FastJson SerializerFeaturesWriteNullListAsEmpty :List字段如果为null,输出为[],而非nullWriteNullStringAsEmpty : 字符类型字段如果为null,输出为"",而非nullDisableCircularReferenceDetect :消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非nullWriteMapNullValue:是否输出值为null的字段,默认为false。项目运行我们使用了过滤,SerializerFeature.WriteNullStringAsEmpty,本该显示null,显示为"",所以成功使用。
2019年07月21日
1,354 阅读
0 评论
0 点赞
2019-07-21
Spring Boot包位置设置
/* * Copyright (C) 2019 李森的博客 https://lisen.cc * 项目名称:Cc.LiSen.Idea * 文件名称:App.java * Date:19-7-19 上午1:21 * Author:lisen@lisen.cc * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <https://www.gnu.org/licenses/>. */ package Cc.LiSen; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.orm.jpa.EntityScan; import org.springframework.context.annotation.ComponentScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication //SpringBoot 默认从App类往下面的包扫描 //所以如果控制器、实体等类与App不在一个包,同时不在下面的包时,必须手动指定包 //@ComponentScan(basePackages = {"Cc.LiSen.Controllers", "Cc.LiSen.Services"}) //@EnableJpaRepositories(basePackages = {"Cc.LiSen.Repositories", "Cc.LiSen.Services"}) //@EntityScan(basePackages = {"Cc/LiSen/Pojos"}) public class App { public static void main(String[] args){ SpringApplication.run(App.class,args); } }
2019年07月21日
1,199 阅读
0 评论
0 点赞
2019-07-18
IntellIJ IDEA配置Maven以及修改默认Repository
修改Maven仓库路径在D盘(个人根据自身情况而定)新建文件配置D:\server\maven\中setting.xml文件,内容如下:<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <pluginGroups /> <proxies /> <servers /> <localRepository>D:/server/maven/repository</localRepository> <mirrors> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> <mirror> <id>central</id> <name>Maven Repository Switchboard</name> <url>http://repo1.maven.org/maven2/</url> <mirrorOf>central</mirrorOf> </mirror> <mirror> <id>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo2.maven.org/maven2/</url> </mirror> <mirror> <id>ibiblio</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url> </mirror> <mirror> <id>jboss-public-repository-group</id> <mirrorOf>central</mirrorOf> <name>JBoss Public Repository Group</name> <url>http://repository.jboss.org/nexus/content/groups/public</url> </mirror> <mirror> <id>google-maven-central</id> <name>Google Maven Central</name> <url>https://maven-central.storage.googleapis.com </url> <mirrorOf>central</mirrorOf> </mirror> <!-- 中央仓库在中国的镜像 --> <mirror> <id>maven.net.cn</id> <name>oneof the central mirrors in china</name> <url>http://maven.net.cn/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> </settings> IntellIJ IDEA 中配置MavenIdea 自带了apache maven,默认使用的是内置maven,所以我们可以配置全局setting,来调整一下配置,比如远程仓库地址,本地编译环境变量等。打开Settings,在输入框输入maven,如果本地设置了MAVEN_OPTS 系统环境变量,这个步骤可以忽略。如果配置了本地apache-maven setting.xml 中的软件源,这步骤可以忽略。
2019年07月18日
2,077 阅读
0 评论
1 点赞
2019-07-16
Navicat12.1系列破解教程,Navicat12.1.20破解亲测有效
破解软件地址{cloud title="Navicat12.1.zip" type="bd" url="https://pan.baidu.com/s/1mzEQIAzCIga21F2npW65Lg" password="m741"/}破解步骤先安装navicat12 ,完成后打开软件,点击14天试用,关闭软件!!关闭杀毒软件(自行百度),解压Navicat_Keygen_Patch_v4.8_By_DFoX,右键管理员身份运行程序点击path(只能path一次!!切记,走过的坑),找到Navicat12的安装路径,找到主程序Navicat.exe或者navicat,选中,打开,会提示Cracked,则此步骤表明成功,继续打开Navicat12软件,点击弹出框的注册点击破解软件中间的“4.keygen/offline activation”的Generate ,稍等片刻,前面软件框生成的序列号会自动插入到Navicat12的注册界面,核对一下是否成功。点击Navicat12注册页面的激活----手动激活,将生成的请求码复制到破解软件的request code 后面的大框内
2019年07月16日
1,430 阅读
0 评论
23 点赞
2019-07-10
vscode自定义模板
定义代码片段进入文件->首选项->用户代码片段,选择新建全局用户代码片段{ "jsp-template": { //模板名称 "prefix": "jsptemplate", //触发条件 "body": [ //内容 "<%@page language=\"java\" import=\"java.util.*\" pageEncoding=\"gbk\"%>", "<html>", " <head>", " <title></title>", " </head>", " <body>", " </body>", "</html>" ], "description": "For Class" //描述 }, }变量可以使用$name或者${name:default}的格式可以使用以下变量:$1 $2 表示光标的位置,按tab键跳转,$0是最后一个TM_SELECTED_TEXT 当前选中的文本或者空文本TM_CURRENT_LINE 当前行的内容TM_CURRENT_WORD 光标之后的文本或者空文本TM_LINE_INDEX 上一行行号TM_LINE_NUMBER 当前行号TM_FILENAME 当前文件名称TM_FILENAME_BASE 当前文件名称不带后缀TM_DIRECTORY 当前文件的文件夹TM_FILEPATH 当前文件的全路径CLIPBOARD 剪切板内容插入当前日期和时间CURRENT_YEAR 当前年份CURRENT_YEAR_SHORT 当前年的最后两个数字CURRENT_MONTH 当月两个数字 (如 ‘02’)CURRENT_MONTH_NAME 当月的全称 (如 ‘July’)CURRENT_MONTH_NAME_SHORT 当月的简称 (如 ‘Jul’)CURRENT_DATE 当日CURRENT_DAY_NAME 周几(如 ‘Monday’)CURRENT_DAY_NAME_SHORT 周几的简称 (如 ‘Mon’)CURRENT_HOUR 当前24小时的时间CURRENT_MINUTE 分钟CURRENT_SECOND 秒
2019年07月10日
1,594 阅读
0 评论
1 点赞
2019-07-10
修改tomcat配置映射去掉URL中的项目名
Tomcat文件目录conf/server.xml:host节点下添加<Context path="" docBase="projectname" debug="0" reloadable="true"/> 注意:在项目部署了以后在修改,修改了以后重启tomcat,修改了以后会影响到tomcat的控制台页面的运行 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="projectname" debug="0" reloadable="true"/> </host>
2019年07月10日
1,290 阅读
0 评论
0 点赞
2019-07-08
VSCode结合maven配置Java开发环境
这里主要介绍一下pom.xml文件的配置,防止遗忘。{message type="success" content="这里主要是配置了struts2的一个环境作为Demo"/}项目结构由于修改了默认的maven项目目录的存储结构,所以需要同步修改pom.xml文件,防止打包失败。简单说一下项目的结构src顶层主要用户存储开发相关的源文件target是intall生成的文件java是空文件夹,目前没用Net下面存放的java文件resources下面就配置了一个struts.xml文件WebContent用于配置jsp等静态文件pom.xml配置如下<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>Cc.LiSen</groupId> <artifactId>Cc.LiSen</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>Cc.LiSen Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.1</version> </dependency> </dependencies> <build> <finalName>Cc.LiSen</finalName> <!--项目相关的所有资源路径列表,例如和项目相关的配置文件、属性文件,这些资源被包含在最终的打包文件里。 --> <resources> <resource> <!--描述了资源的目标路径。该路径相对target/classes目录(例如${project.build.outputDirectory})。 --> <!--举个例子,如果你想资源在特定的包里(org.apache.maven.messages),你就必须该元素设置为org/apache/maven/messages。 --> <!--然而,如果你只是想把资源放到源码目录结构里,就不需要该配置。 --> <!--是否使用参数值代替参数名。参数值取自properties元素或者文件里配置的属性,文件在filters元素里列出。 --> <filtering>true</filtering> <!--描述存放资源的目录,该路径相对POM路径 --> <directory>${project.basedir}\src\resources</directory> <!--包含的模式列表 --> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <!--排除的模式列表 如果<include>与<exclude>划定的范围存在冲突,以<exclude>为准 --> <excludes> <exclude>jdbc.properties</exclude> </excludes> </resource> </resources> <!--项目源码目录,当构建项目的时候,构建系统会编译目录里的源码。该路径是相对于pom.xml的相对路径。 --> <sourceDirectory>${basedir}\src\</sourceDirectory> <!--项目脚本源码目录,该目录和源码目录不同, 绝大多数情况下,该目录下的内容会被拷贝到输出目录(因为脚本是被解释的,而不是被编译的)。 --> <scriptSourceDirectory>${basedir}\src\scripts</scriptSourceDirectory> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <!--指定web.xml文件的位置--> <webXml>src\WebContent\WEB-INF\web.xml</webXml> <!--指定jsp等文件所在位置--> <warSourceDirectory>src\WebContent</warSourceDirectory> </configuration> </plugin> </plugins> </build> </project>
2019年07月08日
2,138 阅读
0 评论
0 点赞
2019-07-07
DotNet结合ajax实现分块上传
原理就不做介绍了,就是在前端先循环对文件进行分块,然后分别发送到后台,所有分块发送完成后,后台对文件进行合并。html代码<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <link href="../Scripts/layui/css/layui.css" rel="stylesheet" /> <link href="../Css/fileUpload.css" rel="stylesheet" /> <link href="../Css/UpLoadFile.css" rel="stylesheet" /> <link href="../Scripts/layui/layui_exts/dtree/dtree.css" rel="stylesheet" /> <link href="../Scripts/layui/layui_exts/dtree/font/dtreefont.css" rel="stylesheet" /> <script src="../Scripts/Jquery1.12.4/jquery-1.12.4.min.js"></script> <script src="../Scripts/layui/layui.js"></script> <script src="../JS/plupload.full.min.js" type="text/javascript"></script> <script src="../JS/jquery.base64.js" type="text/javascript"></script> <script src="../Scripts/bootstrap3.3.7/js/bootstrap.js"></script> <link href="../Scripts/bootstrap3.3.7/css/bootstrap.css" rel="stylesheet" /> <link href="../Scripts/layui/layui_exts/dtree/dtree.css" rel="stylesheet" /> <link href="../Scripts/layui/layui_exts/dtree/font/dtreefont.css" rel="stylesheet" /> <script> document.write("<script type='text/javascript' src='../JS/ImageServiceDemo.js?rnd=" + Math.random() + "'><\/script>"); </script> </head> <body> <div style="width:100%"> <div style="float:left;margin-right:0px;margin-left20px;border-color:aquamarine"> <ul id="imageTypesTree" class="dtree" data-id="0" style="width:300px;"></ul> </div> <div style="float:left;width:800px;"> <div style="text-align:center" class="form-horizontal"> <div class="layui-progress layui-progress-big" lay-showPercent="yes"> <div class="layui-progress-bar layui-bg-green" lay-percent="0%" id="uploadProgress" style="display:none;"></div> </div> <div class="form-group"> <input type="file" multiple id="file" onchange="javascript:onc();" /> </div> <div class="form-group"> <label for="lastname" class="col-md-2 control-label">计划内码</label> <div class="col-md-10"> <input type="text" class="form-control" id="jhid" placeholder="计划内码" value="f2617b63-264c-496d-a5de-14725c23941a"> </div> </div> <div class="form-group"> <label for="lastname" class="col-md-2 control-label">移交记录内码</label> <div class="col-md-10"> <input type="text" class="form-control" id="yjjlid" placeholder="计划内码" value="9e6b2a12-89a1-4b7c-81a9-3486aaad3474"> </div> </div> <div class="form-group"> <label for="name" class="col-sm-2 control-label">请选择档案类别</label> <div class="col-sm-10"> <select name="dassfl" id="dassfl" class="form-control"> <option value=""></option> <option value="td">土地</option> <option value="fwjzw">房屋建筑物</option> <option value="swzc">实物资产</option> <option value="fswzc">非实物资产</option> <option value="cw">财务</option> <option value="ry">人员</option> <option value="da">档案</option> <option value="wt">问题</option> </select> </div> </div> <div class="form-group"> <button class="layui-btn layui-btn-radius layui-btn-normal" type="button" onclick="sendRequest();" style="width:150px;">上传大文件</button> <button id="btnUpload" class="layui-btn layui-btn-radius layui-btn-normal" type="button" style="width:150px;">上传</button> <button id="getFilesInfo" class="layui-btn layui-btn-radius layui-btn-normal" type="button" style="width:150px;" onclick="getFilesInfo();">获取附件</button> </div> <div style="text-align:center;margin-top:25px;"> <div id="filelist"></div> </div> </div> </div> </div> </body> </html>js脚本var uploadFiles = new Array(); var layer; var dtree = null; var imageTypesTree = null; var selectTreeNodeId = ''; var BYTES_PER_CHUNK = 1024 * 1024 * 2; // 每个文件切片大小定为2MB . var slices; var totalSlices; $(function () { $("#btnUpload").click(function () { checkFileExist(Upload); }); layui.use('layer', function () { layer = layui.layer; }); getImageType(); $('#dassfl').change(function () { getImageType(); }); }) function AddFiles(files) { var errstr = ""; for (var i = 0; i < files.length; i++) { var filename = files[i].name; var isfind = false; for (var j = 0; j < uploadFiles.length; j++) { if (uploadFiles[j].name == filename) { isfind = true; break; } } var index1 = filename.lastIndexOf("."); var index2 = filename.length; var postf = filename.substring(index1 + 1, index2);//后缀名 var myarray = new Array('JPG', 'jpg', 'jpeg', 'JPEG', 'gif', 'GIF', 'png', 'PNG'); if (isfind == false) { uploadFiles.push(files[i]); } if (errstr != "") { layer.alert("文件格式错误:" + errstr); } } } function onc() { var files = document.getElementById("file").files; if (files.length < 0) { return; } AddFiles(files); } function Upload() { var param = dtree.getNowParam(imageTypesTree); if (JSON.stringify(param) == "{}") { layer.alert('请选择档案类别'); return; } var dalb = param.nodeId; var jhid = $('#jhid').val(); var yjjlid = $('#yjjlid').val(); var dassfl = $('#dassfl').val(); var files = document.getElementById("file").files; if (files.length <= 0) { alert('请先选择要上传的文件'); return; } if (uploadFiles.length <= 0) { alert('上传成功'); return; } var formData = new FormData(); formData.append("file", uploadFiles[0]); formData.append('jhid', jhid); formData.append('dassfl', dassfl); formData.append('dalb', dalb); formData.append('yjjlid', yjjlid); $.ajax({ url: "../Controller/ImageService.ashx?func=uploadimage", type: "POST", data: formData, processData: false, contentType: false,// 不设置内容类型 success: function (data) { debugger var result = JSON.parse(data); if (result.IsSuccess != "1") { alert(result.Msg); } uploadFiles.splice(0, 1); Upload(); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.responseText); } }); } function checkFileExist(callBack) { var param = dtree.getNowParam(imageTypesTree); if (JSON.stringify(param) == "{}") { layer.alert('请选择档案类别'); return; } var dalb = param.nodeId; var jhid = $('#jhid').val(); var yjjlid = $('#yjjlid').val(); var dassfl = $('#dassfl').val(); var files = document.getElementById("file").files; if (files.length <= 0) { alert('请先选择要上传的文件'); return; } var fileExistCheckArr = new Array(); for (var i = 0; i < files.length; i++) { fileExistCheckArr.push(files[i].name); } $.ajax({ url: "../Controller/ImageService.ashx?func=checkimageexist", type: "POST", async: false, data: { 'jhid': jhid, 'dassfl': dassfl, 'dalb': dalb, 'yjjlid': yjjlid, 'fileNames': JSON.stringify(fileExistCheckArr) }, success: function (data) { debugger var result = JSON.parse(data); if (result.IsSuccess == "-1") { layer.confirm(result.Msg, { icon: 3, title: '提示' }, function (index) { if (index == 1) { layer.closeAll(); callBack(); } }); } else { callBack(); alert(result.Msg); } }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.responseText); } }); } function getFilesInfo() { var param = dtree.getNowParam(imageTypesTree); if (JSON.stringify(param) == "{}") { layer.alert('请选择档案类别'); return; } var dalb = param.nodeId; var jhid = 'f2617b63-264c-496d-a5de-14725c23941a'; var dalb = '581ef7f3-4737-4258-8915-8c86f7121903'; var yjjlid = '9e6b2a12-89a1-4b7c-81a9-3486aaad3474'; var dassfl = $('#dassfl').val(); if (dassfl == 'da') { jhid = 'f09fb1f1-f5f9-4fb9-aeed-2b03e2a50034'; dalb = '43aba81f-e803-4db1-8a5c-b626853ebf28'; yjjlid = ''; } $.ajax({ url: "../Controller/ImageService.ashx?func=getimage", type: "POST", async: false, data: { 'jhid': jhid, 'yjjlid': yjjlid, 'dassfl': dassfl }, success: function (data) { debugger var result = JSON.parse(data); if (result.IsSuccess == "-1") { } else { var filelistArr = JSON.parse(result.Data); $.each(filelistArr, function (index, value) { $("#filelist").append("<a href='javascript:void(0)' id='" + value.FileID + "' FileID='" + value.FileID + "' BillID='" + value.BillID + "' FileType='" + value.FileType + "' onclick='downLoadImage(this)'>" + value.FileName + "</a><span onclick='deletefile(this)'>删除</span><br/>"); }) } }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.responseText); } }); } function downLoadImage(obj) { var fileid = $(obj)[0].id; var filename = $(obj).text(); url = "../Controller/ImageService.ashx?func=downloadimage&fileid=" + fileid; var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.responseType = "blob"; xhr.onload = function () { if (this.status == 200) { var blob = this.response; var reader = new FileReader(); reader.readAsDataURL(blob); reader.onload = function (e) { var a = document.createElement('a'); a.download = filename; a.href = e.target.result; document.body.appendChild(a); a.click(); document.body.removeChild(a); } } else { layer.alert('获取文件失败'); } }; xhr.send(); } function deletefile(obj) { var fileid = $(obj).prev("a").attr("FileID"); var BillID = $(obj).prev("a").attr("BillID"); var FileType = $(obj).prev("a").attr("FileType"); var filename = $(obj).prev("a").text(); var jhid = 'f2617b63-264c-496d-a5de-14725c23941a'; var dalb = '581ef7f3-4737-4258-8915-8c86f7121903'; var yjjlid = '9e6b2a12-89a1-4b7c-81a9-3486aaad3474'; var dassfl = $('#dassfl').val(); if (dassfl == 'da') { jhid = 'f09fb1f1-f5f9-4fb9-aeed-2b03e2a50034'; dalb = '43aba81f-e803-4db1-8a5c-b626853ebf28'; yjjlid = ''; } $.ajax({ url: "../Controller/ImageService.ashx?func=deleteimage", type: "POST", async: false, data: { 'fileid': fileid, 'filename': filename, 'jhid': jhid, 'yjjlid': yjjlid, 'dassfl': dassfl, 'dalb': dalb }, success: function (data) { debugger var result = JSON.parse(data); if (result.IsSuccess == "-1") { alert(result.Data); } else { alert('删除成功'); } }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.responseText); } }); } function getImageType() { var jhid = $('#jhid').val(); var yjjlid = $('#yjjlid').val(); var dassfl = $('#dassfl').val(); var step = 'sjcj'; debugger $.ajax({ url: "../Controller/ZCJSMainPage.ashx?func=getimagetypetree", type: "POST", data: { step: step, dassfl: dassfl, jhid: jhid }, success: function (data) { debugger var result = JSON.parse(data); if (result.success == "-1") { layer.alert(result.msg); } else { layui.config({ base: '../Scripts/layui/lay/modules/' //配置 layui 第三方扩展组件存放的基础目录 }).extend({ dtree: 'dtree' }).use(['element', 'layer', 'dtree'], function () { dtree = layui.dtree, layer = layui.layer, $ = layui.$; // 初始化树 imageTypesTree = dtree.render({ elem: "#imageTypesTree", data: JSON.parse(result.data) // 使用data加载 }); // 绑定节点点击 dtree.on("node('imageTypesTree')", function (obj) { selectTreeNodeId = obj.param.nodeId; GetFilesInfoDATree(jhid, dassfl, '', step, obj.param.nodeId); }); }); } }, error: function (XMLHttpRequest, textStatus, errorThrown) { layer.alert(XMLHttpRequest.responseText); } }); } //发送请求 function sendRequest() { var param = dtree.getNowParam(imageTypesTree); if (JSON.stringify(param) == "{}") { layer.alert('请选择档案类别'); return; } var dalb = param.nodeId; var jhid = $('#jhid').val(); var yjjlid = $('#yjjlid').val(); var dassfl = $('#dassfl').val(); var files = document.getElementById("file").files; while (uploadFiles.length > 0) { var blob = uploadFiles[0]; var start = 0; var end; var index = 0; var guid = newGuid(); console.log(guid); // 计算文件切片总数 slices = Math.ceil(blob.size / BYTES_PER_CHUNK); totalSlices = slices; while (start < blob.size) { end = start + BYTES_PER_CHUNK; if (end > blob.size) { end = blob.size; } if (uploadFile(blob, index, start, end, guid, jhid, yjjlid, dassfl, dalb) < 0) { break; } start = end; index++; if (index >= totalSlices) { $("#uploadProgress").css('display', 'none'); } } uploadFiles.splice(0, 1); } } //上传文件 function uploadFile(blob, index, start, end, guid, jhid, yjjlid, dassfl, dalb) { var formData; var chunk; var sliceIndex = blob.name + index; chunk = blob.slice(start, end);//切割文件 formData = new FormData(); formData.append("FileName", chunk, sliceIndex); formData.append("filename", blob.name); formData.append("chunk", index); formData.append("sliceIndex", sliceIndex); formData.append("chunks", totalSlices); formData.append('jhid', jhid); formData.append('dassfl', dassfl); formData.append('dalb', dalb); formData.append('yjjlid', yjjlid); formData.append('guid', guid); $.ajax({ url: '../Controller/ImageService.ashx?func=uploadimage', type: "POST", data: formData, processData: false, contentType: false,// 不设置内容类型 success: function (data) { var result = JSON.parse(data); var currentChunk = parseInt(data.Msg); if (result.IsSuccess == "0") { var percent = parseInt((currentChunk / totalSlices) * 100); $("#uploadProgress").css('display', 'block').attr('lay-percent', percent.toFixed() + '%'); return 0; } else if (result.IsSuccess == "1") { layer.alert('上传完成'); return 1; } else { layer.alert('上传失败,原因为:' + result.Msg); return -1; } }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.responseText); } }); } function newGuid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }一般处理程序#region 上传影像文件 /// <summary> /// 上传影像 /// </summary> /// <param name="context"></param> public void UploadImage(HttpContext context) { string jhid = string.Empty;//计划ID string dassfl = string.Empty;//档案所属分类 string yjjlid = string.Empty;//移交记录ID string dalb = string.Empty;//档案类别 string rwjd = string.Empty;//任务阶段 HttpFileCollection files = context.Request.Files; ;//要检查的文件列表 string result = string.Empty; if (!context.Request.Params.AllKeys.Contains("jhid")) { result += "计划ID不能为空;"; } if (!context.Request.Params.AllKeys.Contains("dassfl")) { result += "所属分类不能为空;"; } if (!context.Request.Params.AllKeys.Contains("dalb")) { result += "附件类别不能为空;"; } jhid = context.Request.Params["jhid"]; dassfl = ConvertDassfl2Lower(context.Request.Params["dassfl"]); dalb = context.Request.Params["dalb"]; if (context.Request.Params.AllKeys.Contains("yjjlid")) { yjjlid = context.Request.Params["yjjlid"]; } if (context.Request.Params.AllKeys.Contains("rwjd")) { rwjd = context.Request.Params["rwjd"]; } if (context.Request.Form.AllKeys.Contains("chunk")) { //取得chunk和chunks int chunk = Convert.ToInt32(context.Request.Form["chunk"]);//当前分片在上传分片中的顺序(从0开始) int chunks = Convert.ToInt32(context.Request.Form["chunks"]);//总分片数 string fileName = context.Request.Form["filename"];//文件实际名称 string guid = context.Request.Form["guid"]; ; //根据GUID创建用该GUID命名的临时文件夹 string folder = fileSavePath + "\\" + guid + "\\"; string path = folder + chunk; //建立临时传输文件夹 if (!Directory.Exists(Path.GetDirectoryName(folder))) { Directory.CreateDirectory(folder); } FileStream addFile = new FileStream(path, FileMode.Append, FileAccess.Write); BinaryWriter AddWriter = new BinaryWriter(addFile); //获得上传的分片数据流 HttpPostedFile file = context.Request.Files[0]; Stream stream = file.InputStream; BinaryReader TempReader = new BinaryReader(stream); //将上传的分片追加到临时文件末尾 AddWriter.Write(TempReader.ReadBytes((int)stream.Length)); //关闭BinaryReader文件阅读器 TempReader.Close(); stream.Close(); AddWriter.Close(); addFile.Close(); TempReader.Dispose(); stream.Dispose(); AddWriter.Dispose(); addFile.Dispose(); //合并文件 ProcessRequestFiles(guid, fileName, chunks, jhid, dassfl, yjjlid, dalb, rwjd); } else { if (files.Count <= 0) { result += "文件信息不能为空;"; } if (!string.IsNullOrEmpty(result)) { ResponseInfo responseInfo = new ResponseInfo { IsSuccess = "-1", Msg = result.TrimEnd(';'), Data = "" }; context.Response.Write(JsonConvert.SerializeObject(responseInfo)); } else//执行判断 { ResponseInfo responseInfo = new ResponseInfo(); string msg = string.Empty; responseInfo.IsSuccess = ImageServiceCore.CreateInstance().UploadImage(jhid, dassfl, yjjlid, dalb, files, out msg); responseInfo.Msg = msg; context.Response.Write(JsonConvert.SerializeObject(responseInfo)); } } } #endregion private void ProcessRequestFiles(string guid, string fileName, int chunks, string jhid, string dassfl, string yjjlid, string dalb, string rwjd) { HttpContext context = System.Web.HttpContext.Current; context.Response.ContentType = "text/plain"; string sourcePath = fileSavePath + "\\" + guid + "\\";//源数据文件夹 string targetPath = fileSavePath + "\\" + guid + "\\" + fileName;//合并后的文件 DirectoryInfo dicInfo = new DirectoryInfo(sourcePath); ResponseInfo responseInfo = new ResponseInfo(); try { if (Directory.Exists(sourcePath)) { FileInfo[] files = dicInfo.GetFiles(); if (files.Length != chunks) { responseInfo = new ResponseInfo { IsSuccess = "0", Msg = "", Data = "" }; context.Response.Write(JsonConvert.SerializeObject(responseInfo)); return; } foreach (FileInfo file in files.OrderBy(f => int.Parse(f.Name))) { FileStream addFile = new FileStream(targetPath, FileMode.Append); BinaryWriter AddWriter = new BinaryWriter(addFile); //获得上传的分片数据流 Stream stream = file.Open(FileMode.Open); BinaryReader TempReader = new BinaryReader(stream); //将上传的分片追加到临时文件末尾 AddWriter.Write(TempReader.ReadBytes((int)stream.Length)); //关闭BinaryReader文件阅读器 TempReader.Close(); stream.Close(); AddWriter.Close(); addFile.Close(); TempReader.Dispose(); stream.Dispose(); AddWriter.Dispose(); addFile.Dispose(); } using (FileStream fileStream = new FileStream(targetPath, FileMode.Open)) { string msg = string.Empty; responseInfo.IsSuccess = ImageServiceCore.CreateInstance().UploadImage(jhid, dassfl, yjjlid, dalb, fileStream, fileName, rwjd, out msg); responseInfo.Msg = msg; responseInfo.Data = chunks.ToString(); } //删除文件夹 string delPath = fileSavePath + "\\" + guid; if (Directory.Exists(delPath)) { Directory.Delete(delPath, true); } context.Response.Write(JsonConvert.SerializeObject(responseInfo)); } else { responseInfo = new ResponseInfo { IsSuccess = "-1", Msg = "获取存储目录失败", Data = "" }; context.Response.Write(JsonConvert.SerializeObject(responseInfo)); } } catch (Exception ex) { responseInfo = new ResponseInfo { IsSuccess = "-1", Msg = ex.Message, Data = "" }; context.Response.Write(JsonConvert.SerializeObject(responseInfo)); } }结束。
2019年07月07日
1,154 阅读
0 评论
1 点赞
2019-06-22
禁用 a 标签的点击事件
a标签要用disable属性,必须和pointer-events属性一起使用HTML 部分代码:<a class="praise">赞</a> JS 代码:$(".praise").attr("disabled",true).css("pointer-events","none"); 总结:这样就可以将a标签设成不可点击状态了。不过虽然是不可点击状态,当a标签任然是蓝色,所以要人为的给他添加上灰色字体。
2019年06月22日
1,161 阅读
0 评论
2 点赞
1
...
37
38
39
...
53