微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!
SpringMVC+SwfUpload进行多文件同时上传
由于最近项目需要做一个多文件同时上传的功能,所以好好的看了一下各种上传工具,感觉uploadify和SwfUpload的功能都比较强大,并且使用起来也很方便。SWFUpload是一个flash和js相结合而成的文件上传插件,而且该插件可以用在php、.net、Java等项目开发中。在使用的过程中需要引入两个js文件,并且进行相关参数的配置,同时也可以定义一系列的事件,如:上传成功事件,上传失败事件,正在上传事件等等。由于我在项目开发是使用SpringMVC进行的,所以下面我根据我自己的项目简述一下SwfUpload如何整合到Web项目中去。首先说一下Swfupload相对于HTML中file标签上传的优点:允许一次上传多个文件,但会有一个上传队列,队列里文件的上传是逐个进行的,服务器端接收文件时跟普通的表单上传文件是一样的(相当于表单一次提交了一个file,但是提交了多次,后台处理的时候只需要处理一次即可);用flash进行上传,页面无刷新,且可自定义Flash按钮的样式, 类似AJAX的无刷新上传,里面可以引入swf文件实现动态效果;可以显示上传进度,也可以在浏览器端就对要上传的文件格式,大小等进行配置(只需要配置一个参数即可,比用js的数据验证要好很多);良好的浏览器兼容性并且兼容其他JavaScript库 (例如:jQuery,EXT, Prototype等);一般含有flash插件的即可正常运行,但是好像最低要求flash的版本要达到flash9; SwfUpload还提供了丰富的事件接口供开发者使用;开发者可以自定义各种和上传相关的事件;SWfUpload实现文件的上传流程如下:1、引入相应的js文件 (swfupload.js和swfupload.queue.js必须引入)2、实例化SWFUpload对象,传入一个配置参数对象进行各方面的配置。 3、点击SWFUpload提供的Flash按钮(也可以更改配置信息中的button_image_url参数来配置自己的按钮),弹出文件选取窗口选择要上传的文件; 4、文件选取完成后符合规定的文件会被添加到上传的队列里; 5、调用startUpload方法让队列里文件开始上传; 6、文件上传过程中会触发相应的事件(想要触发什么事件需要自己定义,但是一般网上搜一下就可以了,大部分定义都相同,我也会贴出我的代码),开发者利用这些事件来更新ui、处理错误、发出提示等等; 下面说我的项目中SpringMVC+SwfUpload的配置过程及代码:引入相应的JS文件后实例化SwfUpload对象(JS代码,一般嵌入到jsp文件中或者单独写一个文件引入到jsp页面内):1 var swfu;23 window.onload = function() {4 var settings = {5 flash_url : "swfupload/swfupload.swf",6 flash9_url : "swfupload/swfupload_fp9.swf",7 upload_url: "http://localhost:8080/ams/upload/fileUpload.do",8 post_params: {"PHPSESSID" : "aa"},9 file_size_limit : "100 MB",10 file_types : "*.*",11 file_post_name : "filedata",12 file_types_description : "All Files",13 file_upload_limit : 100,14 file_queue_limit : 0,15 custom_settings : {16 progressTarget : "fsUploadProgress",17 cancelButtonId : "btnCancel"18 },19 debug: true,2021 // Button settings22 button_image_url: "images/TestImageNoText_65x29.png",23 button_width: "65",24 button_height: "29",25 button_placeholder_id: "spanButtonPlaceHolder",26 button_text: '<span class="theFont">Hello</span>',27 button_text_style: ".theFont { font-size: 16; }",28 button_text_left_padding: 12,29 button_text_top_padding: 3,3031 // The event handler functions are defined in handlers.js32 swfupload_preload_handler : preLoad,33 swfupload_load_failed_handler : loadFailed,34 file_queued_handler : fileQueued,35 file_queue_error_handler : fileQueueError,36 upload_start_handler : uploadStart,37 upload_progress_handler : uploadProgress,38 upload_error_handler : uploadError,39 upload_success_handler : uploadSuccess40 };4142 swfu = new SWFUpload(settings);43 };View Code编写相关的监听事件(JS代码,即html引入的handler.js文件):1 function preLoad() {2 if (!this.support.loading) {3 alert("You need the Flash Player 9.028 or above to use SWFUpload.");4 return false;5 }6 }7 function loadFailed() {8 alert("Something went wrong while loading SWFUpload. If this were a real application we'd clean up and then give you an alternative");9 }1011 function fileQueued(file) {12 try {13 var progress = new FileProgress(file, this.customSettings.progressTarget);14 progress.setStatus("Pending...");15 progress.toggleCancel(true, this);1617 } catch (ex) {18 this.debug(ex);19 }2021 }2223 function fileQueueError(file, errorCode, message) {24 try {25 if (errorCode === SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED) {26 alert("You have attempted to queue too many files.n" + (message === 0 ? "You have reached the upload limit." : "You may select " + (message > 1 ? "up to " + message + " files." : "one file.")));27 return;28 }2930 var progress = new FileProgress(file, this.customSettings.progressTarget);31 progress.setError();32 progress.toggleCancel(false);3334 switch (errorCode) {35 case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:36 progress.setStatus("File is too big.");37 this.debug("Error Code: File too big, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);38 break;39 case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:40 progress.setStatus("Cannot upload Zero Byte files.");41 this.debug("Error Code: Zero byte file, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);42 break;43
自己手写一个SpringMVC框架
前端框架很多,但没有一个框架称霸,后端框架现在Spring已经完成大一统。所以学习Spring是Java程序员的必修课。        Spring框架对于Java后端程序员来说再熟悉不过了,以前只知道它用的反射实现的,但了解之后才知道有很多巧妙的设计在里面。如果不看Spring的源码,你将会失去一次和大师学习的机会:它的代码规范,设计思想很值得学习。我们程序员大部分人都是野路子,不懂什么叫代码规范。写了一个月的代码,最后还得其他老司机花3天时间重构,相信大部分老司机都很头疼看新手的代码。       废话不多说,我们进入今天的正题,在Web应用程序设计中,MVC模式已经被广泛使用。SpringMVC以DispatcherServlet为核心,负责协调和组织不同组件以完成请求处理并返回响应的工作,实现了MVC模式。想要实现自己的SpringMVC框架,需要从以下几点入手:       一、了解SpringMVC运行流程及九大组件       二、梳理自己的SpringMVC的设计思路       三、实现自己的SpringMVC框架一、了解SpringMVC运行流程及九大组件       1、SpringMVC的运行流程       ⑴ 用户发送请求至前端控制器DispatcherServlet       ⑵ DispatcherServlet收到请求调用HandlerMapping处理器映射器。       ⑶ 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。       ⑷ DispatcherServlet通过HandlerAdapter处理器适配器调用处理器       ⑸ 执行处理器(Controller,也叫后端控制器)。       ⑹ Controller执行完成返回ModelAndView       ⑺ HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet       ⑻ DispatcherServlet将ModelAndView传给ViewReslover视图解析器       ⑼ ViewReslover解析后返回具体View       ⑽ DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。       ⑾ DispatcherServlet响应用户。       从上面可以看出,DispatcherServlet有接收请求,响应结果,转发等作用。有了DispatcherServlet之后,可以减少组件之间的耦合度。       2、SpringMVC的九大组件(ref:【SpringMVC】9大组件概览) protected void initStrategies(ApplicationContext context) { //用于处理上传请求。处理方法是将普通的request包装成MultipartHttpServletRequest,后者可以直接调用getFile方法获取File.  initMultipartResolver(context); //SpringMVC主要有两个地方用到了Locale:一是ViewResolver视图解析的时候;二是用到国际化资源或者主题的时候。  initLocaleResolver(context);  //用于解析主题。SpringMVC中一个主题对应一个properties文件,里面存放着跟当前主题相关的所有资源、  //如图片、css样式等。SpringMVC的主题也支持国际化,  initThemeResolver(context); //用来查找Handler的。 initHandlerMappings(context); //从名字上看,它就是一个适配器。Servlet需要的处理方法的结构却是固定的,都是以request和response为参数的方法。  //如何让固定的Servlet处理方法调用灵活的Handler来进行处理呢?这就是HandlerAdapter要做的事情 initHandlerAdapters(context); //其它组件都是用来干活的。在干活的过程中难免会出现问题,出问题后怎么办呢? //这就需要有一个专门的角色对异常情况进行处理,在SpringMVC中就是HandlerExceptionResolver。 initHandlerExceptionResolvers(context); //有的Handler处理完后并没有设置View也没有设置ViewName,这时就需要从request获取ViewName了, //如何从request中获取ViewName就是RequestToViewNameTranslator要做的事情了。 initRequestToViewNameTranslator(context); //ViewResolver用来将String类型的视图名和Locale解析为View类型的视图。 //View是用来渲染页面的,也就是将程序返回的参数填入模板里,生成html(也可能是其它类型)文件。 initViewResolvers(context); //用来管理FlashMap的,FlashMap主要用在redirect重定向中传递参数。 initFlashMapManager(context); }二、梳理SpringMVC的设计思路       本文只实现自己的@Controller、@RequestMapping、@RequestParam注解起作用,其余SpringMVC功能读者可以尝试自己实现。       1、读取配置    从图中可以看出,SpringMVC本质上是一个Servlet,这个 Servlet 继承自 HttpServlet。FrameworkServlet负责初始化SpringMVC的容器,并将Spring容器设置为父容器。因为本文只是实现SpringMVC,对于Spring容器不做过多讲解。       为了读取web.xml中的配置,我们用到ServletConfig这个类,它代表当前Servlet在web.xml中的配置信息。通过web.xml中加载我们自己写的MyDispatcherServlet和读取配置文件。       2、初始化阶段       在前面我们提到DispatcherServlet的initStrategies方法会初始化9大组件,但是这里将实现一些SpringMVC的最基本的组件而不是全部,按顺序包括:加载配置文件扫描用户配置包下面所有的类拿到扫描到的类,通过反射机制,实例化。并且放到ioc容器中(Map的键值对  beanName-bean) beanName默认是首字母小写初始化HandlerMapping,这里其实就是把url和method对应起来放在一个k-v的Map中,在运行阶段取出       3、运行阶段       每一次请求将会调用doGet或doPost方法,所以统一运行阶段都放在doDispatch方法里处理,它会根据url请求去HandlerMapping中匹配到对应的Method,然后利用反射机制调用Controller中的url对应的方法,并得到结果返回。按顺序包括以下功能:异常的拦截获取请求传入的参数并处理参数通过初始化好的handlerMapping中拿出url对应的方法名,反射调用三、实现自己的SpringMVC框架       工程文件及目录:首先,新建一个maven项目,在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/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion> <groupId>com.liugh</groupId> <artifactId>liughMVC</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging>  <properties>   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>   <maven.compiler.source>1.8</maven.compiler.source>   <maven.compiler.target>1.8</maven.compiler.target>   <java.version>1.8</java.version> </properties>  <dependencies>      <dependency>        <groupId>javax.servlet</groupId>       <artifactId>javax.servlet-api</artifactId>       <version>3.0.1</version>       <scope>provided</scope>   </dependency>   </dependencies></project>接着,我们在WEB-INF下创建一个web.xml,如下配置: <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  version="3.0"> <servlet>   <servlet-name>MySpringMVC</servlet-name>   <servlet-class>com.liugh.servlet.MyDispatcherServlet</servlet-class>   <init-param>     <param-name>contextConfigLocation</param-name>     <param-value>application.properties</param-value>   </init-param>   <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> 
SpringMVC工作原理
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【SpringMVC工作原理。】大家好,我是IT修真院深圳分院第十三期学员王东东,一枚正直纯洁善良的JAVA程序员。 今天给大家分享一下,修真院官网JAVA任务二,扩展思考中的知识点——SpringMVC工作原理。一、背景介绍SpringMVC是Spring的一个后续产品,其实就是Spring在原有基础上, 又提供了web应用的MVC模块,可以简单的把SpringMVC理解为是Spring的一个模块(类似AOP,IOC这样的模块),网络上经常会说SpringMVC和Spring无缝集成,其实SpringMVC就是Spring的一个子模块。二、知识剖析1.MVC设计模式 MVC设计模式M-Model 模型V-View 视图(做界面的展示 jsp,html……)C-Controller 控制器(接收请求—>调用模型—>根据结果派发页面) 2.XML配置文件主要有两个配置文件,等下结合代码来讲①web.xml文件,启动前端控制器②applacationContext.xml文件,对前端控制器的配置 3.SpringMVC流程(1) Http请求:客户端请求提交到DispatcherServlet。(2) 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。(3) 调用处理器:DispatcherServlet将请求提交到Controller。(4)调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。(5)处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。(6) Http响应:视图负责将结果显示到客户端。 4.其中的几个组件(1)DispatcherServlet接口:Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。(2)HandlerMapping接口:能够完成客户请求到Controller映射。(3)Controller接口:需要为并发用户处理上述请求,处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器(4)ViewResolver接口:Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。 三、常见问题1.中文乱码问题2.Controller返回值设置与jsp文件名不符,导致跳转失败 四、解决方案1.value适合给变量注入属性,ref注入的是映射属性。2.规范返回值,并在编写代码时进行测试。五、编码实战 六、扩展思考DispatcherServlet:从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。它是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:(1)截获符合特定格式的URL请求。(2)初始化DispatcherServlet上下文对应WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。(3)初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。 注:本人初学java者,如有不对敬请指出,谢谢! 七、参考文献百度百科、博客园、CSDN 八.更多讨论1.运行mvn jetty run报错,提示多了一个文件,什么原因?spring-web和org.springframework.web.servlet中都有一个web-fragment.xml文件,导致jetty读取时报错。 2.传统三层架构是怎样的?用一张图清晰地表达出传统三层的结构:这里出BUG了,图片传不上来,请复制下面的网址到DSCN上看...抱歉.. 3.Springmvc的优点都有哪些? (1)它是基于组件技术的。全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件.并且和Spring提供的其他基础结构紧密集成.(2)不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)(3)可以任意使用各种视图技术,而不仅仅局限于JSP(4) 支持各种请求资源的映射策略(5)它应是易于扩展的 今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~ 来源:CSDN 原文:https://blog.csdn.net/wuxie__/article/details/83049170?utm_source=copy   PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
SpringMVC工作原理
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【SpringMVC工作原理】大家好,我是IT修真院深圳分院第13期的学员,一枚正直纯洁善良的java程序员今天给大家分享一下,修真院官网Java任务2,深度思考中的知识点————SpringMVC工作原理 1.背景介绍 Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。 2.知识剖析 (1) Spring MVC主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。(2)它的两个核心是:处理器映射:选择使用哪个控制器来处理请求视图解析器:选择结果应该如何渲染(3)通过以上两点,Spring MVC保证了如何选择控制处理请求和如何选择视图展现输出之间的松耦合。2.1知识剖解 (1)用户发送请求到前端控制器(DispatcherServlet)。(2)前端控制器请求处理器映射器(HandlerMapping)去查找处理器(Handler)。(3)找到以后处理器映射器(HandlerMappering)向前端控制器返回执行链(HandlerExecutionChain)。(4)前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)。(5)处理器适配器去执行Handler。(6)处理器执行完给处理器适配器返回ModelAndView。(7)处理器适配器向前端控制器返回ModelAndView。(8)前端控制器请求视图解析器(ViewResolver)去进行视图解析。(9)视图解析器向前端控制器返回View。(10)前端控制器对视图进行渲染。(11)前端控制器向用户响应结果。 3.常见问题 Springmvc的常用配置(1)1.在web.xml中配置字符集 过滤器 <!-- 字符集 过滤器 -->    <!-- 在Spring框架中是如何解决从页面传来的字符串的编码问题的呢?    下面我们来看看Spring框架给我们提供过滤器CharacterEncodingFilter     这个过滤器就是针对于每次浏览器请求进行过滤的,然后再其之上添加了父类没有的功能即处理字符编码。      其中encoding用来设置编码格式,forceEncoding用来设置是否理会 request.getCharacterEncoding()方法,      设置为true则强制覆盖之前的编码格式。-->    <filter>        <filter-name>encodingFilter</filter-name>        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>        <init-param>            <param-name>encoding</param-name>            <param-value>UTF-8</param-value>        </init-param>        <init-param>            <param-name>forceEncoding</param-name>            <param-value>true</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>encodingFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>  (2)在web.xml中配置DispatcherServlet <!--DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet-->    <!--DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,    把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。-->     <servlet>        <servlet-name>spring</servlet-name> <!--在DispatcherServlet的初始化过程中,        框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml 的配置文件,生成文件中定义的bean。-->        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <!--指明了配置文件的文件名,不使用默认配置文件名,而使用dispatcher-servlet.xml配置文件。-->        <init-param>            <param-name>contextConfigLocation</param-name>            <!--其中<param-value>**.xml</param-value> 这里可以使用多种写法-->            <!--1、不写,使用默认值:/WEB-INF/<servlet-name>-servlet.xml-->            <!--2、<param-value>/WEB-INF/classes/dispatcher-servlet.xml</param-value>-->            <!--3、<param-value>classpath*:dispatcher-servlet.xml</param-value>-->            <!--4、多个值用逗号分隔-->            <param-value>/WEB-INF/spring-servlet.xml</param-value>        </init-param>        <load-on-startup>1</load-on-startup><!--是启动顺序,让这个Servlet随Servlet容器一起启动。-->    </servlet>    <servlet-mapping>        <!--spring,可以有多个DispatcherServlet,是通过名字来区分的。        每一个DispatcherServlet有自己的WebApplicationContext上下文对象。同时保存在ServletContext中和Request对象中.-->        <!--ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,        ApplicationContext则是“应用的容器”了:P,Spring把Bean放在这个容器中,在需要的时候,用getBean方法取出-->        <servlet-name>spring</servlet-name>        <!--Servlet拦截匹配规则可以自已定义,当映射为@RequestMapping("/user/add")时,为例,拦截哪种URL合适?-->        <!--1、拦截*.do、*.htm, 例如:/user/add.do,这是最传统的方式,最简单也最实用。不会导致静态文件(jpg,js,css)被拦截。-->        <!--2、拦截/,例如:/user/add,可以实现现在很流行的REST风格。很多互联网类型的应用很喜欢这种风格的URL。        弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。 -->        <url-pattern>/</url-pattern><!--会拦截URL中带“/”的请求。-->    </servlet-mapping> 4.解决方案 5.编码实战 demo是参考李学凯大神的,他介绍得很好,所以这里就不重复放demo了感兴趣的同学可以去看一下https://blog.csdn.net/qq_27093465/article/details/68961393 6.扩展思考 7.参考文献CSDN、百度百科 8.更多讨论 (1) Springmvc常用的注解都有什么?@Controller是必须的,常用的还有@RequestMapping,@Resource,@ResponseBody,绑定接收参数的有@RequestParam,@PathVariable等等(2)Springmvc怎么配置HandlerMappeing?Springmvc中使用@RequestMapping,告诉前端控制器(DispatcherServlet),请求路径与处理器的方法的对应关系。所以spring配置文件不用配置HandlerMappeing了。(3) Springmvc中需要我们编写的有什么,哪些是被Springmvc封装好了的?一般来说,controller和view层是需要我们自己编写的,其它大部分是被Springmvc封装好了的,所以我们可以更专注于我们的业务逻辑编写。 9.鸣谢:感谢修真院的师兄和CSDN博客上相关的作者,此教程是在他们之前技术分享的基础上完善而成。 10.结束语:今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~ 温馨提示:本人初学java者,如有不对敬请指出,谢谢!---------------------    PPT链接 视频链接更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地
SpringMVC分页查询和显示
这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【SpringMVC分页查询和显示】【修真院Java小课堂】SpringMVC分页查询和显示大家好,我是IT修真院武汉分院第17期的学员王志雄,一枚正直纯洁善良的Java程序员,今天给大家分享一下,修真院官网Java(职业)任务二,深度思考中的知识点——SpringMVC分页查询和显示 1. 背景介绍为什么需要用到分页查询??1、用户体验、页面显示效果: 在开发过程当中,我们经常需要从数据库中查询数据,然后将数据在客户端显示,如果数据量少的话,可以在一个页面上显示完成,但是如果查询的数据是几百条、上千条数据的时候,全部在一个页面上显示出来,非常影响页面的美观性和用户的体验。所以这就用到分页技术。2、服务器资源、性能: 当数据量过大时,可能会导致各种各样的问题发生,例如:服务器资源被耗尽,因数据传输量过大而使处理超时,等等。最终都会导致查询无法完成当数据量过大时,可能会导致各种各样的问题发生,例如:服务器资源被耗尽,因数据传输量过大而使处理超时,等等。最终都会导致查询无法完成 2. 知识剖析分页查询优点  分页查询优点:排版清晰,界面美观每页信息数量固定,查询效率快根据用户的需要,提供适当的数据提高性能,减少内存的压力,提高访问速度 分页查询分类: 逻辑分页逻辑分页是在用户第一次访问时,将数据库的所有记录全部查询出来, 添加到一个大集合中,然后存放在session对象,再通过页码计算出当前页需要显示的数据内容, 存储到一个小的list的集合中,并将其存储到request对象中,跳转到JSP页面,进行遍历显示。 当用户第二次访问时,只要不关闭浏览器,还会从session中获取数据,来进行显示。 缺点:如果需要查询的数据量过大,session将耗费大量的内存; 因为是在session中获取数据,如果第二次或者更多此的不关闭浏览器访问,会直接访问session, 从而不能保证数据是最新的。优点:优点:统一代码处理方式,较容易跨数据库做迁移。 物理分页物理分页使用数据库自身所带的分页机制,例如,Oracle数据库的rownum, 或者Mysql数据库中的limit等机制来完成分页操作。因为是对数据库的数据进行分页条件查询, 所以叫物理分页。每一次物理分页都会去连接数据库。 优点:数据能够保证最新,由于根据分页条件会查询出少量的数据,所以不会占用太多的内存。 2.知识剖析  何为分页技术?分页就是将一段长长的数据,按照特定的长度(数量)进行分开显示分页的核心技术: 分页的核心简单地讲,就是计算每页多少记录和总页数以及第几页。 1、要实现分页显示,需要用到哪些参数private int currPage;//当前页数private int pageSize;//每页显示的记录数private int totalCount;//总记录数private int totalPage;//总页数private List lists;//每页的显示的数据 2、需要用到的语句有1.select count(*) from ...:查询得到记录总条数2.select * from .. limit pageNo,rowsCount:查询从第pageNo条开始的rowsCount条数据。  3.常见问题   SSM框架怎么进行分页查询处理?将数据保存在什么位置?   4.解决方案  在page类中创建集合属性,将数据保存在此集合中   5.编码实战 6.扩展思考  PageHelper的优缺点?优点:封装分页sql,使我们不需要每个地方都去写分页的查询语句;同时,使我们select的sql语句向下兼容,换了数据库也不需要更改sql代码;缺点:自带的Page对象转json时会丢失分页数据;而转为PageInfo对象时分页信息过多 7.参考文献   https://zhidao.baidu.com/question/168096244.htmlhttps://www.cnblogs.com/geningchao/p/6649907.htmlhttps://blog.csdn.net/weixin_41267342/article/details/79151098  8.更多讨论  PageHelper支持哪些数据库?  Mybatis分页插件 支持Oracle、Mysql、MariaDB、SQLite、Hsqldb、PostgreSQL六种数据库 不支持SQL Server,Java开发很少使用SQL数据库  什么时候会导致不安全的分页? PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的。只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。4.X和5.X的配置?5.x版本开始使用com.github.pagehelper.PageInterceptor新版拦截器。总的来说,pagehelper4.x就该用4.x的配置,pagehelper5.x就用5.x的配置(官方推荐) 9.鸣谢 感谢观看,如有出错,恳请指正 10.结束语: 今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~  PPT链接 视频链接 更多内容,可以加入IT交流群565734203与大家一起讨论交流这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地