JavaEE简单实例——一些基本操作

news2024/12/23 9:16:57

在配置类中配置页面解析器

之前我们使用页面解析器是在XML配置文件中使用的,但是当我们试用了纯注解式的整合之后,我们没有了配置文件,要如何去将之前我们在配置文件中编写的前端控制器,以及静态资源的释放这些功能配置添加到项目中呢?

这时候我们就需要使用到一个新的接口,叫做WebMvcConfig,这个接口的作用就是用来添加一些对于MVC的配置。当我们自己自己定义的类去实现了这个接口之后,MVC在启动的时候,就会加载这个类中的配置,并应用到项目中,我们可以进入这个接口文件中去看看它具体都可以进行什么配置:

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) // package org.springframework.web.servlet.config.annotation; import java.util.List; import org.springframework.format.FormatterRegistry; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.lang.Nullable; import org.springframework.validation.MessageCodesResolver; import org.springframework.validation.Validator; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; import org.springframework.web.servlet.HandlerExceptionResolver; public interface WebMvcConfigurer { default void configurePathMatch(PathMatchConfigurer configurer) { } default void configureContentNegotiation(ContentNegotiationConfigurer configurer) { } default void configureAsyncSupport(AsyncSupportConfigurer configurer) { } default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { } default void addFormatters(FormatterRegistry registry) { } default void addInterceptors(InterceptorRegistry registry) { } default void addResourceHandlers(ResourceHandlerRegistry registry) { } default void addCorsMappings(CorsRegistry registry) { } default void addViewControllers(ViewControllerRegistry registry) { } default void configureViewResolvers(ViewResolverRegistry registry) { } default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { } default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) { } default void configureMessageConverters(List<HttpMessageConverter<?>> converters) { } default void extendMessageConverters(List<HttpMessageConverter<?>> converters) { } default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { } default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { } @Nullable default Validator getValidator() { return null; } @Nullable default MessageCodesResolver getMessageCodesResolver() { return null; } }

当我们继承了这个类之后,他并没有报错提示我们必须继承的方法,因为这个接口中的方法都是被default修饰的,可以不用必须实现,只需要实现我们想要实现的配置方法即可。我们需要使用的就是配置页面解析器和静态资源的释放。

如果我们是不知道有这个类,我们可以来到官方的帮助文档去查找有没有对应的配置

这就表示在Spring中确实有一个类负责使用Java的方式,也就是使用类的方式去设置一些基础设置,然后我们继续向下找:

可以看到,当我们搜索解析器的时候,就可以看到有一个视图解析器,并且已经给我们列出了方法和对比XML配置文件,我们只需要重写这个方法,并且根据自己的项目在方法中填写参数即可。这样我们就完成了对于页面解析器的配置。

对于静态资源的释放也是一样的,我们在官方的帮助文档中找到对应的方法,然后实现方法,在方法中编写配置即可。

