Skip to content
yacongliu edited this page Nov 14, 2016 · 1 revision
  1. 搭建SSM环境 1.1. 数据库

1.1.1. 使用navicat创建数据库连接

执行SQL脚本:

1.1.2. Tb_user

查看表结构:

表结构:

1.1. 创建工程

1.1.1. 新建工程

1.1.2. 填写项目的Maven坐标

Maven会自动从192.168.50.22的私服下载所需要的依赖。 1.2. 统一管理依赖的版本

需要将多个项目的依赖的版本号统一管理起来。

如何实现? --- 使用Maven的继承实现。 1.2.1. 导入itcast-parent

1.1. 完整pom

4.0.0 cn.itcast.parent itcast-parent 0.0.1-SNAPSHOT pom <junit.version>4.10</junit.version> <spring.version>4.1.3.RELEASE</spring.version> <mybatis.version>3.2.8</mybatis.version> <mybatis.spring.version>1.2.2</mybatis.spring.version> <mybatis.paginator.version>1.2.15</mybatis.paginator.version> <mysql.version>5.1.32</mysql.version> <slf4j.version>1.6.4</slf4j.version> <jackson.version>2.4.2</jackson.version> <druid.version>1.0.9</druid.version> <httpclient.version>4.3.5</httpclient.version> <jstl.version>1.2</jstl.version> <servlet-api.version>2.5</servlet-api.version> <jsp-api.version>2.0</jsp-api.version> <joda-time.version>2.5</joda-time.version> <commons-lang3.version>3.3.2</commons-lang3.version> <commons-io.version>1.3.2</commons-io.version> junit junit ${junit.version} test org.springframework spring-context ${spring.version} org.springframework spring-beans ${spring.version} org.springframework spring-webmvc ${spring.version} org.springframework spring-jdbc ${spring.version} org.springframework spring-aspects ${spring.version} org.mybatis mybatis ${mybatis.version} org.mybatis mybatis-spring ${mybatis.spring.version} mysql mysql-connector-java ${mysql.version} org.slf4j slf4j-log4j12 ${slf4j.version} com.fasterxml.jackson.core jackson-databind ${jackson.version} com.jolbox bonecp-spring 0.8.0.RELEASE org.apache.httpcomponents httpclient ${httpclient.version} jstl jstl ${jstl.version} javax.servlet servlet-api ${servlet-api.version} provided javax.servlet jsp-api ${jsp-api.version} provided joda-time joda-time ${joda-time.version} org.apache.commons commons-lang3 ${commons-lang3.version} org.apache.commons commons-io ${commons-io.version} ${project.artifactId} org.apache.maven.plugins maven-resources-plugin 2.7 UTF-8 org.apache.maven.plugins maven-compiler-plugin 3.2 1.7 1.7 UTF-8 org.apache.tomcat.maven tomcat7-maven-plugin 2.2 1.1.1. 继承parent

1.1.2. 出现小红叉

解决:

原因:

定义的java编译器插件的jdk版本和默认使用的jdk版本不一致,导致。 上面配置使用的jdk1.7,需要配置成本机安装的jdk版本,如我的本机安装使用的是1.8的,因此这个地方需要需改为1.8!

此处也会相应版本更改为1.8! 1.1. 子工程使用依赖

1.1.1. Parent中的依赖管理

1.1. 导入依赖

4.0.0

cn.itcast.parent itcast-parent 0.0.1-SNAPSHOT

cn.itcast.manage itcast-usermanage 1.0.0-SNAPSHOT war

junit junit test org.springframework spring-webmvc org.springframework spring-jdbc org.springframework spring-aspects org.mybatis mybatis org.mybatis mybatis-spring com.github.pagehelper pagehelper com.github.jsqlparser jsqlparser com.github.abel533 mapper mysql mysql-connector-java org.slf4j slf4j-log4j12 com.fasterxml.jackson.core jackson-databind com.jolbox bonecp-spring jstl jstl javax.servlet servlet-api provided javax.servlet jsp-api provided joda-time joda-time org.apache.commons commons-lang3 org.apache.commons commons-io org.apache.tomcat.maven tomcat7-maven-plugin 80 / 上面配置的Tomcat插件的好处在于,不需要在本机安装tomcat,只需要下载相应的tomcat maven插件进行配置即可,这样会很方便。上面配置的80 意思就是 访问该应用的时候端口为80端口,而下面配置的/ 表示访问该应用的时候 / 即可! 在本机分访问地址即为 http://127.0.0.1:{port}/{path} 这里配置的插件为tomcat7 1.2. 运行tomcat插件

