SSM框架--小功能整合

来源:互联网 发布:西南政法大学王洪 知乎 编辑:程序博客网 时间:2024/06/08 20:09

在 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 preHandlePermissionInterceptor preHandlePermissionInterceptor postHandleLoginInterceptor postHandlePermissionInterceptor afterCompletionLoginInterceptor 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框架搭建的文章,基本的配置与功能都可以实现了。