pojo层 层 层 层 层 层@Datapublic class Activity { private Integer id; private String title; private String category; //@DateTimeFormat 作用于set办法示意为属性赋值,基于什么日期格局执行 @DateTimeFormat(pattern = "yyyy/MM/dd HH:mm") //@JsonFormat 用于通知spring mvc 转换json时,将日期依照指定格局进行转换. //@JsonFormat 作用于对象get办法,示意获取值时的一种格局 @JsonFormat(pattern = "yyyy/MM/dd HH:mm",timezone = "GMT+8") private Date startTime; @DateTimeFormat(pattern = "yyyy/MM/dd HH:mm") @JsonFormat(pattern = "yyyy/MM/dd HH:mm",timezone = "GMT+8") private Date endTime; private String remark; private Integer state=1; @JsonFormat(pattern = "yyyy/MM/dd HH:mm",timezone = "GMT+8") private Date createdTime; private String createdUser;}
dao 层 层 层 层 层@Mapperpublic interface ActivityDao { /** * 批改流动信息状态,将其设置为已完结状态0; * @param id * @return */ @Update("update tb_activity set state=0 where id=#{id}") int updateState(Integer id); /** * 增加流动信息 * @param entity * @return */ int insertObject(Activity entity); /** * 获取所有流动信息,一行记录映射为一个Activity对象(row map-行映射) * @return */ @Select("SELECT * FROM tb_activity order by createdTime desc") List<Activity> findActivitys();}
service 层 层 层 层 层package com.cy.pj.activity.service;import java.util.List;import com.cy.pj.activity.pojo.Activity;public interface ActivityService { int saveObject(Activity entity); List<Activity> findActivitys();}
service imp实现层 实现层 实现层 实现层 实现层@Servicepublic class ActivityServiceImpl implements ActivityService { @Autowired private ActivityDao activityDao; @Override public int saveObject(Activity entity) { // TODO Auto-generated method stub //System.out.println("entity.insert.before.id="+entity.getId()); int rows=activityDao.insertObject(entity);//System.out.println("entity.insert.after.id="+entity.getId()); //心愿工夫到了(endTime)主动批改活动状态 //解决方案:基于任务调度去实现(任务调度-基于工夫的设计主动执行工作) //代码计划: //1)借助Java中的Timer对象去实现 Timer timer=new Timer();//此对象创立时会在底层启动一个线程,通过此线程对工夫进行监控 //2)执行工作(工作类型为TimerTask类型) timer.schedule(new TimerTask() { @Override public void run() { //在此地位批改流动的状态信息 System.out.println("开始执行活动状态的批改操作"); activityDao.updateState(entity.getId()); timer.cancel(); } }, entity.getEndTime()); //2)借助Java线程池中的任务调度对象(ScheduledExecutorService )去实现 //3)借助第三方框架去实现(quartz) return rows; } @Override public List<Activity> findActivitys() { //未来要进行缓存设计,记录日志,.... return activityDao.findActivitys(); }}
Controller 层 层 层 层 层@Controller@RequestMapping("/activity/")public class ActivityController { @Autowired private ActivityService activityService; /** * 基于此办法返回activity页面 * @return */ @RequestMapping("doActivityUI") public String doActivityUI() { return "activity"; } @RequestMapping("doSaveObject") @ResponseBody public String doSaveObject(Activity entity) { System.out.println(entity);//如果心愿这样查看对象内容,则须要重写对象的toString办法 activityService.saveObject(entity); //return "activity";//这样返回,刷新的是整个页面 System.out.println("ABCD"); return "save ok"; } @RequestMapping("doFindActivitys") @ResponseBody //通知spring 框架将返回值对象转换为json格局字符串 public List<Activity> doFindActivitys()throws Exception{ // Thread.sleep(5000); List<Activity> list=activityService.findActivitys(); return list; }}
xml 配置文件。。。<mapper namespace="com.cy.pj.activity.dao.ActivityDao"> <!-- 1)useGeneratedKeys="true" 示意应用insert操作主动生成的主键值. 2)keyProperty="id"将自增的主键值赋值给参数对象activity的id属性 --> <insert id="insertObject" parameterType="com.cy.pj.activity.pojo.Activity" useGeneratedKeys="true" keyProperty="id"> insert into tb_activity (title,category,startTime,endTime,remark,state,createdTime,createdUser) values (#{title},#{category},#{startTime},#{endTime},#{remark},1,now(),#{createdUser}) </insert></mapper>
html 文件配置代码<!DOCTYPE html><html><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Insert title here</title><link href="/bootstrap/css/bootstrap.min.css" rel="stylesheet"><link href="/datepicker/css/bootstrap-datetimepicker.min.css" rel="stylesheet"></head><body> <div class="container"> <h1>The Activity Page</h1> <!-- Button trigger modal --> <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">创立新流动</button> <!-- Modal --> <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> <h4 class="modal-title" id="myModalLabel">增加流动</h4> </div> <div class="modal-body"> <form id="saveFormId" action="/activity/doSaveObject" method="post"> <div class="form-group"> <label for="titleId">title</label> <input type="text" class="form-control" name="title" id="titleId" placeholder="please input title"> </div> <div class="form-group"> <label for="cagegoryId">Category</label> <select class="form-control" name="category" id="categoryId"> <option value="training">教育培训</option> <option value="Playing">企业流动</option> </select> </div> <div class="form-group"> <label for="startTimeId">start time</label> <input type="text" class="form-control form_datetime" name="startTime" id="startTimeId" placeholder="please input startTime" autocomplete="off"> </div> <div class="form-group"> <label for="endTimeId">end time</label> <input type="text" class="form-control form_datetime" name="endTime" id="endTimeId" placeholder="please input end time" autocomplete="off"> </div> <div class="form-group"> <label for="remarkId">Remark</label> <textarea class="form-control" name="remark" id="remarkId"></textarea> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="button" class="btn btn-primary" onclick="doSaveObject()">Save changes</button> </div> </div> </div> </div> <table class="table"> <thead> <tr> <th>id</th> <th>title</th> <th>category</th> <th>start time</th> <th>end time</th> <th>state</th> <th>createdTime</th> </tr> </thead> <tbody id="tbodyId"> <tr> <td colspan="7">数据正在踊跃的加载中......</td> </tr> </tbody> </table> </div> <script type="text/javascript" src="/jquery/jquery.min.js"></script> <!-- 加载 Bootstrap 的所有 JavaScript 插件。你也能够依据须要只加载单个插件。 --> <script src="/bootstrap/js/bootstrap.min.js"></script> <script src="/datepicker/js/bootstrap-datetimepicker.min.js"></script> <script src="/datepicker/js/locales/bootstrap-datetimepicker.zh-CN.js"></script> <script type="text/javascript"> //在指定地位初始化datepicker对象 $(".form_datetime").datetimepicker({ language:'zh-CN', format:'yyyy/mm/dd hh:ii', autoclose:true }) //提交form表单,执行save操作 function doSaveObject(){ //基于此形式提交表单,表单中的元素肯定要有name属性, //并且name属性名的设计肯定要于服务端接管参数时的设计相匹配 //$("#saveFormId").submit();//同步提交 //======================================= //1.定义url let url="/activity/doSaveObject"; //2.定义申请参数 /* var params={ title:$("#titleId").val(),//val()为jquery中或指定表单元素的value值 category:$("#categoryId").val(), startTime:$("#startTimeId").val(), endTime:$("#endTimeId").val(), remark:$("#remarkId").val() } */ //debugger var params=$("#saveFormId").serialize();//serialize()为jquery中间接获取表单数据办法 console.log("params",params);//验证参数的值吗 //3.发送异步申请 $.ajax({ type:"post", url:url, data:params, success:function(result){ alert(result); //暗藏模态框 $('#myModal').modal('hide'); //从新执行查问,部分刷新 findActivitys(); } }); } //向服务端发送异步申请获取流动信息并更新到页面上 function findActivitys(){ //debugger //此单词写的地位很重要(这是入口),你要对谁进行断点剖析. let url="/activity/doFindActivitys"; let params={}; //借助jquery中的ajax函数,向服务端发送异步申请获取流动信息 $.ajax({//具体格局官网有定义(如果不想看官网,看现成第三方网站找ajax) url:url, data:params, dataType:"json", success:function(result){ doHandleQueryResult(result); } }); }; //解决服务端返回的流动信息,迭代result,并将result内容填充tbody地位 function doHandleQueryResult(result){ ///debugger console.log(result) //1.获取tbody对象,并清空原有内容 var tBody=$("#tbodyId");//原生写法-document.querySelector("#tbodyId") tBody.empty();//清空tbody中原有内容 //2.迭代result,将流动信息追加到tbody中 result.forEach((item)=>{//这里的item为一个变量,代表数组中某一个元素 //debugger tBody.append( `<tr> <td>${item.id}</td> <td>${item.title}</td> <td>${item.category}</td> <td>${item.startTime}</td> <td>${item.endTime}</td> <td>${item.state==1?'无效':'已完结'}</td> <td>${item.createdTime}</td> </tr>` ); }); } //jquery中定义的页面加载残缺执行形式如下: // $(function(){//如果所有的js代码放到html页面的head标签,倡议这样写 findActivitys(); //});//页面加载实现当前执行 </script></body></html>
配置文件 服务器#serverserver.port=80server.servlet.context-path=/# spring datasourcespring.datasource.url=jdbc:mysql:///dbactivity?serverTimezone=GMT%2B8&characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=root# spring mybatismybatis.mapper-locations=classpath:/mapper/*/*.xml# spring thymleafspring.thymeleaf.cache=falsespring.thymeleaf.prefix=classpath:/templates/modules/#spring.thymeleaf.suffix=.html# loglogging.level.com.cy=debug