eclipse创建maven+SpringMVC+Mybatis动态web工程完整示例

来源:互联网 发布:滴滴算法大赛冠军代码 编辑:程序博客网 时间:2024/06/05 21:51

1.新建maven项目,如果不在上面,请到other里面去找一下

4bc45379-9a01-4ed1-8671-2502184817ab

2,进入maven项目之后,点击next

b7f2746f-bd7f-4120-9f72-ffb4d6f333d5

选择webapp之后  next

da7bdfe4-ae0f-4031-b539-b29dc84ee55f

输入两个id  package可以不写,是它默认帮你新建一个包,不写没关系

2858f54d-0f5d-4c89-98cb-9e034246f7fc

会生成一个这样目录的项目

82370fe2-eeb0-4329-8f64-6211ef44b515

2,配置maven

首先新建几个文件夹

2.1 添加Source文件夹

接下来需要添加

src/main/java

src/test/java 

src/test/resources三个文件夹

右键项目根目录点击New -> Source Folder,

建出这三个文件夹。注意不是建普通的Folder,而是Source Folder

项目或者文件加上右键 new  sourceFolder,正常情况下是没有问题的

如果出现了下面的这情况,其实是真的存在的只是我们看不到

c11f0c74-6f2c-48d0-b670-fc8732a6e370

项目右键属性

5eca2484-567c-4ecc-a60b-8fb8fb3b45d2

c60b4c7b-e90d-497d-87b0-71fa4864e1e4

9f47bd00-72d1-4250-b9f3-ce71821f5630

切换成这样子就好了

c2683bbe-2e10-4570-abb8-12fc4efe1223

设置好了之后发现

9fa41717-c27a-4427-abd6-c991dfd22e82

java就已经有了

继续新建其他的几个还没有的

新建之后就这样子了

644111c7-352f-43b2-a5cf-d5080783e1ae

2.2 更改class路径

右键项目,Java Build Path -> Source

下面应该有4个文件夹。src/main/java,src/main/resources,src/test/java ,src/test/resources。

双击每个文件夹的Output folder,选择路径。

src/main/java,src/main/resources,选择target/classes;

src/test/java ,src/test/resources, 选择target/test-classes;

选上Allow output folders for source folders.(如果没有选上的话)

85d08a77-0e84-4c7e-be6f-4cdd3a8225d8

此处还可以更改显示顺序

f12e377c-1453-40e1-b8d6-bf589b0a3d47

此处还可以更改jdk

f69a61ed-0a5f-4967-9b11-ffa5817b4930

右键属性  project Facets

想要切换成3.0发现报错

48282720-4b81-4e40-9f1c-8d7e51e153f1

这是因为新建项目的时候

用了maven-artchetype-webapp

由于这个catalog比较老,用的servlet还是2.3的

54d87aeb-f12b-44dd-b491-a47fe65592ce

84624b26-6f46-415e-85f1-f0ced682e4e3

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0"

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

 

<display-name>Archetype Created Web Application</display-name>

</web-app>

-------------

org.eclipse.jdt.core.prefs

91cb6455-f69c-413c-87b4-c29af44bfdd6

修改成

7691cbbe-a776-4b59-8617-a6e282fc2cde

-------

307f8b1e-8e0d-4504-9b99-5193f5bfbfed

修改成

00ca9a57-ab8b-40f4-9d6e-ba65425fde60

重新打开属性 project Facets,看到这个地方已经修改成3.0; 勾选上tomcat

 

5a589660-a961-4f4c-868c-e0bb2bcf2b64

项目工程创建完成

new 一个server

启动之后看看有无报错,目前没有

9257b51a-ab4b-4193-a7d7-3eb5c810344b

运行一下,测试没问题,至此maven  web项目创建完成

