eclipse创建maven+SpringMVC+Mybatis动态web工程完整示例
来源:互联网 发布:滴滴算法大赛冠军代码 编辑:程序博客网 时间:2024/06/05 21:51
1.新建maven项目,如果不在上面,请到other里面去找一下
2,进入maven项目之后,点击next
选择webapp之后 next
输入两个id package可以不写,是它默认帮你新建一个包,不写没关系
会生成一个这样目录的项目
2,配置maven
首先新建几个文件夹
2.1 添加Source文件夹
接下来需要添加
src/main/java
src/test/java
src/test/resources三个文件夹
右键项目根目录点击New -> Source Folder,
建出这三个文件夹。注意不是建普通的Folder,而是Source Folder。
项目或者文件加上右键 new sourceFolder,正常情况下是没有问题的
如果出现了下面的这情况,其实是真的存在的只是我们看不到
项目右键属性
切换成这样子就好了
设置好了之后发现
java就已经有了
继续新建其他的几个还没有的
新建之后就这样子了
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.(如果没有选上的话)
此处还可以更改显示顺序
此处还可以更改jdk
右键属性 project Facets
想要切换成3.0发现报错
这是因为新建项目的时候
用了maven-artchetype-webapp
由于这个catalog比较老,用的servlet还是2.3的
<?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
修改成
-------
修改成
重新打开属性 project Facets,看到这个地方已经修改成3.0; 勾选上tomcat
项目工程创建完成
new 一个server
启动之后看看有无报错,目前没有
运行一下,测试没问题,至此maven web项目创建完成
最后可以根据需要配置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,内容略。
- eclipse创建maven+SpringMVC+Mybatis动态web工程完整示例
- Eclipse创建WEB工程Maven+Spring+SpringMVC+MyBatis示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse创建maven项目(动态web工程)完整示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse 创建maven 项目 动态web工程完整示例
- eclipse 创建maven 项目 动态web工程完整示例(亲测,很好)
- 2017ACM-ICPC全国邀请赛(广西)
- Codeforces Round #430 (Div. 2) D
- Atitit 组织架构的如何划分 划分方法attilax大总结
- 图
- Atitit 减少财政支出之减少通讯支出 解决方案attilax总结
- eclipse创建maven+SpringMVC+Mybatis动态web工程完整示例
- Spring的IOC原理
- Atitit管理学课程表 管理学体系
- Python装饰器的理解
- apache 配置虚拟目录
- 盘点互联网金融的十种运作模式2
- Git命令
- 准备开学囖!
- 盘点互联网金融的十种运作模式2