现在的java框架已经从SSH(spring+struts+Hibernate)过渡到了SSM(spring+springmvc+mybatis)。因为工作上用到的并不是spring框架,所以对spring并不是很熟悉,最近整理了一下以前的笔记,稍微再熟悉熟悉spring框架。
此次建立实例用到的是IntelliJ IDEA,应用maven来构建springmvc+mybatis+postgresql的web项目。打算创建一个基本的demo可以重复使用。
IDEA下建立maven的web项目
1、新建工程选择maven并配置相关信息。
2、此处可以随意填写。
3、选择下载好的maven。
4、设置项目名称。
5、点击finfish,maven的web项目就构建完成了,第一次构建可能要点时间,因为要现在相关内容(本人的速度还是挺快的,也可能是因为运气好吧),不过如果真的很慢那么请自行使用科学上网,或者参考网上的配置maven使用国内镜像下载。
搭建基于springmvc整合mybatis的web项目
1、再maven下载的资源结束后,就可以开始配置springmvc等相关的内容了。一般会默认的出现src文件夹,在文件加下会有main文件夹,main文件夹中会有webapp文件夹、resources文件夹,如果未出现自行建立也可以。
我们要在main中建立java文件夹用来存放java文件,在webapp文件加中建立css、js等文件用来放相关的资源文件。构建好的目录如下:
2、配置pom.xml,maven创建的项目要配置pom文件用来下载响应的jar包。
maven中央库在这里查找相关的maven地址。(代码很长这里就不放出来了,项目放在了github上,有需要的可以自取)
3、配置web.xml,文件中包括启动页,异常页,字符过滤等配置。部分代码如下:
<!--欢迎页-->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!--当系统出现404错误,跳转到页面404.html-->
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/404.html</location>
</error-page>
<!--当系统出现异常,跳转到页面error.html-->
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/WEB-INF/error.html</location>
</error-page>
<!--会话超时配置,单位分钟-->
<session-config>
<session-timeout>360</session-timeout>
</session-config>
Spring框架给我们提供过滤器CharacterEncodingFilter 用来处理字符
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
关联applicationContext.xml
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
关联dispatcher-servlet.xml
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
如果你的DispatcherServlet拦截”/”,为了实现REST风格,拦截了所有的请求,那么同时对.js,.jpg等静态文件的访问也就被拦截了。为了不被拦截,配置如下代码:
<!--要写在DispatcherServlet的前面,让defaultServlet先拦截请求,这样请求就不会进入Spring了-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.swf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</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>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.json</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.map</url-pattern>
</servlet-mapping>
4、配置好web.xml后就要开始配置applicationContext.xml和dispatcher-servlet.xml。
applicationContext.xml 部分代码如下:
<!-- 自动扫描SpringMVC包 ,将带有注解的类 纳入spring容器管理 -->
<context:component-scan base-package="com.gcy"/>
<!-- 引入jdbc配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:jdbc.properties</value>
</list>
</property>
</bean>
<!-- dataSource 配置 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<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="${ds.initialSize}"/>
<property name="minIdle" value="${ds.minIdle}"/>
<property name="maxActive" value="${ds.maxActive}"/>
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${ds.maxWait}"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${ds.timeBetweenEvictionRunsMillis}"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${ds.minEvictableIdleTimeMillis}"/>
<property name="validationQuery" value="SELECT 'x'"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<!--<property name="poolPreparedStatements" value="false"/>-->
<!--<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>-->
<!-- 配置监控统计拦截的filters -->
<property name="filters" value="stat"/>
</bean>
其中jdbc.properties需单独配置,内容如下:
#JDBC Global Setting
#数据库Driver
jdbc.driver = org.postgresql.Driver
#数据库连接地址
jdbc.url = jdbc:postgresql://127.0.0.1:5432/saaswechat
#用户名密码
jdbc.username = postgres
jdbc.password = 123456
##DataSource Global Setting
#配置初始化大小、最小、最大
ds.initialSize=1
ds.minIdle=1
ds.maxActive=20
#配置获取连接等待超时的时间
ds.maxWait=60000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
ds.timeBetweenEvictionRunsMillis=60000
#配置一个连接在池中最小生存的时间,单位是毫秒
ds.minEvictableIdleTimeMillis=300000
mybatis 相关配置
<!-- mybatis文件配置,扫描所有mapper.xml文件 -->
<!-- 配置mybatisSqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis.xml"/>
<property name="mapperLocations" value="classpath*:com/gcy/dao/xml/*Mapper.xml"/>
</bean>
<!-- 配置SqlSessionTemplate -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<!-- 配置mybatis mapper接口,扫描所有dao -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.gcy.dao"/>
<property name="sqlSessionTemplateBeanName" value="sqlSessionTemplate"/>
</bean>
dispatcher-servlet.xml 配置如下:
<!--此文件负责整个mvc中的配置-->
<!--注解配置 启用spring的一些annotation -->
<context:annotation-config/>
<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
<context:component-scan base-package="com.gcy.controller">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--扫描service-->
<context:component-scan base-package="com.gcy.service"/>
<!--静态资源映射-->
<!--本项目把静态资源放在了webapp的statics目录下,资源映射如下-->
<mvc:resources mapping="/css/**" location="/WEB-INF/css/"/>
<mvc:resources mapping="/js/**" location="/WEB-INF/js/"/>
<!-- 配置注解驱动 可以将request参数与绑定到controller参数上 -->
<mvc:annotation-driven/>
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP-->
<!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
<bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/"/><!--设置JSP文件的目录位置-->
<property name="suffix" value=".jsp"/>
<property name="exposeContextBeansAsAttributes" value="true"/>
</bean>