Spring +SpringMVC+Mybatis项目详细构造

一,文档详解

1,web.xml配置

配置spring监听器:

指定spring配置文件的位置和名称,扫描会先扫描此文件,此文件中的扫描文档作为父类扫描,父类扫描不可访问子类扫描,子类扫描可访问父类扫描

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
配置启动spring框架的监听器
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
配置spring MVC的前端控制器
  <!--名称 --><servlet-name>springmvc</servlet-name><!-- Servlet类 --><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
​<init-param><!--SpringMVC配置参数文件的位置 --><param-name>contextConfigLocation</param-name><!--默认名称为ServletName-servlet.xml --><param-value>classpath:springMVC.xml</param-value></init-param><!-- 启动顺序,数字越小,启动越早 --><load-on-startup>1</load-on-startup>
</servlet>
所有的请求必须经过前端控制器
<!--所有请求都会被springmvc拦截 -->
<servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
配置文档扫描的字符编码过滤器
<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>
</filter>
将字符过滤编码器映射到所有文件
<!--  配置filter的映射-->
<filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
配置日志使用
  <context-param><param-name>log4jConfigLocation</param-name><param-value>classpath:log4j.properties</param-value></context-param>
<!--  能够动态修改log4j.properties的关键,容器会每60秒扫描log4j的配置文件,单位为毫秒--><context-param><param-name>log4jRefreshInterval</param-name><param-value>60000</param-value></context-param>

2,Spring的xml文件配置

配置mybatis相关的东西
<!--配置解析 Properties 文件的工具类-->
<context:property-placeholder location="classpath:druid.properties"/>
​
<!--配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><!-- 连接数据库的驱动,连接字符串,用户名和登录密码--><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><!-- 数据池中最大连接数和最小连接数--><property name="maxActive" value="${maxActive}"/><property name="minIdle" value="${initialSize}"/>
</bean>
​
<!--        配置分页插件-->
<bean id="page" class="com.github.pagehelper.PageInterceptor"><property name="properties"  value="mysql"/>
</bean>
​
<!-- 获取 SqlSessionFactory 对象,并交由 spring 管理-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 注入连接池给 sqlsessionFactory 的属性 dataSource 赋值ref="引用该 spring容器 中的另一个 bean的id"--><property name="dataSource" ref="dataSource"/><!--配置mybatis分页插件--><property name="plugins" ref="page"/><!--配置实体类的别名,使得使用时可直接使用类名,而不用使用全路径名--><property name="typeAliasesPackage" value="com.cn.entity"/><!--        mapper和接口位置不同则需要配置--><!-- 注入 映射文件 mapper给 sqlsessionFactory 的属性 mapperLocation 赋值value="映射文件 XXXmapper.xml 的相对路径"--><property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
​
<!--配置 MapperScannerConfigurer-->
<!--    扫描mapper所在包 为mapper创建实现类-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.cn.mapper"/>
</bean>
配置Spring的注解扫描(父类扫描)

spring层扫描controller或者扫描全部(这里扫描全部)

<!--配置注解扫描-->
<context:component-scan base-package="com.cn"><!--排除controller的扫描--><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>
针对数据库的操作进行事务的切面管理
 <!--    配置事务管理器的切面--><bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--    事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--    配置事务属性--><tx:advice id="myAdvice" transaction-manager="transactionManager" ><tx:attributes>
<!--            method表示让哪些方法进行事务控制 propagation 表示事务的传播行为 REQUIRED表示必须运行于一个事务之中--><tx:method name="add*" propagation="REQUIRED"/><tx:method name="update*" propagation="REQUIRED"/><tx:method name="delete*" propagation="REQUIRED"/><tx:method name="findByID*" propagation="REQUIRED"/><tx:method name="findAll*" propagation="REQUIRED"/><tx:method name="login*" propagation="REQUIRED"/></tx:attributes></tx:advice>
配置切点位置
<!--    配置切点 (* com.cn.service.*.*(..))表示所有com.cn.service下的所有包的所有类的所有方法--><aop:config><aop:pointcut id="Pointcut" expression="execution(* com.cn.service.*.*(..))"/><aop:advisor advice-ref="myAdvice" pointcut-ref="Pointcut"/></aop:config>

