在 SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)之后,还需要配置一些功能,提供常用的开发功能。
1. 静态文件过滤
两种方式,分别是在spring-mvc配置文件中配置mvc:resources或者在web.xml中配置defaultservlet的优先过滤的项。
<!-- 静态资源解析 js,css,img -->
<mvc:resources location="/source/" mapping="/source/*"/>
<mvc:resources location="/source/" mapping="*.html"/>
<!-- Servlet解析 js,css,img -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
2. 文件上传
配置此文件后可以直接绑定MultipartFile 对象操作上传的文件
public String uploadFile(@RequestParam("uploadTest")MultipartFile upFile) throws IOException{
if(upFile!=null){
String orgName=upFile.getOriginalFilename();
String newName=UUID.randomUUID()+(orgName.length()>0?orgName.substring(orgName.lastIndexOf(".")):"");
File newFile=new File("D:\\pic\\"+newName);
if(!newFile.exists()){
newFile.createNewFile();
}
upFile.transferTo(newFile);
return "success";
}
return "failure";
}
<!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 文件大小最大值 -->
<property name="maxUploadSize" value="10485760000" />
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="40960" />
</bean>
3. 返回JSON数据
<!-- 启用AnnotationMethodHandlerAdapter 否则json乱码-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 -->
</list>
</property>
</bean>
4. SQL注解
可以自动绑定SQL和参数,除XML配置SQL语句外,相对更简单的方法。
@Select("SELECT * FROM staff_info WHERE StaffID=#{staffid}")
Map selectByAnnotation(String staffid);
5. 事务管理
注解配置:@Transactional注解后的参数可以设置事务隔离级别
@Override
@Transactional
public int updateStaffNameAndPhone(String phone, String staffName) {
StaffInfo staff=new StaffInfo();
staff.setStaffphonenumber(phone);
StaffInfoExample example=new StaffInfoExample();
Criteria criteria=example.createCriteria();
criteria.andStaffidEqualTo("20151402002");
staffInfoMapper.updateByExampleSelective(staff, example);
int i=10/0;
StaffInfo staff1=new StaffInfo();
staff1.setStaffname(staffName);
StaffInfoExample example1=new StaffInfoExample();
Criteria criteria1=example1.createCriteria();
criteria1.andStaffidEqualTo("20151402002");
staffInfoMapper.updateByExampleSelective(staff1, example1);
return 0;
}
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 事务注解驱动,标注@Transactional的类和方法将具有事务性 -->
<tx:annotation-driven transaction-manager="transactionManager" />
文件配置:可直接批量配置方法
<!-- 配置参与事务的类 -->
<tx:advice id="TestAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="update*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="allTestServiceMethod" expression="execution(* com.model.service.*.*(..))"/>
<aop:advisor pointcut-ref="allTestServiceMethod" advice-ref="TestAdvice" />
</aop:config>
附:
Propagation :key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。
6. 拦截器
spring-mvc中配置拦截器,在前面的拦截器先执行,继承HandlerInterceptor接口,实现该接口的3个方法。preHandle:处理请求Handle之前执行;postHandle:处理请求Handle之后执行;afterCompletion:最后执行,Handle已经处理完成,比如已经返回数据之后执行。
执行顺序:嵌套执行,先执行第一个拦截器,在第一个拦截器内执行第二个.
<!-- 执行两个拦截器方法的结果LoginInterceptor 在前 -->
LoginInterceptor preHandle
PermissionInterceptor preHandle
PermissionInterceptor postHandle
LoginInterceptor postHandle
PermissionInterceptor afterCompletion
LoginInterceptor afterCompletion
<mvc:interceptors>
<mvc:interceptor>
<!--默认拦截的连接-->
<mvc:mapping path="/**"/>
<!--不拦截的连接-->
<mvc:exclude-mapping path="/staff/show"/>
<bean class="com.model.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/staff/show"/>
<bean class="com.model.interceptor.PermissionInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
// TODO Auto-generated method stub
System.out.println("preHandle");
String testString=arg0.getParameter("interceptor");
if(testString==null||!testString.equals("OK"))return false;
return true;
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("afterCompletion");
}
}
搭配之前转载的SSM框架搭建的文章,基本的配置与功能都可以实现了。