package com.spring.dao; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.ViewResolverRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; public class config implements WebMvcConfigurer { // 视图解析器的配置 @Override public void configureViewResolvers(ViewResolverRegistry registry) { // 第一个参数表示前缀,第二个参数表示后缀 registry.jsp("/SpringMVC/pages",".jsp"); } // 配置静态资源的释放,其实就是将静态资源交给服务器的默认的servlet处理,这里就是将对静态资源的请求交给了Tomcat默认的servlet去处理,也就是不处理 /*官方的原话翻译就是下面这样,我是没看懂 * Spring MVC允许将 映射到 (从而覆盖容器的默认Servlet的映射),同时仍然允许静态资源请求由容器的默认Servlet处理。它配置了一个 ,其URL映射为 ,相对于其他URL映射,其优先级最低。DispatcherServlet/DefaultServletHttpRequestHandler/** 这个 handler 将所有请求转发到默认的 Servlet。因此,它必须在所有其他URL 的顺序中保持最后。如果你使用 ,情况就是这样。 */ @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }

对于这种的,如果我们不确定是否存在一个操作可以方便我们的代码的编写,我们最直观的方法就是去百度,或者去官方文档去找有没有对应的操作。

对于拦截器和过滤器的配置

之前我们说过,JavaEE的拦截器就相当于是JavaWeb的过滤器,但是两者的配置还是有一些区别的,比如我们要在一个项目中要同时出现拦截器和过滤器的时候。

一般来讲,过滤器的作用是修改请求和响应的编码的统一,而拦截器的作用是进行权限校验,比如你没有登录我就不会让你访问除了登陆资源之外的其他资源,知道你登陆为止。这样我们就需要去创建自定义的拦截规则。

我们要配置过滤器只需要像之前那样,在拦截的类名上面添加过滤器注解@WebFilter,然后配置过滤路径即可。

当我们配置拦截器的时候,需要首先定义一个拦截器类,在类中定义拦截规则,然后还是通过实现WebMvcConfig接口去通过方法配置拦截器。

自定义过滤器类:

package com.spring.interceptor;// 拦截器类 import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ResourcesInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 如果用户已经登陆直接放行 Object userSession = request.getSession().getAttribute("USER_SESSION"); if(userSession!=null){ // 返回true表示放行 return true; } // 如果没有登录,判断是否访问的登录相关功能 String requestURI = request.getRequestURI(); if(requestURI.indexOf("login")>0){ return true; } // 如果没有登录,访问的也不是登录相关的功能,则给出错误信息后,跳转到登陆页面 request.setAttribute("msg","请先登录"); request.getRequestDispatcher("/admin/login.jsp").forward(request,response); return false; } }

然后我们需要在**实现了WebMvcConfigurer接口的类中重写一个方法:

@Override public void addInterceptors(InterceptorRegistry registry) { // 为拦截器添加拦截路径和排除路径 registry.addInterceptor(new ResourcesInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/css/**","/js/**","/img/**"); }

通过这个配置,来加载拦截器的拦截路径和放行路径,最终完成拦截器的功能。

分页器的使用

在开发环境中,我们还有一个控件是我们会用到的,就是分页插件,比如在这页中我们要显示几行,将我们的查询结果分多少个页展示,这就需要用到我们的分页插件。虽然这个功能我们的SQL语句也可以实现,使用limit关键字也是可以实现的,但是我们要学习在Java中如何使用分页插件去完成分页的功能。

首先,我们要先在pom文件中引入一个依赖坐标,这个依赖就是我们完成分页的插件:

<!-- 分页插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.2.0</version> </dependency>

添加依赖之后,我们就开始配置我们的分页插件,首先,我们需要声明一个分页器,在我们的MyBatis的配置类中,我们需要写入这样的代码:

// 配置分页插件的拦截器 @Bean public PageInterceptor pageInterceptor(){ PageInterceptor pageInterceptor = new PageInterceptor(); // 分页插件配置 Properties properties = new Properties(); // 开启分页 properties.setProperty("value","true"); // 加载properties配置进pageInterceptor pageInterceptor.setProperties(properties); return pageInterceptor; }

这样表示我们创建一个一个分页器,然后需要将它交给我们的SqlSessionFaction,在之前我们添加的SqlSessionFactionBean中,我们除了要添加一个数据源的变量,还要添加一个分页器的变量,我们通过调用对应的添加分页器的方法,但是这个方法的值是一个对象数组,而我们只需要添加数组中的其中一个,所以我们首先要把我们的自定义分页器自动注入到一个变量中,然后在对象数组中添加这个变量,我们就可以将我们自己编写的分页器添加进去了。

完整的MyBatis配置类的内容如下:

package com.spring.config; import com.github.pagehelper.PageInterceptor; import org.apache.ibatis.plugin.Interceptor; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource;import java.util.Properties; // 相关的配置类@Configuration@MapperScan("com.spring.dao") //使用注解的方式进行包扫描,和MapperScannerConfigurer类功能一样 public class MyBatis { @Autowired // 分页拦截器插件变量 private PageInterceptor pageInterceptor; // 配置sqlSessionFactory @Bean public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){ SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); // 将分页拦截器插件交给MyBatis sqlSessionFactoryBean.setPlugins(new Interceptor[]{pageInterceptor}); return sqlSessionFactoryBean; } 配置分页插件的拦截器 @Bean public PageInterceptor pageInterceptor(){ PageInterceptor pageInterceptor = new PageInterceptor();// 分页插件配置 Properties properties = new Properties(); // 开启分页 properties.setProperty("value","true"); // 加载properties配置进pageInterceptor pageInterceptor.setProperties(properties); return pageInterceptor; } }

现在只是完成了分页器的定义的部分,那么具体要如何去啥用呢?

首先,我们查询的时候,对于结果集的封装,就不能直接封装到实体类中了,而是要封装进一个能被分页器识别的列表中去,我们只需要修改一下我们的结果集封装类即可:

// 根据上架时间查询书籍 @Select("select * from book where book_status != 3 order by book_upload_time desc") @Results(id = "bookMap",value = {@Result(column = "book_id" , property = "id") , @Result(column = "book_name" , property = "name"), @Result(column = "book_isbn" , property = "isbn"),@Result(column = "book_press" , property = "press"), @Result(column = "book_author" , property = "author"),@Result(column = "book_pagination" , property = "pagination"), @Result(column = "book_price" , property = "price"),@Result(column = "book_upload_time" , property = "uploadTime"), @Result(column = "book_status" , property = "status"),@Result(column = "book_borrower" , property = "borrower"), @Result(column = "book_borrower_time" , property = "borrowerTime"),@Result(column = "book_return_time" , property = "returnTime"),}) public Page<book> selectNewBook();

这个能被识别到的集合的名称叫Page,然后泛型还是之前我们的结果集映射类,之后我们就来处理这个集合:

要处理这个集合,我们只需要声明一个集合解析类,然后使用分页解析器,将我们存储在分页中的数据,根据我们传入的参数,这个参数主要是页数和我们一页中显示的商品的列表这两个变量。

首先我们先来看我们的集合解析类:

package com.spring.entity; // 分页结果实体类 import java.io.Serializable; import java.util.List; public class PageResult implements Serializable { // 总数 private long total; // 分页的集合 private List rows; @Override public String toString() { return "PageResult{" + "total=" + total + ", rows=" + rows + '}'; } public long getTotal() { return total; } public void setTotal(long total) { this.total = total; } public List getRows() { return rows; } public void setRows(List rows) { this.rows = rows; } public PageResult(long total, List rows) { this.total = total; this.rows = rows; } public PageResult() { } }

然后就是如何解析我们已经存放在Page列表中的数据:

@RequestMapping("/selectNewbooks") public ModelAndView selectNewBook(){ ModelAndView modelAndView = new ModelAndView(); // 数据和视图 int pageNum = 1; int pageSize = 5; PageResult pageResult = bookService.selectNewBook(pageNum, pageSize); modelAndView.addObject("pageResult",pageResult); modelAndView.setViewName("books_new"); return modelAndView; }

分页器的大概流程

首先我们自下而上,从MyBatis层开始,我们将查询的数据封装进Page集合中,这个集合的泛型是我们自定的结果集映射类。然后来到Service层,在这一层中,我们的方法要返回我们自定义的分页解析类,这个类负责将我们的集合中的数据解析出来,交给前端读取。读取的方式就是讲我们集合中的页数,以及数据交给我们的解析类中,然后构建我们的解析类对象,返回这个对象。然后我们在Controller层中调用Service中的方法,在调用的时候,传入我们要分几页,以及每一页中有几行数据,这样就完成了分页查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/424992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉排序树(二叉查找树)基本操作_20230417

二叉排序树&#xff08;二叉查找树&#xff09;基本操作_20230417 前言 二叉排序树首先是一颗二叉树&#xff0c;它不同于常规二叉树的地方在于&#xff0c;如果左子树不为空&#xff0c;那么左子树上所有结点的值都不大于根节点的值&#xff0c;如果右子树不为空&#xff0c…

从GPT-4、文心一言再到Copilot,AIGC卷出新赛道?

业内人都知道&#xff0c;上一周是戏剧性的&#xff0c;每一天&#xff0c;都是颠覆各个行业&#xff0c;不断 AI 化的新闻。 OpenAI发布GPT-4、百度发布文心一言、微软发布Microsoft 365 Copilot 三重buff叠加&#xff0c;打工人的命运可以说是跌宕起伏&#xff0c;命途多舛了…

pmp证书报考流程+pmp备考+pmp学习干货+pmp指南汇总

2023年共有4次PMP考试&#xff0c;分别是3月、5月、8月、11月&#xff0c;由于3月份考试不开放新报名&#xff0c;所以第一次备考PMP的同学可以选择参加5月份考试。那么&#xff0c;现在备考5月份PMP考试还来得及吗&#xff1f; 现在开始备考5月PMP考试&#xff0c;时间是非常…

Scrum

目录 1、Scrum&#xff1a; 敏捷里的3355&#xff1a; 什么是Scrum&#xff1a; Scrum的优点&#xff1a; Scrum的理论&#xff1a; Scrum的三大支柱&#xff1a; 透明性&#xff1a; 检视&#xff1a; 调整&#xff1a; 2、Scrum的角色简介&#xff1a; Scrum各角色…

【数据结构学习笔记 之 栈和队列】——上

前言&#xff1a;栈和队列是常用的数据结构之一&#xff0c;本文主要介绍有关栈的基本特性以及基本操作和一些经典的OJ题目&#xff0c;关于队列的介绍放到下篇。那么话不多说&#xff0c;让我们开始吧。 一、栈的基本知识 1. 栈的基本概念 栈是一种特殊的线性表&#xff0c…

同学在外包干了两年的点点点,24岁人就快废了

前言 简单的说下&#xff0c;我大学的一个同学&#xff0c;毕业后我自己去了自研的公司&#xff0c;他去了外包&#xff0c;快两年了我薪资、技术各个方面都有了很大的提升&#xff0c;他在外包干的这两年人都要废了&#xff0c;技术没一点提升&#xff0c;学不到任何东西&…

JavaScript 的学习

文章目录一、简介总结一、简介 JavaScript 是互联网上最流行的脚本语言&#xff0c;这门语言可用于 HTML 和 web&#xff0c;更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。 JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言。 JavaScript 是可插入…

如果要向“硅谷精神之父”提一道问题,你会问什么?| CSDN 访谈世界互联网教父 Kevin Kelly

ChatGPT 的问世不禁让人遐想&#xff0c;接下来的 5000 天&#xff0c;将会发生什么事&#xff1f; 硅谷精神之父、世界互联网教父、《失控》作者凯文凯利&#xff08;Kevin Kelly&#xff0c;以下简称 K.K.&#xff09;是这样预测的&#xff1a; 未来将会是一切都与 AI 相连的…

Vue3通知提醒框(Notification)

Vue3相关组件项目依赖版本信息 可自定义设置以下属性&#xff1a; 消息的标题&#xff08;title&#xff09;&#xff0c;默认温馨提示自动关闭的延时时长&#xff08;duration&#xff09;&#xff0c;单位ms&#xff0c;默认4500ms消息从顶部弹出时&#xff0c;距离顶部的位…

【问题】开发遇到的小问题

文章目录使用糊涂工具&#xff0c;将时间字符串转化为LocalDateTime类型Date类型转换LocalDate类型jdk8 LocalDateTime获取当前时间和前后推时间echarts图中显示表格是需要添加宽高前端往后端传值时&#xff0c;需要转一下对象再往后端传使用 value-format"yyyy-MM-dd HH:…

jwt授权

JWT格式 由header、payload、signature三部分组成&#xff0c;中间用圆点(.)连接: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJpYW0uYXBpLm1hcm1vdGVkdS5jb20iLCJleHAiOjE2NDI4NTY2MzcsImlkZW50aXR5IjoiYWRtaW4iLCJpc3MiOiJpYW0tYXBpc2VydmVyIiwib3JpZ19pYXQiOjE2MzUw…

拼团系统开发|全民拼购商业模式解读

拼团系统开发|拼团模式在市场上已经屡见不鲜&#xff0c;某夕夕就是这方面的典范。不过现在市场上又出现一种升级版的拼团商业模式&#xff0c;也就是全民拼购&#xff0c;它除了可以帮助商家提升销量&#xff0c;还有引流裂变获客的效果&#xff0c;因此受到了许多企业商家的热…

chatgpt教你练习前端算法

今天想试试chatgpt关于代码算法这一块儿是否好用。 判断质数 上面的代码有一点小问题&#xff0c;当num为2时&#xff0c;返回的结果是错误的&#xff0c;我改进了一下&#xff0c;并优化了一点性能 // 判断是否是素数&#xff08;质数&#xff09; function isprime(number)…

【Linux】用LCD文字祝愿(Framebuffer+Freetype)

目录 前言 一、LCD操作原理 &#xff08;1&#xff09;LCD和Framebuffer。 &#xff08;2&#xff09;LCD的操作&#xff1a; &#xff08;3&#xff09;核心函数&#xff08;后续也会经常用到&#xff09; ①open函数 ②ioctl函数 ③mmap函数 二、字符的点阵显示 &a…

4K高清修复,模糊视频4k修复是怎么实现的?

在当今数字时代&#xff0c;高分辨率视频已成为大众观影的标配。4K分辨率作为其中高端的选项&#xff0c;提供了比传统1080p高出四倍的细节和清晰度&#xff0c;使得观众们能够更加身临其境地享受影视作品。然而&#xff0c;有时候我们可能会遇到4K视频质量不佳的问题&#xff…

Chapter3-用适合的方式发送和接收消息

3.1 不同类型的消费者 消费者可分为两种类型。 一个是DefaultMQPushConsumer &#xff0c;由系统控制读取操作&#xff0c;收到消息后自动调用传人的处理方法来处理&#xff1b;另 一个是 DefaultMlConsumer &#xff0c;读取操作中的大部分功能由使用者自主控制 。 3.1.1 Def…

uni-app:登录与支付--用户信息

用户信息 实现用户头像昵称区域的基本布局 在 my-userinfo 组件中&#xff0c;定义如下的 UI 结构&#xff1a; <template><view class"my-userinfo-container"><!-- 头像昵称区域 --><view class"top-box"><image src"…

如何通过小程序容器技术实现App的灰度发布

在当今移动应用市场竞争激烈的环境下&#xff0c;如何更快地发布新版本、更精确地测试和调整、更好地了解用户需求和行为&#xff0c;成为了每个App开发者面临的重要挑战。在这个背景下&#xff0c;灰度发布和小程序容器技术成为了越来越受欢迎的解决方案。 灰度发布是指将新版…

【Linux高性能服务器编程】I/O复用的高级应用

文章目录一、基于 select 的非阻塞 connect二、基于 poll 的聊天室程序2.1 客户端2.2 服务器三、基于 epoll 实现同时处理 TCP 和 UDP 服务一、基于 select 的非阻塞 connect connect系统调用的 man 手册中有如下一段内容&#xff1a; EINPROGERESS The socket is nonblocking…

ChatGPT既然这么火,有没有弊端呢?

介绍 在现代社会中&#xff0c;人们越来越依赖技术来解决问题。聊天机器人是一种最新的技术趋势&#xff0c;这种技术可以为人们带来很多便利。而ChatGPT聊天机器人则是其中的一种&#xff0c;它使用了大型的语言模型GPT&#xff08;Generative Pre-trained Transformer&#…