SSM框架整合以及demo实现
最近自己刚学完ssm,今天就框架之间的关系进行一个整合,这也是目前市面上发展的趋势,ssm将会慢慢取代ssh,占领主导地位
服务端业务实现的主要逻辑
图片说明:
在客户端发送请求到来时,服务器会通过控制器controller来调用service层的方法,service层中会通过dao层的数据关系映射去数据库中查找相关信息,然后将数据进行封装成SysLog对象,返回给control层;在control层中进一步对对象信息进行封装,然后通过spring转换成Json格式数据返回给客户端。客户端接受到请求之后会进行解析,将数据呈献给客户,一次请求就完成。
下面是相关代码的实现
需要添加的依赖
配置文件:spring-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.3.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd" >
<!-- 自动扫描该包 -->
<context:component-scan base-package="com.jt" />
<!-- 启用mvc注解 -->
<mvc:annotation-driven />
<!-- 定义跳转的文件的前后缀 ,视图模式配置 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".html"></property>
</bean>
<!-- 整合DRUID -->
<util:properties id="cfg" location="classpath:config.properties"/>
<!--配置DruidDataSource连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close" init-method="init" lazy-init="true">
<property name="driverClassName" value="#{cfg.driver}" />
<property name="url" value="#{cfg.url}" />
<property name="username" value="#{cfg.username}" />
<property name="password" value="#{cfg.password}" />
</bean>
<!-- 整合mybatis -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-configs.xml"></property>
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" >
<list><value>classpath:mapper/*.xml</value></list>
</property>
</bean>
<!-- 扫描DAO接口所在包,Spring会自动查找其下的dao
接口,然后为接口创建代理对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage"
value="com.jt.**.dao"/>
</bean>
</beans>
web.xml文件中对DispatcherServlet的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>CGB-JT-SYS-V1.01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>frontController</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 定义初始化参数 -->
<init-param>
<!-- 这个参数时DispatcherServlet父类中的一个属性 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config.xml</param-value>
</init-param>
<!-- 通过配置load-on-startup元素,定义servlet在web服务器中的启动顺序,数字越小,优先级越高 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>frontController</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
日志信息的封装
package com.jt.sys.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serializable;
import java.util.Date;public class SysLog implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
//用户名
private String username;
//用户操作
private String operation;
//请求方法
private String method;
//请求参数
private String params;
//执行时长(毫秒)
private Long time;
//IP地址
private String ip;
//创建时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createdTime;/**
* 设置:
*/
public void setId(Integer id) {
this.id = id;
}
/**
* 获取:
*/
public Integer getId() {
return id;
}
/**
* 设置:用户名
*/
public void setUsername(String username) {
this.username = username;
}
/**
* 获取:用户名
*/
public String getUsername() {
return username;
}
/**
* 设置:用户操作
*/
public void setOperation(String operation) {
this.operation = operation;
}
/**
* 获取:用户操作
*/
public String getOperation() {
return operation;
}
/**
* 设置:请求方法
*/
public void setMethod(String method) {
this.method = method;
}
/**
* 获取:请求方法
*/
public String getMethod() {
return method;
}
/**
* 设置:请求参数
*/
public void setParams(String params) {
this.params = params;
}
/**
* 获取:请求参数
*/
public String getParams() {
return params;
}
/**
* 设置:IP地址
*/
public void setIp(String ip) {
this.ip = ip;
}
/**
* 获取:IP地址
*/
public String getIp() {
return ip;
}
/**
* 设置:创建时间
*/
public void setCreateDate(Date createdTime) {
this.createdTime = createdTime;
}
/**
* 获取:创建时间
*/
public Date getCreatedTime() {
return createdTime;
}public Long getTime() {
return time;
}public void setTime(Long time) {
this.time = time;
}
}
controller类的实现
package com.jt.sys.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import com.jt.common.vo.JsonResult;
import com.jt.common.vo.PageObject;
import com.jt.sys.entity.SysLog;
import com.jt.sys.service.SysLogService;@RequestMapping("/log/")
@Controller
public class SysLogController {
@Autowired
private SysLogService sysLogService;@RequestMapping("doFindPageObjects")
@ResponseBody
public JsonResult doFindPageObjects(String name, Integer pageCurrent) {
PageObject<SysLog> pageObject = sysLogService.findPageObjects(name, pageCurrent);
return new JsonResult(pageObject);
}
}
两个公共类的实现
JsonResult--用来封装返回给客户端的信息
package com.jt.common.vo;
import java.io.Serializable;
public class JsonResult implements Serializable {
private static final long serialVersionUID = -856924038217431339L;//SysResult/Result/R
/**状态码*/
private int state=1;//1表示SUCCESS,0表示ERROR
/**状态信息*/
private String message="ok";
/**正确数据*/
private Object data;
public JsonResult() {}
public JsonResult(String message){
this.message=message;
}
/**一般查询时调用,封装查询结果*/
public JsonResult(Object data) {
this.data=data;
}
/**出现异常时时调用*/
public JsonResult(Throwable t){
this.state=0;
this.message=t.getMessage();
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
PageObject封装分页查询的相关信息
package com.jt.common.vo;
import java.io.Serializable;
import java.util.List;public class PageObject<T> implements Serializable{
private static final long serialVersionUID = 1L;
/**当前页的页码值*/
private int pageCurrent=1;
/**每一页显示的记录条数*/
private int pageSize=3;
/**数据库中记录性行数*(通过查询获得)*/
private int rowCount=0;
/**总页数(通过计算获得)*/
private int pageCount=0;
/**当前页记录*/
private List<T> records;public int getPageCurrent() {
return pageCurrent;
}public void setPageCurrent(int pageCurrent) {
this.pageCurrent = pageCurrent;
}public int getPageSize() {
return pageSize;
}public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}public int getRowCount() {
return rowCount;
}public void setRowCount(int rowCount) {
this.rowCount = rowCount;
}public int getPageCount() {
return pageCount;
}public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}public List<T> getRecords() {
return records;
}public void setRecords(List<T> records) {
this.records = records;
}
}
GlobalExceptionHandler----定义全局异常的处理类,避免用户直接看到后台的不友好界面
package com.jt.common.web;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;import com.jt.common.vo.JsonResult;
@ControllerAdvice
public class GlobalExceptionHandler {
// JDK中的自带的日志API
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public JsonResult doHandleRuntimeException(RuntimeException e) {
e.printStackTrace();// 也可以写日志
return new JsonResult(e);// 封装异常信息
}}
Dao层接口的实现
package com.jt.sys.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.jt.sys.entity.SysLog;
/**
* 这个类用来实现日志查询的接口
* @author RYH
*
*/
public interface SysLogDao {
/**
* 基于给定的条件分页查询日志信息
* @param username
* @param startIndex
* @param pageSize
* @return
*/
public List<SysLog> findPageObjects(
@Param("username")String username,
@Param("startIndex")Integer startIndex,
@Param("pageSize")Integer pageSize);
/**
* 根据用名查询其总记录数
* @param name
* @return
*/
public int getRowCount(@Param("username")String username);
}
Servce接口的
package com.jt.sys.service;
import org.springframework.stereotype.Service;
import com.jt.common.vo.PageObject;
import com.jt.sys.entity.SysLog;public interface SysLogService {
/**
* 通过此方法实现分页查询操作
* @param name
* @param PageCurrent
* @return
*/
public PageObject<SysLog> findPageObjects(
String name,
Integer pageCurrent);
}
ServiceException---自定义的异常类,便于快速定位代码中的异常信息
package com.jt.sys.service.exception;
/***
* 为什么使用自定义异常?
* 更加精确定位具体异常信息
*/public class ServiceException extends RuntimeException {
private static final long serialVersionUID = -1169100027771948958L;
public ServiceException() {
super();
// TODO Auto-generated constructor stub
}public ServiceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
// TODO Auto-generated constructor stub
}public ServiceException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}public ServiceException(String message) {
super(message);
// TODO Auto-generated constructor stub
}public ServiceException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
}
SysLogServiceImpl---service接口的实现类
package com.jt.sys.service.impl;
import java.rmi.ServerException;
import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.jt.common.vo.PageObject;
import com.jt.sys.dao.SysLogDao;
import com.jt.sys.entity.SysLog;
import com.jt.sys.service.SysLogService;
import com.jt.sys.service.exception.ServiceException;@Service("SysLogService")
public class SysLogServiceImpl implements SysLogService {@Autowired
private SysLogDao sysLogDao;
@Override
public PageObject<SysLog> findPageObjects(String name, Integer pageCurrent) {
//验证参数合法性
if(pageCurrent==null||pageCurrent<1){
throw new IllegalArgumentException("当前页码不正确");
}
//基于条件查询总记录数
int rowCount=sysLogDao.getRowCount(name);
if(rowCount==0){
throw new ServiceException("系统没有找到相应的记录");
}
//基于条件查询当前页记录
int pageSize=2;
int startIndex=(pageCurrent-1)*pageSize;
List<SysLog> records=sysLogDao.findPageObjects(name, startIndex, pageSize);
//对分页信息以及当前页记录进行封装
PageObject< SysLog> pageObject=new PageObject<>();
pageObject.setPageCurrent(pageCurrent);
pageObject.setPageSize(pageSize);
pageObject.setRowCount(rowCount);
pageObject.setRecords(records);
pageObject.setPageCount((rowCount-1)*pageSize+1);
return pageObject;
}}
SysLogMapper.xml-----------------mybatis中用来书写sql语句的与dao层对应的接口映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jt.sys.dao.SysLogDao">
<select id="findPageObjects" resultType="com.jt.sys.entity.SysLog">
select * from sys_logs
<include refid="queryWhereId"/>
order by createdTime desc
limit #{startIndex},#{pageSize}
</select>
<select id="getRowCount" resultType="int">
select count(*) from sys_logs
<include refid="queryWhereId"/>
</select>
<!-- 定义共性元素,并判断是否为空值 -->
<sql id="queryWhereId">
<where>
<if test="username!=null and username!=''">
username like concat('%',#{username},'%')
</if>
</where>
</sql>
</mapper>
还需要给定一个properties文件用来给定druid中所需的数据库的配置信息
jdbcDriver=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql:///jtsys
jdbcUser=root
jdbcPassword=123456
项目发布,访问即可看到书记库中的相关信息,结果是以Json格式字符串显示在页面。至此,后端的功能已经实现,剩下的具有前端进行Json的解析就可以