运行出错:

问题:

解决: 需要将itcast-parent安装到本地仓库。

在本地的Maven的repository中就会在相应目录找到发布的maven项目

需要新建WEB-INF文件夹以及在其下创建web.xml(pom文件会提示web.xml缺失)

上图为项目配置结构图,spring文件夹存放spring相关配置文件,mabatis文件夹中存放mybatis配置,其中mappers文件存放mapper.xml 这里使用通用mapper,因此不需要mybatis操作数据库的配置文件,mybatis-config.xml文件用来配置分页助手插件以及通用mapper插件。

Web.xml

ContextLoaderListener 加载应用上下文(bean),负责驱动应用后端的中间层以及数据层组件 DispatcherServlet 也同样加载应用上下文(bean),不过其加载web应用组件,如控制器,试图解析器以及处理器映射。

itcast-usermanage contextConfigLocation classpath:spring/applicationContext*.xml org.springframework.web.context.ContextLoaderListener encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF8 encodingFilter / itcast-usermanage org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring/itcast-usermanage-servlet.xml 1 itcast-usermanage /rest/ index.jsp Jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true jdbc.username=root jdbc.password=root log4j.properties

log4j.rootLogger=DEBUG,A1 log4j.logger.com.taotao = DEBUG log4j.logger.org.mybatis = DEBUG log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n Spring容器配置文件 applicationContext.xml

加载数据库连接配置文件时,这里使用的较为接近底层的方式进行配置(装逼)。 也可以使用下面这种简单的配置方式,效果一样! <context:property-placeholder location="classpath:persistence-mysql.properties" /> 这里定义数据源的时候使用了 bonecpDatasource 其性能比c3p0更为卓越!

<!-- 使用spring自带的占位符替换功能 -->
<bean
	class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<!-- 允许JVM参数覆盖 -->
	<!-- java -Djdbc.url=123 -jar xxx.jar -->
	<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
	<!-- 忽略没有找到的资源文件 -->
	<property name="ignoreResourceNotFound" value="true" />
	<!-- 配置资源文件 -->
	<property name="locations">
		<list>
			<value>classpath:jdbc.properties</value>
		</list>
	</property>
</bean>


<!-- 扫描包 -->
<context:component-scan base-package="cn.itcast"/>
 <!-- 定义数据源 -->
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
	destroy-method="close">
	<!-- 数据库驱动 -->
	<property name="driverClass" value="${jdbc.driverClassName}" />
	<!-- 相应驱动的jdbcUrl -->
	<property name="jdbcUrl" value="${jdbc.url}" />
	<!-- 数据库的用户名 -->
	<property name="username" value="${jdbc.username}" />
	<!-- 数据库的密码 -->
	<property name="password" value="${jdbc.password}" />
	<!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 -->
	<property name="idleConnectionTestPeriod" value="60" />
	<!-- 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 -->
	<property name="idleMaxAge" value="30" />
	<!-- 每个分区最大的连接数 -->
	<!-- 
		判断依据:请求并发数
	 -->
	<property name="maxConnectionsPerPartition" value="100" />
	<!-- 每个分区最小的连接数 -->
	<property name="minConnectionsPerPartition" value="5" />
</bean>
Spring事务 applicationContext-transaction.xml

这里使用切面的原理进行定义切点以及通知,出发事务管理器。

<!-- 定义事务管理器 -->
<bean id="transactionManager"
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource" />
</bean>
<!-- 定义事务策略 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
	<tx:attributes>
		<!--所有以query开头的方法都是只读的 -->
		<tx:method name="query*" read-only="true" />
		<!--其他方法使用默认事务策略 -->
		<tx:method name="*" />
	</tx:attributes>
</tx:advice>
<aop:config>
	<!--pointcut元素定义一个切入点,execution中的第一个星号 用以匹配方法的返回类型,
		这里星号表明匹配所有返回类型。 com.abc.service.*.*(..)表明匹配cn.itcast.mybatis.service包下的所有类的所有方法 -->
	<aop:pointcut id="myPointcut" expression="execution(* cn.itcast.manage.service.*.*(..))" />
	<!--将定义好的事务处理策略应用到上述的切入点 -->
	<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
