SpringMVC开发环境基本配置
文章主要是写着自己用的,主要特点是配置文件比较完全,框架搭的比较好,适合有一定基础的人参考。
1,开发环境使用的开发环境以及基本技术:
开发环境:IntelliJ IDEA 13.1.2+Tomcat8.0+mysql
使用的基本技术:Maven+freemarker+Spring3.0(SpringMVC)+ mybatis+JRebel+Jquery+kendoUI
前台使用的是freemarker页面显示,控件用的是KendoUI,SpringMVC控制页面的显示和先关的业务请求,SpringMVC和MyBatis一起来操作数据库。
2,整个项目的模块分类
整个项目的结构大体如下(其中标红框框的部分是重点需要关注的):
2.1,首先是Maven的配置(pom.xml)(Maven的安装可以按照基础教程安装就行了)
pom.xml可以将术需要用到的jdk之外的jar包都定义在这里面,当程序挪动到其他的机器,只需要安装了jdk,在首次打开这个工程的时候Maven工程都会去网上下载这个需要的jar包,这样便于工程的移动。并且在pom.xml中的jar包都有版本号,这就是说我们的Maven工程可以使用各自不同的jar包。下面是我的pom.xml的配置:其中配置好了springmvc,mybatis,mysql,freemarker,json,servlet.
<projectxmlns="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.0http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>PMCS</groupId>
<artifactId>PMCSSetting</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>../kendoUITest</module>
</modules>
<name>PMCSSetting Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<org.springframework-version>3.1.3.RELEASE</org.springframework-version>
<jackson.version>2.2.3</jackson.version>
</properties>
<dependencies>
<!-- Json Parser -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- servlet jsp and jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.5</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.14</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20090211</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>PMCSSetting</finalName>
</build>
</project>
2.2,web.xml基本配置
web.xml是网站的基本配置。其中DispatcherServlet提供了Spring WebMVC的集中访问点。
servlet-mapping指定哪些类型的请求交给SpringWeb MVC来处理。contextConfigLocation指定Spring Web MVC的基本配置。
下面是web.xml配置:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD WebApplication 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Archetype Created WebApplication</display-name>
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/spring-context.xml</param-value>
</init-param>
<init-param>
<param-name>ContentType</param-name>
<param-value>text/html; charset=UTF-8</param-value>
</init-param>
<init-param>
<param-name>default_encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.3,Spring Web MVC基本配置
spring-context.xml是springmvc的基本配置
首先说下src文件夹下每个文件的作用:pojo下面是一些实体类;web下面是控制实际的请求和页面实体或者数据的对用关系;map用于mybatis的数据库操作;inter用于每个请求用户的登录控制(检查是否已经登录);util里面放的是一些常用的或者常规的方法:SessionUtil中放的是登录session,JsonUtil中国放的是Json串拼接的基本方法,SpringContextUtil:实现了ApplicationContextAware,可以很方便的获取Bean(不用每次都去读取文件)。
接下来是spring-context.xml的配置说明:
component-scan是方式用来扫描该包以及其子包下的@Controller注解的类,纳入spring管理,而同时spring容器也需要使用这种方式扫描包含@Service、@Components、@Required、@Autowired等注解用来管理bean和完成DI(Scansthe classpath of this application for @Components to deploy as beans)
annotation-driven用来确认相关的控制器(Configuresthe @Controller programming mode)
<mvc:resourcesmapping="res/css/**" location="/res/css/"/>:用来将先关的文件包含进网站(样式文件,kendoui,jquery文件)
viewResolver:请求的view页面以fremarker来解析。
freemarkerConfig:freemarker的基本配置
dataSource:mysql的基本配置。
sqlSessionFactory:mybatis的数据库配置。
<beanclass="org.mybatis.spring.mapper.MapperFactoryBean"id="userMapper">:mybatis查询处的数据和实体类之间的对应关系
<beanclass="pmcssetting.util.SpringContextUtil"scope="singleton" id="springContextUtil"/>:实现了ApplicationContextAware,可以很方便的获取Bean。
下面是spring-context.xml完整配置:
<?xml version="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-- Scans the classpath of this application for @Components todeploy as beans -->
<context:component-scan base-package="pmcssetting.web"/>
<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />
<mvc:resources mapping="res/css/**" location="/res/css/"/>
<mvc:resources mapping="res/js/**"location="/res/js/"/>
<bean id="viewResolver"class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="false"/>
<property name="prefix" value=""/>
<property name="suffix" value=".ftl"/>
<property name="exposeRequestAttributes"value="true"/>
<property name="requestContextAttribute"value="request"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<property name="exposeSessionAttributes"value="true"/>
<property name="contentType"value="text/html;charset=UTF-8"></property>
</bean>
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath">
<value>/WEB-INF/ftl/</value>
</property>
<property name="freemarkerSettings"><!-- 设置FreeMarker环境属性 -->
<props>
<propkey="template_update_delay">5</prop><!--刷新模板的周期,单位为秒-->
<propkey="default_encoding">UTF-8</prop><!--模板的编码格式-->
<propkey="locale">UTF-8</prop><!-- 本地化设置 -->
<prop key="datetime_format">yyyy-MM-ddHH:mm:ss</prop>
<propkey="time_format">HH:mm:ss</prop>
<propkey="number_format">0.####</prop>
<propkey="boolean_format">true,false</prop>
<prop key="whitespace_stripping">true</prop>
<propkey="tag_syntax">auto_detect</prop>
<propkey="url_escaping_charset">UTF-8</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"value="com.mysql.jdbc.Driver"></property>
<property name="url"value="jdbc:mysql://192.168.1.207:3306/pqss0331?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull"></property>
<property name="username"value="root"></property>
<property name="password"value="123456"></property>
<property name="maxActive"value="100"></property>
<property name="maxIdle"value="30"></property>
<property name="maxWait"value="500"></property>
<property name="defaultAutoCommit"value="true"></property>
</bean>
<bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean"id="userMapper">
<property name="mapperInterface"value="pmcssetting.map.UserMapper"/>
<property name="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean"id="WD_OperatorMapper">
<property name="mapperInterface"value="pmcssetting.map.WD_OperatorMapper"/>
<property name="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean"id="WD_RightMapper">
<property name="mapperInterface"value="pmcssetting.map.WD_RightMapper"/>
<property name="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean"id="WD_RoleMapper">
<property name="mapperInterface"value="pmcssetting.map.WD_RoleMapper"/>
<property name="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean"id="WD_ManufactureMapper">
<property name="mapperInterface"value="pmcssetting.map.WD_ManufactureMapper"/>
<property name="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean"id="WD_LineMapper">
<property name="mapperInterface"value="pmcssetting.map.WD_LineMapper"/>
<property name="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean"id="WD_MeterMapper">
<property name="mapperInterface"value="pmcssetting.map.WD_MeterMapper"/>
<property name="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean"id="WD_StationMapper">
<property name="mapperInterface"value="pmcssetting.map.WD_StationMapper"/>
<property name="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean"id="WD_SubstationMapper">
<property name="mapperInterface"value="pmcssetting.map.WD_SubstationMapper"/>
<property name="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean"id="WD_MeterTypeMapper">
<property name="mapperInterface"value="pmcssetting.map.WD_MeterTypeMapper"/>
<property name="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean"id="WD_MeasureTypeMapper">
<property name="mapperInterface"value="pmcssetting.map.WD_MeasureTypeMapper"/>
<property name="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean"id="WD_DepartmentMapper">
<property name="mapperInterface"value="pmcssetting.map.WD_DepartmentMapper"/>
<property name="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperFactoryBean"id="WD_CircuitMapper">
<property name="mapperInterface"value="pmcssetting.map.WD_CircuitMapper"/>
<property name="sqlSessionFactory"ref="sqlSessionFactory"/>
</bean>
<bean class="pmcssetting.util.SpringContextUtil"scope="singleton" id="springContextUtil"/>
</beans>
3,具体实现过程的详细讲解。
下面以页面请求数据显示kendoGrid为例讲解下:
http://localhost:8080/Purview/RoleInfos,这个方法请求到的是后台的WD_RoleController的
@RequestMapping(value = "", method = {RequestMethod.GET})
public ModelAndView index(ModelAndView mv) {
mv.setViewName("Purview/RoleInfos");
return mv;
}
这个方法
kendo ui 的DataSource 的read读取到的数据是:
@RequestMapping(value = "/read",method = RequestMethod.GET, produces ="application/json;charset=UTF-8")
@ResponseBody
public String read(HttpServletRequest request) {
//SELECT numRoleID,varName fromWD_Role
String prefix = request.getParameter("callback");
WD_RoleMapper wd_roleMapper =(WD_RoleMapper)SpringContextUtil.getBean("WD_RoleMapper");
String string="";
for (WD_Role right : wd_roleMapper.getAllRoles()) {
string+="{\"numRoleID\":\""+right.getNumRoleID()+"\",\"varName\":\""+right.getVarName()+"\"},";
}
return JsonUtil.getJSONP(prefix, string);
}
这里是把数据拼接为jsonp格式让kendoGrid来处理。
下面附上完整得ftl代码和类的代码:
前台ftl代码:
<!DOCTYPE html>
<html>
<head>
<title>角色管理</title>
<#include"../inc/reffer.ftl">
</head>
<body>
<div id="content">
<h3>角色管理</h3>
<div id="grid"></div>
</div>
</body>
</html>
<script>
$(document).ready(function () {
var url = "/Purview/RoleInfos";
var ds = new kendo.data.DataSource({
transport: {
read: {
url: url +"/read",
dataType: "jsonp"
},
create: {
url: url +"/create",
dataType: "jsonp"
},
update: {
url: url +"/update",
dataType: "jsonp"
},
destroy: {
url: url +"/delete",
dataType: "jsonp"
},
parameterMap: function(options, operation) {
if (operation !=="read" && options.models) {
return {models:kendo.stringify(options.models)};
}
}
},
batch: true,
pageSize: 23,
schema: {
model: {
id: "numRoleID",
fields: {
numRoleID: { editable:false, nullable: true },
varName: { editable:true, nullable: true }
}
}
}
});
//SELECT numRoleID,varName fromWD_Role
$("#grid").kendoGrid({
dataSource: ds,
pageable: true,
toolbar: ["create"],
columns: [
{ field:"numRoleID", title: "numRoleID", width: "30px" },
{ field: "varName",title: "varName", width: "30px" },
{ command: ["edit","destroy"], title: "功能区", width:"30px"}
],
editable: "popup"
});
});
</script>
后台类的代码:
package pmcssetting.web;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importorg.springframework.web.bind.annotation.ResponseBody;
importorg.springframework.web.servlet.ModelAndView;
import pmcssetting.map.WD_OperatorMapper;
import pmcssetting.map.WD_RoleMapper;
import pmcssetting.pojo.WD_Operator;
import pmcssetting.pojo.WD_Role;
import pmcssetting.util.JsonUtil;
import pmcssetting.util.SessionUtil;
import pmcssetting.util.SpringContextUtil;
importjavax.servlet.http.HttpServletRequest;
/**
*Created by luozl on 2014/7/3.
*/
@Controller
@RequestMapping(value ="/Purview/RoleInfos")
public class WD_RoleController {
@RequestMapping(value = "", method = {RequestMethod.GET})
public ModelAndView index(ModelAndView mv) {
mv.setViewName("Purview/RoleInfos");
return mv;
}
@RequestMapping(value = "/read", method = RequestMethod.GET,produces = "application/json;charset=UTF-8")
@ResponseBody
public String read(HttpServletRequest request) {
//SELECT numRoleID,varName fromWD_Role
String prefix = request.getParameter("callback");
WD_RoleMapper wd_roleMapper =(WD_RoleMapper)SpringContextUtil.getBean("WD_RoleMapper");
String string="";
for (WD_Role right : wd_roleMapper.getAllRoles()) {
string+="{\"numRoleID\":\""+right.getNumRoleID()+"\",\"varName\":\""+right.getVarName()+"\"},";
}
return JsonUtil.getJSONP(prefix, string);
}
}