3,SpringMVC.xml文件配置

基本配置
<!-- 开启注解扫描,自动扫描包,实现支持注解的IOC -->
<context:component-scan base-package="com.cn.controller" />
​
<!-- Spring MVC不处理静态资源 -->
<mvc:default-servlet-handler />
​
<!-- 支持mvc注解驱动 -->
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/></list></property>
</bean>
跨域配置
<mvc:cors><mvc:mapping path="/**"允许哪些域名allowed-origins="http://127.0.0.1:5323, http://localhost:5323, http://localhost:8080"允许通过哪些方式访问allowed-methods="GET, PUT,POST,DELETE"允许哪些请求头allowed-headers="*"是否允许写入cookieallow-credentials="true"最大为123秒,过后报错max-age="123" />
</mvc:cors>
配置视图解析器
<!--    配置jsp视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">以什么开头的<property name="prefix" value="/jsp/"/>以什么结尾的<property name="suffix" value=".jsp"/></bean>
文件上传配置
<!--    多部件解析器的id必须为:multipartResolver--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--        设置上传文件总容量,单位为字节:10M:10*1024*1024;默认为:-1即无限大,随意传--><property name="maxUploadSize" value="10485760"/>
<!--        设置文件名的编码格式--><property name="defaultEncoding" value="utf-8"/></bean>
相应返回的乱码处理
<!--    处理返回json字符串中乱码问题-->
<mvc:annotation-driven><mvc:message-converters><bean class="org.springframework.http.converter.StringHttpMessageConverter"><property name="supportedMediaTypes"><list><value>application/json;charset=UTF-8</value></list></property></bean></mvc:message-converters>
</mvc:annotation-driven>
配置拦截器
<mvc:interceptors><!--        配置拦截谁--><mvc:interceptor><!--            拦截所有--><mvc:mapping path="/**"/><!--            哪些不拦截--><mvc:exclude-mapping path="/login.html"/><mvc:exclude-mapping path="/login"/><!--            对应哪些拦截器--><bean class="com.cn.filter.MvcInterceptars"/></mvc:interceptor>
</mvc:interceptors>

二,完整的事务处理

1,controller层

2,serviceImpl 事务实现层

3,dao 的mapper文件

4,文件上传

5,过滤器实现

6,异常处理

指定异常的处理

其它异常的处理

三,细节处理

1,图片保存的存值

在图片保存中可以指定保存于数据库的路径名,我保存的是\img\b7422cb6-962e-44bb-9908-88b338d8046b.jpg此种类型的,

在target路径下img位置如下:

当服务器启动状态时,直接访问域名+端口+\img\b7422cb6-962e-44bb-9908-88b338d8046b.jpg可直接访问图片。

但由于前端是跨域访问的,所以图片会自动找寻本端口下的图片,会出现找不到的情况。

处理方法1:在拿到数据库图片地址时,添加域名和端口。如图:

处理方法2:在给数据库存值时,直接存储域名+端口+\img\b7422cb6-962e-44bb-9908-88b338d8046b.jpg

2,分页处理
使用sql进行查询

使用layui自身分页处理分页的时候,需要在查询sql后加入limit x,y ; x为(curPage-1)*pageSize , y为pageSize

使用静态表格时,第一次向后台查询数据不需要传入数据,由于没有数据,需要在后台对curPage,pageSize做默认值处理。

查询完返回给前端后,前端拿到总数量时再申请一次请求,查询完整数据。

使用mybatis的pagehelper进行查询

分页信息

PageHelper.startPage(X,Y);

这里X直接为curPage,Y则为pageSize。startPage需要放在查询之前。

获取查询总数

List<UserEntity> userEntities = userService.fuzzyQuery(userEntity);
PageInfo<UserEntity> pageInfo =new PageInfo<>(userEntities);
int counts = (int) pageInfo.getTotal();
调试错误注意