b2405870-de8a-43d3-82aa-bd69b3f890f9

 最后可以根据需要配置pom.xml的依赖项:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>SpringMVCMavenSample</groupId>  <artifactId>SpringMVCMavenSample</artifactId>  <packaging>war</packaging>  <version>0.0.1-SNAPSHOT</version>  <name>SpringMVCMavenSample Maven Webapp</name>  <url>http://maven.apache.org</url>  <dependencies><!-- ********************junit******************************* --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><!-- 也可以用把值写到properties中,与springVersion一样 --><scope>test</scope></dependency><!-- *******************fastjson************************* --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.25</version></dependency><!-- ********************Spring依赖********************* --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${springVersion}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${springVersion}</version><type>jar</type></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${springVersion}</version><type>jar</type></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${springVersion}</version><type>jar</type></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${springVersion}</version><type>jar</type></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${springVersion}</version><type>jar</type></dependency><!-- ***************连接MySQL数据库需要的jar包*************** --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.34</version></dependency><!-- *************dbcp连接池需要的jar包*********************** --><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><!-- ********************jstl需要的jar包********************** --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- log4j需要的jar包 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!-- 文件上传需要的jar包 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.2.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>1.4</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><type>jar</type></dependency>  </dependencies>  <build>    <finalName>SpringMVCMavenSample</finalName>  </build><properties><springVersion>4.2.3.RELEASE</springVersion></properties></project>


pom.xml文件中的springVersion的值也可以通过properties文件配置,方式如下:

在resource文件夹下新建文件xxx.properties,内容如下:

springVersion=4.2.3.RELEASE
然后在web.xml加上如下配置:

<properties resource="classpath:*.properties"/>
如果结合Spring,则可以用以下方式配置

<context:property-placeholder location="classpath:*.properties" file-encoding="UTF-8" />

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">                <property  name="fileEncoding" value="UTF-8"/>         <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/><property name="locations"><list><value>classpath:*.properties</value></list></property>    </bean>

下面是SpringMVC配置:

1、配置web.xml

1.1 配置其它xml文件的位置:

<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:application*.xml</param-value></context-param>

1.2 配置SpringMVC核心控制器:

    <!-- Spring MVC 核心控制器 DispatcherServlet 配置 -->      <servlet>          <servlet-name>dispatcher</servlet-name>          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>          <init-param>              <param-name>contextConfigLocation</param-name>              <param-value>classpath:spring-mvc.xml</param-value>          </init-param>        <load-on-startup>1</load-on-startup>      </servlet>      <servlet-mapping>          <servlet-name>dispatcher</servlet-name>          <!-- 拦截所有/ 的请求,交给DispatcherServlet处理,性能最好 -->          <url-pattern>/</url-pattern>      </servlet-mapping> 