</aop:config>
SpringMVC配置文件 itcast-usermanage-servlet.xml

itcast-usermanage 名字和web.xml中配置的servletname保持一致!

mvc:annotation-driven/

<!-- 扫描Controller -->
<context:component-scan base-package="cn.itcast.usermanage.controller"/>

<!-- 视图解析器 -->
<!-- 
	Example: prefix="/WEB-INF/views/", suffix=".jsp", viewname="test" -> "/WEB-INF/views/test.jsp" 
 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/WEB-INF/views/"/>
	<property name="suffix" value=".jsp"/>
</bean>
Mybatis和Spring的整合 applicationContext-mybatis.xml
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
	<!-- 数据源 -->
	<property name="dataSource" ref="dataSource"/>
	<!-- 配置Mybatis的全局配置文件 -->
	<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
	<!-- 配置mapper.xml文件 -->
	<!-- <property name="mapperLocations" value="classpath:mybatis/mappers/*.xml"/> -->
	<!-- 别名包 -->
	<property name="typeAliasesPackage" value="cn.itcast.usermanage.pojo"/>
</bean>

<!-- mapper接口的扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="cn.itcast.usermanage.mapper"/>
</bean>
Mybatis的全局配置文件 mybatis-config.xml

配置分页助手插件 以及 通用mapper (两个都是github上针对mybatis提供的方便插件)

根据配置文件及项目结构创建出的项目java目录

测试

创建PageController.java文件并进行配置 package cn.itcast.usermanage.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @RequestMapping("page") @Controller public class PageController {

@RequestMapping(value="{pageName}", method=RequestMethod.GET)
public String toPage(@PathVariable("pageName") String pageName){
    return pageName;
}

} 创建相应页面:

那么访问路径综合tomcat插件以及web.xml中所做的限制: localhost:80/rest/page/users (80可省略),localhost or 127.0.0.1

测试成功后的结果页面:

问题

前几次进行启动应用以后报错,有报tomcat7插件问题的,那就通过cmd命令杀出点以 .lastUpdated结尾的文件,重新update。 还有报出 localhost 拒绝链接的问题,然后同时也报workbeach的问题,貌似是工作空间的问题,当时删除过workspace中的文件更加百度的查询,然后新建了一个ws,最后重新创建了项目以及发布,没有使用本地的Tomcat,而是使用的maven插件,最后success!

