maven搭建ssm
前言
本文旨在利用maven搭建ssm环境,而关于maven的具体内容,大家可以去阅读《Maven 实战》。其实园内这方面文章已有不少,那么为什么我还要重复造轮子呢?我只是想记录自己的实践过程罢了,附带着给别人以参考。对于别人的博文,看了固然好,要是能付之实践,那就更好了!
maven安装
安装过程挺简单的,去apache下载apache-maven的zip包,解压到一个目录下,如下图
接下来配置windows环境,右击我的电脑--》属性--》高级系统设置--》环境变量--》系统变量--》新建,如下图
就是你解压的maven的home目录;接着编辑系统变量的Path,如图
其实跟配置java环境是一样的,最后几个连续确定之后就好了,这几个确定一定要点,不然配置不会保存,更不会生效! home路径一定要写自己的,别搬我的呀!路径最好是拷贝,手动输入太容易出错了。
接下来验证环境是否配置成功,打开命令行,输入mvn -v 如果出现下图的信息,那么恭喜你,配置成功了!当然,信息可能有些许出入,如版本不同等,这些不用在意。
Eclipse(java ee版)集成maven
一般而言,新的eclipse都已经集成了maven,如果没有那么就安装,点击eclipse菜单栏Help->Eclipse Marketplace搜索关键字maven到插件Maven Integration for Eclipse 并点击安装即可,接下来将eclipse集成的maven换成我们自己的,而不用eclipse自带的,重新定位,点击Window -> Preference -> Maven -> Installation -> Add进行设置,如下图
设置完成,那么eclipse配置maven就完成了,myeclipse配置和这个是一样的。
创建ssm项目
选择建立Maven Project 选择File -> New -> Other,在New窗口中选择 Maven -> Maven Project;点击next,如下图
选择项目路径,如下图,然后next
选择项目类型 选择Artifact Id为maven-archetype-webapp那一项,如下图
输入Group ID和 Artifact ID,以及Package,具体Group ID和 Artifact ID代表什么,可以去阅读《Maven 实战》,Group ID相当于一个组织,而Artifact ID相当于这个组织下的一个具体项目,Packege的话会根据你的Group ID和Artifact ID生成一个默认的名称,就用默认的就可以,如下图
点finish之后,项目结构如下图
若目录结构和上面的有差别,那么将perspective改成Java模式就好了。上面的目录结构离标准的maven web结构还有一点差别,少了一个文件夹src/test/resources,我们手动创建下,右键项目根目录点击New -> Source Folder,建出这个文件夹,如下图:
Finish之后,项目结构图如下所示:
把项目变成Dynamic Web项目右键项目,properties --》Project Facets,点击Convert to faceted fro,勾上Dynamic Web Module,并将Version为2.3。(3.0为Java7的)。
设置部署程序集(Web Deployment Assembly)
上面步骤设置完成后,点击OK,再右键项目,选择properties --》Deployment Assembly,如下图
此处列表是,部署项目时,文件发布的路径。
(1)我们删除test的两项,因为test是测试使用,并不需要部署。
(2)设置将Maven的jar包发布到lib下。
Add -> JavaBuild Path Entries -> Maven Dependencies -> Finish
设置完成效果图
构建框架
在pom.xml中添加所需要的jar包,内容如下图
如果依赖不知道怎么写,比如groupId、artifactId、version不知道填什么,那么直接上http://search.maven.org/搜,对应着填写就可以了,如下图
保存pom.xml,maven就会帮我们下载我们配置的所有jar包了,jar包依赖的jar包也会自动下载,是不是很方便!当然,这个下载可能需要较长的时间,不要急,当eclipse右下角的百分比进度没有了,就下载好了。jar包下载完成后,项目结构图如下
配置文件
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>note</display-name> <!-- Spring和mybatis的配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mybatis.xml</param-value> </context-param> <!-- 编码过滤器 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <async-supported>true</async-supported> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Shiro Filter --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Spring监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 中央控制器 springMVC加载 --> <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/springMVC-servlet.xml</param-value> </init-param> --> <load-on-startup>1</load-on-startup> <!-- 配置spring异步支持 --> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
applicationContext.xml
为空啦,其实也可以填写,然后在下面的xml中引入,无所喂!(#`O′)的
spring-mybatis.xml
<?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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"> <context:annotation-config /> <!-- 自动扫描 --> <context:component-scan base-package="com.mi.dao" /> <!-- jdbc资源国际化 引入配置文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean> <!-- 定义数据源的信息 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${jdbc.driverClass}" /> <property name="jdbcUrl" value="${jdbc.jdbcUrl}" /> <property name="user" value="${jdbc.user}" /> <property name="password" value="${jdbc.password}" /> <!--连接池中保留的最大连接数。Default: 15 --> <property name="maxPoolSize" value="80" /> <!--连接池中保留的最小连接数。 --> <property name="minPoolSize" value="10" /> <property name="initialPoolSize" value="1" /> <!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> <property name="maxIdleTime" value="20" /> <!--每60秒检查所有连接池中的空闲连接。Default: 0 --> <property name="idleConnectionTestPeriod" value="60" /> <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> <property name="acquireRetryAttempts" value="30" /> <property name="breakAfterAcquireFailure" value="true" /> <property name="testConnectionOnCheckout" value="false" /> </bean> <!-- Spring和MyBatis完美整合,不需要mybatis的配置映射文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动扫描mapping.xml文件 --> <property name="mapperLocations" value="classpath:com/mi/mapping/*Mapper.xml"></property> </bean> <!-- DAO接口所在包名,Spring会自动查找其下的类 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.mi.dao" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> <!-- 事务管理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 页面资源国际化 --> <bean id="propertyResource" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="locations"> <list> <!-- 消息提示 --> <value>classpath:MessageResources.properties</value> <!-- 系统字段 --> <value>classpath:system.properties</value> </list> </property> </bean> <!-- shiro --> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"></bean> <!-- 数据库保存的密码是使用MD5算法加密的,所以这里需要配置一个密码匹配对象 --> <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.Md5CredentialsMatcher"></bean> <!-- 缓存管理 --> <bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager"></bean> <!-- 使用Shiro自带的JdbcRealm类 指定密码匹配所需要用到的加密对象 指定存储用户、角色、权限许可的数据源及相关查询语句 --> <bean id="jdbcRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm"> <property name="credentialsMatcher" ref="credentialsMatcher"></property> <property name="permissionsLookupEnabled" value="true"></property> <property name="dataSource" ref="dataSource"></property> <property name="authenticationQuery" value="SELECT password FROM sec_user WHERE user_name = ?"></property> <property name="userRolesQuery" value="SELECT role_name from sec_user_role left join sec_role using(role_id) left join sec_user using(user_id) WHERE user_name = ?"></property> <property name="permissionsQuery" value="SELECT permission_name FROM sec_role_permission left join sec_role using(role_id) left join sec_permission using(permission_id) WHERE role_name = ?"></property> </bean> <!-- Shiro安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="jdbcRealm"></property> <property name="cacheManager" ref="cacheManager"></property> </bean> <!-- Shiro主过滤器本身功能十分强大,其强大之处就在于它支持任何基于URL路径表达式的、自定义的过滤器的执行 Web应用中,Shiro可控制的Web请求必须经过Shiro主过滤器的拦截,Shiro对基于Spring的Web应用提供了完美的支持 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- Shiro的核心安全接口,这个属性是必须的 --> <property name="securityManager" ref="securityManager"></property> <!-- 要求登录时的链接(登录页面地址),非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面 --> <property name="loginUrl" value="/security/login"></property> <!-- 登录成功后要跳转的连接(本例中此属性用不到,因为登录成功后的处理逻辑在LoginController里硬编码) --> <!-- <property name="successUrl" value="/" ></property> --> <!-- 用户访问未对其授权的资源时,所显示的连接 --> <property name="unauthorizedUrl" value="/"></property> <property name="filterChainDefinitions"> <value> /security/*=anon /tag=authc </value> </property> </bean> <!-- 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro注解的类, 并在必要时进行安全逻辑验证 --> <!-- <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"></property> </bean> --> </beans>
springMVC-servlet.xml
<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <!-- 启动注解驱动的Spring MVC功能,注册请求url和注解POJO类方法的映射 --> <mvc:annotation-driven /> <!-- 启动包扫描功能,以便注册带有@Controller、@Service、@repository、@Component等注解的类成为spring的bean --> <context:component-scan base-package="com.mi" /> <!-- 静态资源配置 --> <mvc:resources mapping="/image/**" location="/image/" cache-period="31556926" /> <mvc:resources mapping="/js/**" location="/js/" cache-period="31556926" /> <mvc:resources mapping="/css/**" location="/css/" cache-period="31556926" /> <!--避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 --> </list> </property> </bean> <!-- 对模型视图名称的解析,在请求时模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/page/" /> <property name="suffix" value=".jsp" /> <property name="contentType" value="text/html;charset=UTF-8" /> <property name="order" value="1" /> </bean> <!-- 配置文件上传,如果没有使用文件上传可以不用配置,如果不配置,那么配置文件中也不必引入上传组件包 --> <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> <!--********************全局异常处理******************** --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <!-- 表示当抛出NumberFormatException的时候就返回名叫number的视图 *!!*后面填写的必须是路径+视图名 --> <prop key="NumberFormatException">/error/number</prop> <prop key="NullPointerException">/error/503</prop> </props> </property> <!-- 表示当抛出异常但没有在exceptionMappings里面找到对应的异常时 返回名叫exception的视图 --> <property name="defaultErrorView" value="exception" /> <!-- 定义在发生异常时视图跟返回码的对应关系 --> <property name="statusCodes"> <props> <!-- 表示在发生NumberFormatException时返回视,然后这里定义发生异常时视图number对应的HttpServletResponse的返回码是500 --> <prop key="/error/number">500</prop> <!-- 上面的视图名key~~ --> <prop key="/error/503">503</prop> </props> </property> <!-- 表示在发生异常时默认的HttpServletResponse的返回码是多少,默认是200 --> <property name="defaultStatusCode" value="404" /> <!-- 设置日志输出级别,不定义则默认不输出警告等错误日志信息 --> <property name="warnLogCategory" value="WARN"></property> </bean> <!-- 配置自定义拦截器 --> <mvc:interceptors> <!--在<mvc:interceptors>下定义的bean会拦截所有请求 --> <bean class="com.mi.interceptor.SpringMvcInterceptor"></bean> <mvc:interceptor> <mvc:mapping path="/note/user/hello.do" /><!-- 为毛拦截不到呢,擦 --> <bean class="com.mi.interceptor.SpringMvcInterceptor2"></bean> </mvc:interceptor> </mvc:interceptors> </beans>
log4j.properties
jdbc.properties
#jdbc
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost/mi
jdbc.user=root
jdbc.password=dbdaocom
项目结构图如下
java文件与jsp文件
mysql数据库表
最终效果
那么恭喜你,也恭喜我,搭建ssm成功了!
后话
用心的小伙伴应该发现了,前面的windows配置maven和我们用eclipse搭建ssm没有一点关系,确实和ssm搭建没有什么卵关系,我写出来是为什么了,就是有时候我们不用IDE工具,而在dos命令下利用maven搭建我们的项目的时候,那么windows配置maven就需用到了!