1.3 配置编码格式:
<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>          <init-param>              <param-name>forceEncoding</param-name>              <param-value>true</param-value>          </init-param>      </filter>      <filter-mapping>          <filter-name>encodingFilter</filter-name>        <url-pattern>/*</url-pattern>      </filter-mapping>

1.4 其它配置:



2、配置spring-mvc.xml

<!-- 扫描所有@Controller,注意,不要扫描service层,否则会导致事务失效--><context:component-scan base-package="com.xxx.xxx.*.controller" />
<context:component-scan base-package="com.xxx.xxx.*.*.controller" />
<mvc:annotation-driven/><!-- 声明支持注解--><!-- 支持返回json--> <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/plain;charset=UTF-8</value></list></property></bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="cacheSeconds" value="0"/> <property name="messageConverters"> <list> <ref bean="stringHttpMessageConverter"/> </list> </property> </bean><!-- 配置springMVC处理上传文件的信息 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8"/> <property name="maxUploadSize" value="10485760"/> <property name="maxInMemorySize" value="40960"/> </bean><!--配置VIEW视图--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> <property name="prefix" value="/pages/"></property> <property name="suffix" value=".jsp"></property> </bean>
<mvc:interceptors>   <!-- 拦截器,可有多个 -->   <mvc:interceptor>    <mvc:mapping path="/manage/**" /><!-- 指定拦截的请求,可有多个 -->    <mvc:exclude-mapping path="/resources/**" /><!-- 指定不拦截的请求,可有多个 -->    <bean class="com.xxxx.filter.MyFilter" />   </mvc:interceptor>    </mvc:interceptors>
其中MyFilter.java需要实现HandlerInterceptor或继承HandlerInterceptorAdapter,可以重写preHandle、postHandle、afterCompletion,通过response.sendRedirect(request.getContextPath()+"xxx/login");可以重定向到登录页面。

<!-- 访问默认跳转到登录页面 --><mvc:view-controller path="/" view-name="forward:/login"/>

<!-- 配置静态资源映射,如果不配置,会报404错误--><mvc:resources location="/resources/" mapping="/resources/**" /><mvc:resources location="/pages/" mapping="/pages/**" />
resources和pages文件夹都位于webroot或webapp文件夹下,resources文件夹可以包含js、css、images等文件夹,当然也可以把js、css等文件夹移到和pages同一层,这时需要分别配置,如下:
<mvc:resources location="/js/" mapping="/js/**" /><mvc:resources location="/css/" mapping="/css/**" /><mvc:resources location="/images/" mapping="/images/**" /><mvc:resources location="/pages/" mapping="/pages/**" />

3、配置applicationContext.xml,名字随便取

如果web.xml有配置,就不需要再配置以下内容:

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">                <property  name="fileEncoding" value="UTF-8"/>         <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/><property name="locations"><list><value>classpath:*.properties</value></list></property>    </bean>

配置扫描所有的service、dao(mybatis配置中包含了dao扫描,这里可以不用配置)等,可以全部扫描,也可以分开扫描:
<context:component-scan base-package="com.xxx.xxx.*.*.service" /><context:component-scan base-package="com.xxx.xxx.*.*.dao" /><context:component-scan base-package="com.xxx.xxx.*.*.其它注解" />
或所有注解都扫描:
<context:component-scan base-package="com" />
配置数据源及Mybatis:
  <!-- 配置数据源-->  <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource"        init-method="init" 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}" />               <property name="initialSize" value="${jdbc.initialSize}" />        <property name="maxActive" value="${jdbc.maxActive}" />        <property name="minIdle" value="${jdbc.minIdle}" />        <property name="maxWait" value="${jdbc.maxWait}" />        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,相当于C3P0的idleConnectionTestPeriod 参数,单位是毫秒 -->        <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->        <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" /><!-- 测试连接,单位为毫秒 -->        <property name="validationQueryTimeout" value="300000" />        <property name="validationQuery" value="SELECT sysdate from dual" />        <property name="testWhileIdle"   value="true" />        <property name="testOnBorrow"    value="false" />        <property name="testOnReturn"    value="false" />        <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->        <!-- 如果用Oracle,则把poolPreparedStatements配置为true,MySQL可以配置为false。 -->        <property name="poolPreparedStatements" value="true" />        <property name="maxPoolPreparedStatementPerConnectionSize" value="50" />        <!-- 属性类型是字符串,通过别名的方式配置扩展插件, 常用的插件有: 监控统计用的filter:stat  日志用的filter:log4j 防御sql注入的filter:wall -->        <property name="filters" value="${druid.filters}" />          </bean>
    <!-- 扫描所有mapper.xml文件 -->      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">    <property name="dataSource" ref="druidDataSource"></property>    <property name="configLocation" value="classpath:mybatisConfig.xml"></property>    <property name="mapperLocations" value="classpath*:mapper/**/*Mapper.xml"></property>    </bean> 
    <!-- 扫描所有dao -->      <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" p:basePackage="com.*.*.dao"            p:sqlSessionFactoryBeanName="sqlSessionFactory"/> 

mybatisConfig.xml文件内容大致如下:

<?xml version="1.0" encoding="UTF-8" ?>  <!DOCTYPE configuration          PUBLIC "-//mybatis.org//DTD Config 3.0//EN"          "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><settings>          <setting name="logImpl" value="LOG4J"/>          <!-- 全局映射器启用缓存 -->          <setting name="cacheEnabled" value="true"/>          <!-- 查询时,关闭关联对象即时加载以提高性能 -->          <setting name="lazyLoadingEnabled" value="true"/>          <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->          <setting name="multipleResultSetsEnabled" value="true"/>          <!-- 允许使用列标签代替列名 -->          <setting name="useColumnLabel" value="true"/>          <!-- 不允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->          <setting name="useGeneratedKeys" value="false"/>          <!-- 给予被嵌套的resultMap以字段-属性的映射支持 FULL,PARTIAL -->          <setting name="autoMappingBehavior" value="PARTIAL"/>          <!-- 对于批量更新操作缓存SQL以提高性能 BATCH,SIMPLE -->          <!-- <setting name="defaultExecutorType" value="BATCH" /> -->          <!-- 数据库超过25000秒仍未响应则超时 -->          <!-- <setting name="defaultStatementTimeout" value="25000" /> -->          <!-- Allows using RowBounds on nested statements -->          <setting name="safeRowBoundsEnabled" value="false"/>          <!-- Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn. -->          <setting name="mapUnderscoreToCamelCase" value="true"/>          <!-- MyBatis uses local cache to prevent circular references and speed up repeated nested queries. By default (SESSION) all queries executed during a session are cached. If localCacheScope=STATEMENT               local session will be used just for statement execution, no data will be shared between two different calls to the same SqlSession. -->          <setting name="localCacheScope" value="SESSION"/>          <!-- Specifies the JDBC type for null values when no specific JDBC type was provided for the parameter. Some drivers require specifying the column JDBC type but others work with generic values               like NULL, VARCHAR or OTHER. -->          <setting name="jdbcTypeForNull" value="OTHER"/>          <!-- Specifies which Object's methods trigger a lazy load -->          <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>          <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->          <setting name="aggressiveLazyLoading" value="false"/>      </settings>  </configuration> 

