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进行查询。从而会报错。

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目是用的spring springMVC myBatis框架,前段没用框架,只写了简单的页面效果,做增删查改 这是我系统学习所得,希望能对你有所帮助 项目部署: 1;导包,就是web-inf下lib,让后把这些选中,单击右键build path -->add library 2;web.xml配置文件,这里几乎不需要改,以后要用只需要复制就行 3;具体框架配置文件,都集中在了sourceConfig文件夹下,这个自己琢磨,以后再用这个框架也是几乎不需要改的,之所以说几乎,是因为只需要改包名就可以了 4;写bean,写dao,写service,写controller,这是重点 5;bean下写要操作的数据表,记住这个类药与数据库中的表一致,最好一模一样,避免麻烦 6;dao下写数据库操作内容,那下面有两个文件名一样的,一个是java文件,一个是xml文件,java文件是定义方法名,xml文件是让你写具体的数据操作方法的,格式就是这样,你看看就能懂,你只需要这样写,这个框架就可以识别,吧你在xml中写的数据库操作方法匹配到java文件中的方法,这是mybatis做的事 7;service包中放你的业务逻辑层,具体来说就是,dao中只放数据操作,service引用数据操作,还可以有其他操作 8;controller类的格式你要用心点了,这个是控制器,控制请求的跳转,他和servlet的功能类似, 功能引导: 为了让你更方便了解这个项目,说一下流程 1.把项目部署到tomcat,启动服务, 2.在浏览器中输入http://localhost:8080/AscentSys/user/in.do 3.这个命令的意思是,访问这个项目地址user/in.do,然后这个请求就会发送到controller中,在controller中首先匹配到user,在匹配到in.do就调到具体的方法中去处理这个情求了,这里会跳转到users文件夹下的login.jsp页面中,解释一下,在spring-servlet.xml配置文件中有一句路径解析的,“前缀后缀”那个bean,意思是在返回的东西加前缀后缀,这里写的是啥你琢磨琢磨可以明白的 4.在login.jsp页面中,有个提交地址,是login.do,按上面说的,在controller中首先匹配到user,在匹配到login.do就调到具体的方法中去处理这个情求了,后面的流程我就不说了,自己看 5。再说一点,return的好多字符串,有的是redirect:/user/userlist.do这样的格式,意思是转发,就是转到另一个请求中去,同理,具体意思是,在controller中首先匹配到user,在匹配到userlist.do就调到下面的方法中去处理这个情求了, 6,关于传参数的问题,在表单中写的属性,在controller自动接收,也可以接受user对象,如果是对象,那个表单的格式你要看仔细了和一般表单的不同之处。琢磨琢磨你会明白的, 希望能对你有所帮助
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值