1、spring 事物处理机制
需要抛出异常事物处理机制才能捕捉到
<!-- 配置事务 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 使用annotation定义事务--> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> <aop:config proxy-target-class="true"> <aop:pointcut id="servicePointcut" expression="execution(service.impl..*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut" order="2"/> <aop:advisor advice-ref="dataSourceExchange" pointcut-ref="servicePointcut" order="1"/> </aop:config>
public Result insertEnumber(EnumberDto enumberDto) throws Exception {
Result result = new Result();
List<EnumberDetailDto> detailList = new ArrayList<EnumberDetailDto>();
int num = enumberDto.getQuantity();
for (int i = 0; i < num; i++) {
EnumberDetailDto detailBean = new EnumberDetailDto();
detailBean.setBatchNo(enumberDto.getBatchNo());
detailBean.seteCode(DateUtils.getTimestampStr() + new Random().nextInt(10000));
detailBean.setState("NOTOUT");
detailBean.setAgentId(enumberDto.getAgentId());
detailBean.setAgentName(enumberDto.getAgentName());
detailBean.setCreateBy(enumberDto.getCreateBy());
detailBean.setModifyBy(enumberDto.getModifyBy());
detailList.add(detailBean);
}
enumberDao.insertEnumber(enumberDto);
enumberDetailDao.insertEnumberDetailList(detailList);
result.setSuccess(true);
return result;
}
2、将对象自动封装成json传到前台
在方法上加入@ResponseBody,同时方法返回值为实体对象,spring会自动将对象转换为json格式,并返回到客户端。如下所示:
@RequestMapping("/json1")
@ResponseBody
public Demo json1() {
Demo demo=new Demo();
demo.setBirthday(new Date());
demo.setCreateTime(new Date());
demo.setHeight(170);
demo.setName("tomcat");
demo.setRemark("json测试");
demo.setStatus((short)1);
return demo;
}
3、避免IE执行AJAX时,返回JSON出现下载文件的配置
4、post提交中文乱码解决方案
<filter> <filter-name>CharacterEncodingFilter</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-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
5、想要通过AppContextUtil.getBean("***")获取对象,必须将该对象对应的路径配置到mybatis对应的配置文件中;
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-- 引入jdbc配置文件 -->
<context:property-placeholder location="/WEB-INF/jdbc.properties" />
<!-- 要通过 AppContextUtil.getBean("privilegeService")获得service这个一定要在Mybatis配置文件中-->
<context:component-scan base-package="com.service" />
<!--创建jdbc数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
<!-- 创建session工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描com/dao/impl/下的*.Impl文件, 省掉mybatis-config.xml里的手工配置 -->
<property name="mapperLocations" value="classpath*:/com/dao/impl/*Impl.xml"/>
</bean>
<!-- 扫描,自动装配com.dao下的类(映射扫描) -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.dao" />
</bean>
<!--把mybatis的事务交由spring去管理 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注意:此处的数据源要与sqlSessionFactory中的dataSource相同 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 注解方式配置事物 -->
<tx:annotation-driven />
</beans>
说明: 要想通过 AppContextUtil.getBean("privilegeService")获得service,一定洋将
<context:component-scan base-package="com.service" />,配置到mybatis配置数据员的配置文件中,如上面例子。
6、下载文件
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
public class FileDown {
/**
* 下载pdf
* @param pictureShoppertrakAddress pdf地址
* @param pdfName pdf文件名
*/
public void downPdfFile(String pictureShoppertrakAddress,String pdfName){
HttpServletResponse response = ServletActionContext.getResponse();
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
//pdfName = "activityPdf_1441441792005.pdf"
response.setHeader("Content-Disposition", "attachment;fileName=" + pdfName);
try {
//pictureShoppertrakAddress = "E:/shoppertrak/file";
InputStream inputStream = new FileInputStream(new File(pictureShoppertrakAddress + File.separator + pdfName));
OutputStream os = response.getOutputStream();
byte[] b = new byte[2048];
int length;
while ((length = inputStream.read(b)) > 0) {
os.write(b, 0, length);
}
// 这里主要关闭。
os.close();
inputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
7、springMVC组件
@Component:组件,项目启动后加载累
@Scheduled(fixedRate = 50000):延时,XXX毫秒;
package com.wanrong.task.jobs;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
......
/**
* 类ScheduledTasks.java的实现描述:TODO 类实现描述
*/
@Component
public class ScheduledTasks {
protected Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
TaskInfoService taskInfoService;
@Scheduled(fixedRate = 50000)
public void taskStart() {
QueryResult<TaskInfoDTO> result = taskInfoService.queryTaskInfoAll();
// 判断是否成功
if (result.isSuccess()) {
List<TaskInfoDTO> taskList = result.getResults();
for (TaskInfoDTO taskInfo : taskList) {
if (taskInfo.getStatus() == 1) {
boolean flag = QuartzManager.checkExists(taskInfo.getJobName(), taskInfo.getJobGroup());
if (!flag) {
QuartzManager.addJob(taskInfo.getJobName(), taskInfo.getJobGroup(), taskInfo.getTriggerName(),taskInfo.getTriggerGroupName(), taskInfo.getProcessClass(), taskInfo.getCronExpression());
logger.info("------" + taskInfo.getJobName() + "----" + taskInfo.getJobGroup() + "-------add succeed-----");
}
}
}
} else {
logger.error("call taskInfoService.queryTaskInfoAllWithCached error");
}
}
}
8、两个对象之间的属性拷贝
org.springframework.beans.BeanUtils.copyProperties(msg, cardInfo);
说明:将msg对象的属性拷贝到cardInfo对象中