一,文档详解
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进行查询。从而会报错。