在mapper种拼接sql语句时,不能加入其它不相干的东西,就算是注释也不行,直接把原来limit x,y 注释掉后。sql拼接会把注释掉的语句一同拼入sql进行查询。从而会报错。

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

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

相关文章

LeetCode --- 399周赛

题目列表 3162. 优质数对的总数 I 3163. 压缩字符串 III 3164. 优质数对的总数 II 3165. 不包含相邻元素的子序列的最大和 一、优质数对的总数I 这里由于数据范围比较小&#xff0c;我们可以直接暴力枚举&#xff0c;代码如下 class Solution { public:int numberOfPairs…

5292A 物联网信号分析仪

5292A 物联网信号分析仪 —— 10MHz&#xff5e;6GHz —— 简述 5292A物联网信号分析仪是一款通用的矢量信号分析仪&#xff0c;频率范围覆盖 10MHz&#xff5e;6GHz&#xff0c;具有良好的频率、功率测量精度和稳定度&#xff1b;支持模拟与数字调制信号、全制式的通信标准…

【错误记录】HarmonyOS 运行报错 ( Failure[MSG_ERR_INSTALL_FAILED_VERIFY_APP_PKCS7_FAIL] )

文章目录 一、报错信息二、问题分析二、解决方案 一、报错信息 在 DevEco Studio 中 , 运行程序 , 编译时正常编译 , 但是在真机运行时 , 报如下错误 , 核心报错信息是 " Failure[MSG_ERR_INSTALL_FAILED_VERIFY_APP_PKCS7_FAIL] " ; 完整报错信息 : 05/29 10:58:55…

【机器学习300问】104、残差网络是怎么起作用的?

残差网络&#xff08;Residual Network&#xff0c;简称ResNet&#xff09;诞生是为了解决深度神经网络的训练困难性问题。深度神经网络在图像分类等任务上取得了重大突破&#xff0c;但随着网络层数的增加&#xff0c;训练变得更加困难。 一、神经网络深度过深会出现…

用docker搭建的Vulfocus镜像管理界面没有镜像可以拉取解决办法

ps&#xff1a;截止到今天2023.4.2&#xff0c;kali和vps的docker拉取的vulfocus镜像会有版本的区别&#xff0c;虽然都是拉取的最新版&#xff0c;vps上镜像为3个月以前&#xff0c;kali上为16个月以前&#xff0c;所以在修改 views.py 文件时&#xff0c;可能会发现文件内容不…

国家首批20个“数据要素×”典型案例发布,珈和科技助力金融、气象两案例入榜

5月24日&#xff0c;国家数据局会同生态环境部、交通运输部、金融监管总局、中国科学院、中国气象局、国家文物局、国家中医药局等部门在第七届数字中国峰会主论坛上发布首批20个“数据要素”典型案例。 其中&#xff0c;珈和科技以其专业的产品和服务助力金融服务领域的浙江网…

GDPU 操作系统 天码行空13

文章目录 ❌ TODO&#xff1a;本文仅供参考&#xff0c;极有可能有误1.生产者消费者问题&#xff08;信号量&#xff09;&#x1f496; ProducerConsumerExample.java&#x1f3c6; 运行结果 &#x1f496; ProducerConsumerSelectiveExample.java&#x1f3c6; 运行结果 2.实现…

【UnityShader入门精要学习笔记】第十五章 使用噪声

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 使用噪声上…

【JS基础语法04】运算符分类以及运用

一&#xff1a;赋值运算符 1 类型 赋值运算符包括以下&#xff1a;、、-、*、/ 2 原理 &#xff0c;是将等号右边的数赋值给左边以为例(-、*、/和运算逻辑是相同的) let num 5 num2 等价于 let num 5 numnum2 //num7 二&#xff1a;一元运算符 1怎么判断运算符是几元…

多条文本转二维码怎么做?一键批量建码的使用技巧

怎么快速的制作多条文本信息的二维码&#xff1f;随着二维码的广泛使用&#xff0c;现在很多内容都可以通过生成二维码扫码的方式来获取信息&#xff0c;其他文本二维码就是比较常用的一种类型。那么当需要将多条不同的文本内容每条单独生成二维码时&#xff0c;有什么方法可以…

