Spring +SpringMVC+Mybatis项目详细构造

一,文档详解

1,web.xml配置

配置spring监听器:

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

XML 复制代码
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
配置启动spring框架的监听器
XML 复制代码
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
配置spring MVC的前端控制器
XML 复制代码
  <!--名称 -->
  <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>
所有的请求必须经过前端控制器
XML 复制代码
<!--所有请求都会被springmvc拦截 -->
<servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>
配置文档扫描的字符编码过滤器
XML 复制代码
<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>
将字符过滤编码器映射到所有文件
XML 复制代码
<!--  配置filter的映射-->
<filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
配置日志使用
XML 复制代码
  <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相关的东西
XML 复制代码
<!--配置解析 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或者扫描全部(这里扫描全部)

XML 复制代码
<!--配置注解扫描-->
<context:component-scan base-package="com.cn">
    <!--排除controller的扫描-->
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>
针对数据库的操作进行事务的切面管理
XML 复制代码
 <!--    配置事务管理器的切面-->
    <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>
配置切点位置
XML 复制代码
<!--    配置切点 (* 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文件配置

基本配置
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>
跨域配置
XML 复制代码
<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>
配置视图解析器
XML 复制代码
<!--    配置jsp视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        以什么开头的
        <property name="prefix" value="/jsp/"/>
        以什么结尾的
        <property name="suffix" value=".jsp"/>
    </bean>
文件上传配置
XML 复制代码
<!--    多部件解析器的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>
相应返回的乱码处理
XML 复制代码
<!--    处理返回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>
配置拦截器
XML 复制代码
<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进行查询

分页信息

java 复制代码
PageHelper.startPage(X,Y);

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

获取查询总数

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

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

相关推荐
liuyunshengsir4 分钟前
Spring Boot 使用 Micrometer 集成 Prometheus 监控 Java 应用性能
java·spring boot·prometheus
路上阡陌13 分钟前
Java学习笔记(二十四)
java·笔记·学习
何中应23 分钟前
Spring Boot中选择性加载Bean的几种方式
java·spring boot·后端
苏苏大大25 分钟前
zookeeper
java·分布式·zookeeper·云原生
wclass-zhengge1 小时前
03垃圾回收篇(D3_垃圾收集器的选择及相关参数)
java·jvm
涛ing1 小时前
23. C语言 文件操作详解
java·linux·c语言·开发语言·c++·vscode·vim
5xidixi1 小时前
Java TCP协议(2)
java·tcp/ip
2013crazy1 小时前
Java 基于 SpringBoot+Vue 的校园兼职平台(附源码、部署、文档)
java·vue.js·spring boot·兼职平台·校园兼职·兼职发布平台
enjoy嚣士1 小时前
mybatis-plus之使用lombok的@Builder注解之后的坑
mybatis·lombok
小高不明1 小时前
仿 RabbitMQ 的消息队列3(实战项目)
java·开发语言·spring·rabbitmq·mybatis