事务控制有编程式和声明式两大类,编程式就是用java实现事务的开启和提交/回滚,粒度最小,可以控制到方法中的代码块,但编码较多。通常采用声明式,声明式有两种,一种是通过tx和aop配置文件来配置,另一种是通过@transactional注解,可以用于类和方法,有需要时我们也可以进行手工提交/回滚事务。

两者都要配置以下内容:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"            p:dataSource-ref="druidDataSource"/>

1)手工提交/回滚事务

通过在service类中加上:

@Autowired

DataSourceTransactionManager transactionManager;

然后代码中通过transactionManager打开事务,提交/回滚事务,代码:

DefaultTransactionDefinitiondef=newDefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);// 事物隔离级别,开启新事务,这样会比较安全些。TransactionStatus status = transactionManager.getTransaction(def);// 获得事务状态try{//TODO 操作数据库的逻辑代码transactionManager.commit(status);}catch(Exception e){transactionManager.rollback(status);}


2)、通过tx和aop实现事务控制:

配置代理方式:

    <!-- CGLIB代理 -->      <aop:aspectj-autoproxy proxy-target-class="true"/>

声明对事务注解的支持

    <!-- 声明对事务注解的支持 -->      <tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>
配置事务具体内容:

    <tx:advice id="txAdvice" transaction-manager="transactionManager">          <tx:attributes>              <tx:method name="create*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>              <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>              <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Throwable"/>              <tx:method name="execute*" propagation="REQUIRES_NEW" rollback-for="java.lang.Throwable"/>              <tx:method name="decreaseIsComplete*" propagation="REQUIRES_NEW" rollback-for="java.lang.Throwable"/>            <tx:method name="query*" read-only="true"/>              <tx:method name="count*" read-only="true"/>              <!-- 其他方法使用默认的事务管理 -->              <tx:method name="*"/>          </tx:attributes>      </tx:advice>          <aop:config>          <aop:pointcut id="serviceMethods" expression="execution(* com.service..*(..))"/>          <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>       </aop:config>

3)、通过@transactional实现事务控制

// 指定回滚@Transactional(rollbackFor=Exception.class)     public void methodName() {       // 回滚       throw new Exception("...");    } //指定不回滚@Transactional(noRollbackFor=Exception.class)    public ItimDaoImpl getItemDaoImpl() {        // 不会回滚        throw new RuntimeException("注释");    }     // 如果有事务,那么加入事务,没有的话新建一个(不写的情况下)    @Transactional(propagation=Propagation.REQUIRED)     // 容器不为这个方法开启事务    @Transactional(propagation=Propagation.NOT_SUPPORTED)    // 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务    @Transactional(propagation=Propagation.REQUIRES_NEW)     // 必须在一个已有的事务中执行,否则抛出异常    @Transactional(propagation=Propagation.MANDATORY)    // 必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)    @Transactional(propagation=Propagation.NEVER)     // 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.    @Transactional(propagation=Propagation.SUPPORTS)         /*    public void methodName(){       // 本类的修改方法 1       update1();       // 调用其他类的修改方法       other.update();       // 本类的修改方法 2       update2();    }    其中3个update方法都加了事务注解,methodName()没有加事务,该类中的两个update方法的事务不起作用(调用同一个类的事务方法的问题请看http://blog.csdn.net/wudiyong22/article/details/77853347),other.update()失败了只会回滚该方法,不会影响导致其它两个update方法回滚    */@Transactional(propagation=Propagation.NESTED) // readOnly=true只读,不能更新,删除 @Transactional (propagation = Propagation.REQUIRED,readOnly=true) // 设置超时时间@Transactional (propagation = Propagation.REQUIRED,timeout=30)// 设置数据库隔离级别@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)


aop的其它配置,可以单独作为一个xml文件,如applicationSpringAOP.xml,内容略。






 
阅读全文
1 0
原创粉丝点击