基本步骤
1.创建maven web项目,名字为CGB-JT-SYS-V1.01
2.生成部署描述文件 web.xml(tomcat启动时读取)
3.修改项目编码为utf-8
4.设置项目targeted runtimes (Tomcat):提供javaee标准支持,例如servlet
5.修改项目编译版本project facets (jdk1.8)
步骤实现:
1.创建maven web项目,名字为CGB-JT-SYS-V1.01
2.生成部署描述文件 web.xml
3.修改项目编码为utf-8
4.设置项目targeted runtimes (Tomcat)
5.修改项目project facets (jdk1.8)
资源整合实现:
第一步:整合Spring MVC 应用组件
1.添加依赖(spring-webmvc)
2.添加配置文件(spring-configs.xml)
配置bean扫描,启用mvc默认配置,配置视图解析器。
3.配置前端控制器(DispatcherServlet)
4.启动环境进行测试(启动tomcat测试)。
第二步:整合Druid连接池对象
1.添加依赖(mysql,druid)
2.添加configs.properties文件,并定义key/value
3.配置druid对象(spring-configs.xml)
第三步:整合mybatis框架(用户实现持久层的数据操作)
1.添加依赖(mybatis,mybatis-spring,spring-jdbc)
2.配置mybatis(spring-configs.xml)
说明:配置完成以后部署项目,启动tomcat测试是否有问题.
Entity类实现
package com.jt.sys.entity;
import java.io.Serializable;
import java.util.Date;
/***
* 日志POJO对象:主要用于实现与jtsys数据库
* 中sys_logs表之间数据的映射.
* SysLog对象用户封装用户在系统中的操作日志
*/
public class SysLog implements Serializable {
private static final long serialVersionUID = 1L;
/**日志id*/
private Integer id;
/**用户名*/
private String username;
/**用户操作*/
private String operation;
/**请求方法*/
private String method;
/**请求参数*/
private String params;
/**执行时长(毫秒)*/
private Long time;
/**IP地址*/
private String ip;
/**创建时间*/
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;
}
}
说明:
通过此对象除了可以封装从数据库查询的数据,还可以封装客户端请求数据,实现层与层之间数据的传递。
Dao接口实现
业务描述:(核心-查询当前页显示的数据以及总记录数)
1)接收业务层参数数据
2)基于参数进行数据查询
3)将查询结果进行封装
4)将结果返回给业务层对象
代码实现:创建接口并定义相关方法。
1)Dao接口定义
a)包名: com.jt.sys.dao
b)名字: SysLogDao
2)方法定义:负责基于条件查询当前页数据
a)方法名:findPageObjects
b)参数列表:(String username,Integer startIndex,Integer pageSize)
c)返回值:List
3)方法定义:负责基于条件查询总记录数
a)方法名:getRowCount
b)参数列表:(String username)
c)返回值:int
代码实现:
package com.jt.sys.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.jt.sys.entity.SysLog;
/**
* 用户日志操作的数据层接口
*/
public interface SysLogDao {
/**
* 依据条件查询当前页数据
* @param username 查询条件(按用户名查询)
* @param startIndex 当前页的起始位置
* @param pageSize 当前模块的页面大小(每页最多显示多少条记录)
* @return
*/
List findPageObjects(
@Param("username") String username,
@Param("startIndex") Integer startIndex,
@Param("pageSize") Integer pageSize);
/**
* 按照查询条件统计用户操作日志数
* @param username (用户名)
* @return 查询到的记录数,按照这个值以及pageSize
* 计算总页数
*/
int getRowCount(@Param("username")String username);
}
说明:
1)当DAO中方法参数多余一个时尽量使用@Param注解进行修饰并指定名字,然后再Mapper文件中便可以通过类似#{username}方式进行获取,否则只能通过#{0},#{1}或者#{param1},#{param2}等方式进行获取。
2)当DAO方法中的参数应用在动态SQL中时无论多少个参数,尽量使用@Param注解进行修饰并定义。
Mapper文件实现
业务描述
1)基于Dao接口创建映射文件
2)基于Dao方法在映射文件中创建映射元素建映射元素
业务实现
代码实现:
javascript
// An highlighted block
username like concat("%",#{username},"%")
Service接口及实现类
业务描述:核心业务就是分页查询数据并对数据进行封装。
1)通过参数变量接收控制层数据(例如username,pageCurrent)
2)对数据进行合法验证(例如pageCurrent不能小于1)
3)基于参数数据进行总记录数查询(通过此结果要计算总页数)
4)基于参数数据进行当前页记录的查询(username,startIndex,pageSize)
5)对数据进行封装(例如封装分页信息和当前页记录)
业务实现
1)业务值对象定义:(封装分页信息以及当前数据)
a)包名 com.jt.common.vo (封装值的对象)
b)类名 PageObject (实现序列化接口并添加序列化id)
c)属性 (总行数,总页数,当前页码,页面大小,当前页记录信息)
d)方法 (set/get)
代码实现:
package com.jt.common.vo;
import java.io.Serializable;
import java.util.List;
/**
* VO:value object --值对象
* 借助此对象封装业务层数据
* 1.当前页要呈现的记录
* 2.分页信息
* @param 类上定义的泛型参数
*/
public class PageObject implements Serializable {
private static final long serialVersionUID = 6780580291247550747L;//类泛型
/**当前页的页码值*/
private Integer pageCurrent=1;
/**页面大小*/
private Integer pageSize=3;
/**总行数(通过查询获得)*/
private Integer rowCount=0;
/**总页数(通过计算获得)*/
private Integer pageCount=0;
/**当前页记录*/
private List records;
public Integer getPageCurrent() {
return pageCurrent;
}
public void setPageCurrent(Integer pageCurrent) {
this.pageCurrent = pageCurrent;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getRowCount() {
return rowCount;
}
public void setRowCount(Integer rowCount) {
this.rowCount = rowCount;
}
public Integer getPageCount() {
return pageCount;
}
public void setPageCount(Integer pageCount) {
this.pageCount = pageCount;
}
public List getRecords() {
return records;
}
public void setRecords(List records) {
this.records = records;
}
}
接口定义:为控制层请求提供服务
a)包名 com.jt.sys.service
b)类名 SysLogService
接口方法定义:
a)方法名 findPageObjects
b)参数列表 (String username,Integer pageCurrent)
c)返回值 PageObject
关键代码实现:
package com.jt.sys.service;
import com.jt.common.vo.PageObject;
import com.jt.sys.entity.SysLog;
/**
* 日志模块业务层接口
* @author Administrator
*/
public interface SysLogService {
/**
* 按照条件分页查询用户日志数据
* @param username 查询条件(按用户名查询操作日志)
* @param pageCurrent 当前页的页码值
* @return 当前页记录有以及分页信息
*/
PageObject findPageObjects(
String username,
Integer pageCurrent);
}
接口实现类的定义:
a)包名 com.jt.sys.service.impl
b)类名 SysLogServiceImpl
代码实现
package com.jt.sys.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.jt.common.exception.ServiceException;
import com.jt.common.vo.PageObject;
import com.jt.sys.dao.SysLogDao;
import com.jt.sys.entity.SysLog;
import com.jt.sys.service.SysLogService;
@Service
public class SysLogServiceImpl implements SysLogService {
@Autowired//自动装配
private SysLogDao sysLogDao;
@Override
public PageObject findPageObjects(String username, Integer pageCurrent) {
//验证参数合法性校验
if(pageCurrent==null||pageCurrent<1)
throw new IllegalArgumentException("页码值无效");
//按照条件查询总记录数并进行校验
int rowCount=sysLogDao.getRowCount(username);
if(rowCount==0)
throw new ServiceException("没有对应记录");
//按照条件查询当前页记录
int pageSize=3;
int startIndex=(pageCurrent-1)*pageSize;
List records = sysLogDao.findPageObjects(username, startIndex, pageSize);
//封装查询结果并返回
PageObject pageObject=new PageObject();
pageObject.setRecords(records);
pageObject.setRowCount(rowCount);
pageObject.setPageCount(pageCurrent);
pageObject.setPageSize(pageSize);
//计算总页数:方法一
int pageCount=rowCount/pageSize;
if(rowCount%pageSize!=0){
pageCount++;
}
//方法二
//int pageCount=(rowCount-1)/pageSize+1;
pageObject.setPageCount(pageCount);
return pageObject;
}
package com.jt.common.exception;
/**
* 自定义异常
* @author Administrator
* 更加精确的定位问题
* 更加友好的描述异常
*/
public class ServiceException extends RuntimeException{
private static final long serialVersionUID = 8029523183323748146L;
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
}
}
说明:通过自定义异常可更好的定位错误,确定问题以便提供用户体验。
Controller类的实现
业务实现:
值对象定义:(封装控制层方法的返回结果)
a)包名: com.jt.common.vo
b)类名: JsonResult
c)属性: (状态码,状态信息,正确数据):
d)方法: (set/get,构造方法)
Controller方法定义:(在SysLogController中定义请求处理方法)
a)方法名 doFindPageObjects
b)参数列表 (String name,Integer pageCurrent)
c)返回值 JsonResult
d)映射 doFindPageObjects
统一异常处理类的定义
a)包名 com.jt.common.web
b)类名 GlobalExceptionHandler
c)注解 @ControllerAdvice
异常类中方法定义(处理参数异常的方法)
a)方法名 doHandleRuntimeException
b)参数列表 RuntimeException
c)返回值 JsonResult
d)注解描述(@ResponseBody,@ExceptionHandler)
关键代码实现:
封装控制层值的对象
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;
}
}
Controller方法定义
业务描述:核心业务是处理客户端请求
1)接收客户端请求中的数据
2)基于请求调用业务方法进行请求处理
3)对处理结果进行封装(JsonResult)
4)将结果转换为json格式的字符串(适配不同客户端)
5)将字符串通过服务器输出到客户端。
业务实现:
值对象定义:封装控制层方法的返回结果
a)包名: com.jt.common.vo
b)类名: JsonResult
c)属性: (状态码,状态信息,正确数据)
d)方法: (set/get,构造方法)
Controller方法定义:在SysLogController中定义请求处理方法
a)方法名 doFindPageObjects
b)参数列表 (String name,Integer pageCurrent)
c)返回值 JsonResult
d)映射 doFindPageObjects
统一异常处理类的定义
a)包名 com.jt.common.web
b)类名 GlobalExceptionHandler
c)注解 @ControllerAdvice
异常类中方法定义 : 处理参数异常的方法
a)方法名 doHandleRuntimeException
b)参数列表 RuntimeException
c)返回值 JsonResult
d)注解描述(@ResponseBody,@ExceptionHandler)
关键代码实现:
封装控制层值的对象
package com.jt.common.vo;
import java.io.Serializable;
/**
* VO:通过此对象实现控制层数据的封装操作
* @author Administrator
* 规范
* 控制层返回的所有数据只要不是页面,必须通过此对象进行封装
*/
public class JsonResult implements Serializable {
private static final long serialVersionUID = -856924038217431339L;//SysResult/Result/R
/**状态码:1正确,0错误 */
private int state=1;//1表示SUCCESS,0表示ERROR
/**状态码对应信息*/
private String message="ok";
/**要呈现的正确数据*/
private Object data;//必须为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();
}
/**Get Set方法*/
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;
}
}
Controller方法定义
package com.jt.sys.controller;
import org.apache.ibatis.annotations.Param;
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;
/**
* 用户控制层对象定义
* @author Administrator
* http://localhost/CGB-JT-SYS-V1.01/log/
*/
@Controller
@RequestMapping("/log/")
public class SysLogController {
@Autowired
private SysLogService sysLogService;
/**从业务层获取的数据,又封装到JsonResult
* String username:用来接收参数
*/
@RequestMapping("doFindPageObjects")
@ResponseBody//返回一个JSON串
public JsonResult doFindPageObjects(
String username,
Integer pageCurrent){
PageObject data=sysLogService.findPageObjects(username, pageCurrent);
return new JsonResult(data);
}
}
统一异常类及方法定义
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:交给Spring管理,全局异常处理类
*/
@ControllerAdvice
public class GlobalExceptionHandler {
/**
* @ExceptionHandler 此注解描述的方法表示是一个异常处理方法
* RuntimeException.class 定义异常类型,要<=方法中的异常
* @param e
* @return 封装了异常信息的JsonResult对象
* JDK中的自带的日志API
*/
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public JsonResult doHandlerRuntimeException(RuntimeException e){
//后台异常 也可以写日志
e.printStackTrace();
//用户异常 封装异常信息
return new JsonResult(e);
}
}