pojo User.java problem:这个地方注解使用 @Table ,使用@Entity的时候 进行name设置不起作用,而是去找的mybatis.user表。 对属性进行和表列进行匹配的时候,当使用驼峰法进行标准命名的时候,到数据库中会自动进行添加下划线。userName -> user_name package cn.itcast.usermanage.pojo; import java.util.Date; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; /**

  • @author spring

*/ @Table(name = "tb_user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 用户名 private String userName; // 密码 private String password; // 姓名 private String name; // 年龄 private Integer age; // 性别 1:man 2:woman private Integer sex; // 出生日期 private Date birthday; // 出生日期 private Date created; // 更新日期 private Date updated; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return userName; } public void setUsername(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Integer getSex() { return sex; } public void setSex(Integer sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public Date getCreated() { return created; } public void setCreated(Date created) { this.created = created; } public Date getUpdated() { return updated; } public void setUpdated(Date updated) { this.updated = updated; } @Override public String toString() { return "User [id=" + id + ", username=" + userName + ", password=" + password + ", name=" + name + ", age=" + age + ", sex=" + sex + ", birthday=" + birthday + ", created=" + created + ", updated=" + updated + "]"; } }

Mapper 这里使用通用Mapper,只可以对单表进行CURD,需要多表操作的时候仍然需要进行配置mapper.xml package cn.itcast.usermanage.mapper; import com.github.abel533.mapper.Mapper; import cn.itcast.usermanage.pojo.User; public interface UserMapper extends Mapper {

}

Service 这里为了快速,不再定义成接口,再实现了。 UserService.java @Resource private UserMapper userMapper; 这里直接对接口进行了注入,其实Spring是不能对接口进行注入的! 但是,我们在spring整合mybatis配置文件中配置了mapper接口的扫描器,能够使其mapper对象加载到内存中,供spring能够找到!

package cn.itcast.usermanage.service; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import cn.itcast.usermanage.bean.EasyUIResult; import cn.itcast.usermanage.mapper.UserMapper; import cn.itcast.usermanage.pojo.User; /** *

  • Title: UserService Description:
  • @author yacong_liu Email:2682505646@qq.com
  • @date 2016年11月13日 / @Service public class UserService { @Resource private UserMapper userMapper; /* *
    • Title: queryUserList Description: 查询用户列表

    • @authod yacong_liu

    • @param page

    • @param rows */ public EasyUIResult queryUserList(Integer page, Integer rows) { // 设置分页参数 PageHelper.startPage(page, rows);

      //查询数据 List users = this.userMapper.select(null);

      //获取分页后信息 PageInfo pageInfo = new PageInfo(users); return new EasyUIResult(pageInfo.getTotal(), pageInfo.getList()); } } PageHelper.startPage 后面紧跟着Mapper查询才能够进行分页! 这里我们需要进行json格式的转换,因为easyui 前端页面需要json,这里转成什么格式的数据就是根据前段的需要了! 前段的 easyui 中进行分页json格式:

一个total 数据的总条数,一个 rows数组,因此可以看成是一个对象 -》EasyUIResult对象 创建一个bean EasyUIResult 进行json格式转换

List< > 如果这里使用 ,那么就不能够进行通用! List< > 如果这里使用 (or ,随便) ,那么class 就要变成EasyUIResult ,也不方便 索性,随便你放什么都行 -》 List<?>

Controller UserController.java @ResponseBody 进行对应的格式转换 package cn.itcast.usermanage.controller; import javax.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import static org.springframework.web.bind.annotation.RequestMethod.*; import cn.itcast.usermanage.bean.EasyUIResult; import cn.itcast.usermanage.service.UserService; @Controller @RequestMapping(value="user") public class UserController {

@Resource
private UserService userService;

@RequestMapping(value="list", method=GET)
@ResponseBody
public EasyUIResult queryUserList(@RequestParam("page") Integer page, @RequestParam("rows") Integer rows){
    EasyUIResult userList = this.userService.queryUserList(page, rows);
    
    return userList;
    
}

} users.jsp easyUI的datagrade <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<title>会员管理系统</title> <script type="text/javascript" src="/js/jquery-easyui-1.4/jquery.min.js"></script> <script type="text/javascript" src="/js/jquery-easyui-1.4/jquery.easyui.min.js"></script> <script type="text/javascript" src="/js/jquery-easyui-1.4/locale/easyui-lang-zh_CN.js"></script> <script type="text/javascript" src="/js/common.js"></script>
ID 用户名 姓名 年龄 性别 出生日期 创建日期 更新日期
The window content.
<script type="text/javascript"> function formatDate(val,row){ var now = new Date(val); return now.format("yyyy-MM-dd hh:mm:ss"); } function formatBirthday(val,row){ var now = new Date(val); return now.format("yyyy-MM-dd"); } function formatSet(val,row){ if(val == 1){ return "男"; }else if(val == 2){ return "女"; }else{ return "未知"; } } function getSelectionsIds(){ var userList = $("#userList"); var sels = userList.datagrid("getSelections"); var ids = []; for(var i in sels){ ids.push(sels[i].id); } ids = ids.join(","); return ids; } var toolbar = [{ text:'新增', iconCls:'icon-add', handler:function(){ $('#userAdd').window('open'); } },{ text:'编辑', iconCls:'icon-edit', handler:function(){ $.messager.alert('提示','该功能由学员自己实现!'); } },{ text:'删除', iconCls:'icon-cancel', handler:function(){ var ids = getSelectionsIds(); if(ids.length == 0){ $.messager.alert('提示','未选中用户!'); return ; } $.messager.confirm('确认','确定删除ID为 '+ids+' 的会员吗?',function(r){ if (r){ $.post("/user/delete",{'ids':ids}, function(data){ if(data.status == 200){ $.messager.alert('提示','删除会员成功!',undefined,function(){ $("#userList").datagrid("reload"); }); } }); } }); } },'-',{ text:'导出', iconCls:'icon-remove', handler:function(){ var optins = $("#userList").datagrid("getPager").data("pagination").options; var page = optins.pageNumber; var rows = optins.pageSize; $("").attr({ "action":"/user/export/excel", "method":"POST" }).append("") .append("").submit(); } }]; </script> 结果页面: 访问地址: http://localhost/rest/page/users
Clone this wiki locally