【Uniapp微信小程序】自定义水印相机、微信小程序地点打卡相机

效果图 template 下方的image图片自行寻找替换! <template><view><camerav-if="!tempImagePath && cameraHeight !== 0":resolution="high":frame-size="large":device-position="device":flash="flas…

2台倍福PLC ADS通信配置

倍福PLC的入门应用介绍请参考下面文章链接: 1、倍福PLC简单入门 从零开始倍福TwinCAT 3 PLC 的一个简单项目-CSDN博客文章浏览阅读34次。这篇文章我们介绍如何开始一个简单的倍福PLC项目。https://rxxw-control.blog.csdn.net/article/details/139124427 1、配置路由 2、…

笔记92:离散LQR控制器详细推导

1&#xff09;离散LQR的推导原理&#xff1a; 拉格朗日乘子法都是在等式约束下用的&#xff1b; 对这个性能函数J运用拉格朗日乘子法后&#xff0c;得到的函数是二次型函数&#xff08;即转化为了最优化控制问题&#xff09;&#xff0c;二次型函数只有一个极值点而且是极小值点…

机器视觉分析在加油站安全中的应用:使用手机检测、打电话行为识别

在加油站等高危场所&#xff0c;禁止使用手机是为了防止潜在的火灾和爆炸风险。手机在使用过程中可能产生电火花&#xff0c;而在加油站这种易燃易爆环境中&#xff0c;任何电火花都可能引发严重的安全事故。因此&#xff0c;加油站禁止使用手机是保障安全生产的重要措施。基于…

FDW(Foreign Data Wrapper)

在上一篇博客里&#xff0c;最末尾提到了 FDW。 FDW 到底是什么呢&#xff1f; 标准 FDW&#xff08;Foreign Data Wrapper&#xff09;遵循了 SQL/MED 标准&#xff0c;标准全称&#xff1a;ISO/IEC 9075-9 Management of External Data (SQL/MED) 2003 年&#xff0c;SQL…

小程序内的分包与数据共享

一:数据共享 小程序内的数据共享和vue当中不一样,vue当中的vue实例可以使得所有的组件都能this.store 但是小程序它只有page对象,和组件实例对象.对于vue而言,vue实例可以使得添加的组件都有. 但是page对象页面对象,不能使得页面内部有.只能使得这个页面内能访问.vue实例,会…

Pooling Sequencing

1、混合(Pooling)样本测序研究 https://www.jianshu.com/p/19ce438ccccf 1.1 混合测序基础 测序成本虽然下降了,但对于植物育种应用研究来说还是很高,动不动就上百群体,小小植物个体价值又低,测完了很可能后面就用不到了。这时,混合样本测序是一种省钱的好办法。 混池…

使用PyAutoGUI识别PNG图像并自动点击按钮

在自动化测试、任务批处理等场景中,我们常常需要控制GUI程序的鼠标键盘操作。PyAutoGUI就是一个非常方便的Python模块,可以帮助我们实现这些操作。今天我们就来看看如何使用PyAutoGUI识别屏幕上的PNG图像,并自动点击图像所在位置。 C:\pythoncode\new\autoguirecongnizepng.py …

超结MOS在全桥电路上的应用-REASUNOS瑞森半导体

一、前言 全桥电路定义 全桥电路是一种常见的电子电路&#xff0c;由四个开关管和一个负载组成&#xff0c;可将直流电转换为交流电。 全桥电路的应用领域 全桥电路广泛应用于电力电子领域&#xff0c;如开关电源、变频器、逆变器、电动汽车、工业自动化等领域 。在电路中&…

Make-An-Audio——用于语音生成的提示增强扩散模型

0.引言 论文提出了一个从文本生成语音的扩散模型 Make-An-Audio。该模型将文本提示作为输入&#xff0c;并据此生成语音。例如&#xff0c;输入 “一只猫在喵喵叫&#xff0c;一个年轻女人的声音”&#xff0c;就会输出猫在喵喵叫&#xff0c;一个女人在说话的音频。这项研究已…