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="*"
                 是否允许写入cookie
                 allow-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进行查询。从而会报错。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

go语言的使用方法

一.go语言的介绍 1.简介 2.应用领域 3.使用go语言的公司 4.go语言开发工具介绍 5.go语言开发环境搭建 【1】搭建Go开发环境-安装和配置SDK 基本介绍: 1).SDK的全称(Software Development Kit软件开发工具包&#xff09;2).SDK是提供给开发人员使用的&#xff0c;其中包含了…

记一次SpringCloud OpenFeign 服务调用传递 token @Async 上下文信息获取失败

一、场景 在异步方法中使用了feign调用&#xff0c;发现提示“您还未登录或登录已失效”。那原因很明了就是我的登录信息没办法传入到feign的调用方法里。 二、考虑的解决办法 1&#xff09;尝试一&#xff1a;ServletRequestAttributes attributes (ServletRequestAttrib…

高维数组到向量的转换:两种方法的深度解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;高维数组的挑战与需求 二、方法一&#xff1a;使用NumPy库进行展平 示…

【数据分析面试】56.数据格式转换(Python:melt函数)

题目 给定一个df&#xff0c;包含ABCDE多个列。请编写一个 Python 程序&#xff0c;将列 ‘D’ 和 ‘E’ 转换为长格式&#xff0c;并使用 ‘A’、‘B’ 和 ‘C’ 作为标识符。 换句话说&#xff0c;将数据中的D、E两列转换为行&#xff0c;使数据从宽变长。 示例&#xff1…

BH-0.66 6000/5/150电流互感器 塑壳 JOSEF约瑟

BH-0.66 15/5塑壳式电流互感器 BH-0.66 20/5塑壳式电流互感器 BH-0.66 30/5塑壳式电流互感器 BH-0.66 40/5塑壳式电流互感器 BH-0.66 50/5塑壳式电流互感器 BH-0.66 75/5塑壳式电流互感器 BH-0.66 100/5塑壳式电流互感器 BH-0.66 150/5塑壳式电流互感器 BH-0.66 200/5塑壳式…

职校老师的工资待遇怎么样

工资水平一直是教师们关注的焦点&#xff0c;毕竟&#xff0c;工资不仅关系到个人的生活品质&#xff0c;还影响着教师的职业满意度和工作动力。职校教师的工资待遇究竟是怎样的呢&#xff1f; 职校教师的工资水平受多种因素影响&#xff0c;包括地区、学校类型、个人资历和教学…

【OrangePi AIpro】香橙派 AIpro 为AI而生

产品简介 OrangePi AIpro(8T)&#xff1a;定义边缘智能新纪元的全能开发板 在当今人工智能与物联网技术融合发展的浪潮中&#xff0c;OrangePi AIpro(8T)凭借其强大的硬件配置与全面的接口设计&#xff0c;正逐步成为开发者手中的创新利器。这款开发板不仅代表了香橙派与华为…

pyqt Qtreeview分层控件

pyqt Qtreeview分层控件 介绍效果代码 介绍 QTreeView 是 PyQt中的一个控件&#xff0c;它用于展示分层数据&#xff0c;如目录结构、文件系统等。QTreeView 通常与模型&#xff08;如 QStandardItemModel、QFileSystemModel 或自定义模型&#xff09;一起使用&#xff0c;以管…

【机器学习300问】105、计算机视觉(CV)领域有哪些子任务?

计算机视觉作为人工智能的重要分支&#xff0c;发展至今已经在诸多领域取得显著的成果。在众多的计算机视觉任务中&#xff0c;图像分类、目标检测与定位、语义分割和实例分割是四个基本而关键的子任务&#xff0c;它们在不同的应用场景下扮演着重要角色。这四个子任务虽然各具…

【408真题】2009-23

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

Ps系统教程03

选区工具的组合使用 先用魔棒将大致区域点击圈主 会发现一些零散的小区域 使用套索工具进行区域的加减&#xff08;按住shift/alt键进行相关区域加减&#xff09; 可以放大查看 基本处理完细节之后 如果把不用的填充背景直接按delete删除&#xff0c;那么原版图案就会…

研学活动报名二维码怎么制作?

在组织研学活动时&#xff0c;老师们经常面临报名流程繁琐、信息收集不全面、统计工作耗时等问题&#xff1f;如何高效地管理学生的报名信息&#xff0c;确保活动顺利进行呢&#xff1f; 现在我们有了更多的选择。老师们可以快速制作出研学活动的研学活动报名二维码怎么制作&am…

深度解析搜索引擎广告(SEM)与社交媒体广告(SMM):NetFarmer助力企业数字化出海

在当今数字化时代&#xff0c;企业出海已经成为了一个必然趋势。然而&#xff0c;如何有效地在海外市场中推广品牌、吸引潜在客户&#xff0c;成为了众多企业面临的重要挑战。搜索引擎广告&#xff08;SEM&#xff09;和社交媒体广告&#xff08;SMM&#xff09;作为两种主要的…

Ex 防爆标准解读

以如下标准为例&#xff1a; Ex t IIIB T2 40 Db 解读&#xff1a; Ex防爆 t&#xff1a; IIIB T2 40 T2为温度等级&#xff0c;40为最大表面温度40度 Db 设备防护用于22区 类似铭牌为

能芯(EnChip)模拟芯片应用和选型

数据显示&#xff0c;超过60%的驾驶者会在开车时听音乐&#xff0c;这不仅可以提高驾驶者的注意力&#xff0c;还可以缓解驾驶过程中产生的疲劳和压力&#xff0c;特别是在长途驾驶或交通拥堵时尤其明显。基于音乐欣赏&#xff0c;高保真音质是音响系统的核心指标之一&#xff…

【考研数学】李艳芳900比李林880难吗?值得做吗?

差不多&#xff0c;只能说基础没搞好刷这两个都很费劲 李艳芳900题把每个章节题目划分为ABC三个难度级别&#xff0c;题目选取的难度较大也比较新颖&#xff0c;计算量也非常接近考研趋势&#xff0c;原创性很高&#xff0c;比较适合过完一轮的同学继续做补充和强化 880算是比…

算法与数据结构:二叉排序树与AVL树

ACM大牛带你玩转算法与数据结构-课程资料 本笔记属于船说系列课程之一&#xff0c;课程链接&#xff1a; 哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep66799?csourceprivate_space_class_null&spm_id_from333.999.0.0 你也可以选择购买『船说系列课程-年度会…

【C++】:vector容器的底层模拟实现迭代器失效隐藏的浅拷贝

目录 &#x1f4a1;前言一&#xff0c;构造函数1 . 强制编译器生成默认构造2 . 拷贝构造3. 用迭代器区间初始化4. 用n个val值构造5. initializer_list 的构造 二&#xff0c;析构函数三&#xff0c;关于迭代器四&#xff0c;有关数据个数与容量五&#xff0c;交换函数swap六&am…

R语言入门 | 使用 ggplot2 进行数据可视化

1.0准备工作 先下好tidyverse包&#xff0c;并进行加载。 install.packages ( "tidyverse" ) library(tidyverse) R 包只需安装一次&#xff0c;但每次开始新会话时都要重新加载。 1.1 数据框 数据框是变量&#xff08;列&#xff09;和观测&#xff08;行&#x…

AppInventor2 表格布局的外面的黑框怎么去掉?

问&#xff1a;表格布局的外面的黑框怎么去掉啊&#xff1f; 答&#xff1a;这个黑框是界面设计的布局位置示意&#xff0c;实际 App 测试时并没有框。 来源&#xff1a;AppInventor2 表格布局的外面的黑框怎么去掉&#xff1f; - App应用开发 - 清泛IT社区&#xff0c;为创新…