大三东软暑期实训-SSM整合篇
- mybatis.xml已经整合到spring.xml中
- 诸如
<dependency><groupId>javax.servlet</groupId><artifactId>jsp-api</artifactId><version>${jsp-api.version}</version><scope>provided</scope></dependency>
中有provided说明仅在开发中使用,部署到服务器服务器会提供。
bug:
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.8</version></dependency>
- 数据库设计中文字段用utf8
- web.xml与spring.xml和springmvc.xml绑定,spring.xml与sql映射文件绑定
<bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 实例化sqlSessionFactory时需要使用上述配置好的数据源以及SQL映射文件 --><property name="dataSource" ref="dataSource" /><!-- 配置实体类别名 默认的别名就是类的类名--><property name="typeAliasesPackage" value="edu.xlh.pojo"></property><!--指定 mapper 的sql映射文件 --><property name="mapperLocations" value="classpath:mappers/*.xml" /></bean>
- 表字段与实体类属性名不一致要起别名或者用resultMap
- 业务层返回的数据类型取决于controller层要什么,controller需要什么取决于页面,所以业务层返回的数据类型最终取决于页面需要什么
- 类似中${o.doorName}在页面获取不到值的解决:
<c:forEach items="${doorList}" var="o" varStatus="i"><tr><td align="center">${i.index+1}</td><td>${o.doorName}</td><td>${o.doorTel}</td></tr></c:forEach>
加上<%@ page isELIgnored="false" %>
数据库获取不到连接页面返回异常
解决:
导入<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
再<fmt:formatDate value="${each.lastTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
例子:
<td><fmt:formatDate value="${o.createTime}" pattern="yyyy-MM-dd HH:mm:ss"/></td><td><fmt:formatDate value="${o.modifyTime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
- 内部重定向再项目根路径下访问新路径
demo1:
@RequestMapping("/add")public String add(){Door door = new Door();door.setDoorName("冒菜店");door.setDoorTel("1234");int rows = doorService.addDoorInfo(door);return "redirect:/findAllList";}
demo2:
@RequestMapping("/deleteById")public void deleteById(Integer id,HttpServletResponse response) throws IOException {doorService.deleteById(id);response.sendRedirect("/findAllList");}
demo3:
@RequestMapping("/deleteById")public void deleteById(Integer id,HttpServletResponse response) throws IOException {doorService.deleteById(id);response.sendRedirect("/findAllList");}
总结:请求到达服务器controller后处理只能进行一次转发走视图解析器返回jsp,不能够再服务器内部转发到某个controller的某个方法,但重定向可以实现,因为此刻重定向就已经不再走视图解析器。
- 后端写前端弹窗代码:
response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<script>alert('删除失败');location.href='/findAllList';</script>");writer.close();
- bug:出现了一系列创建bean失败,到spring.xml文件中找错,找跟扫包有关的标签。
@DateTimeFormat(pattern="yyyy-MM-dd")
的使用
springmvc默认时间参数为yyyy/MM/dd类型(会将前端传过来的string类型转成date类型封装到对象),使用yyyy-MM-dd类型作为url参数(即使是string类型也不会转换)会报错,这时就引出了@DateTimeFormat(pattern="yyyy-MM-dd")
注解。
同时,错误往往在controller层方法参数那里,方法体内使用try catch捕获不到错误。
注意:用在实体类util时间类型
<fmt:formatDate value="${o.modifyTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
嵌套再input标签
<input type="text" name="modifyTime" value="<fmt:formatDate value="${door.modifyTime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/>
- form表单中隐藏input标签
<input type="hidden" name="doorId" value="${door.doorId}">
- 出现一堆bean创建不了的bug,可能是spring.xml文件有问题,注意扫包有没有正确
- Http协议异常状态码:
404 再服务器找不到指定路径
405 请求类型不匹配
500 服务端代码错误(包括访问数据库错误),jsp爆500可能是jsp错误,jsp编译成.java文件,服务端代码错误
400 前端传入的参数类型和服务端接受的参数类型不匹配
typeMismatch参数类型不匹配
DEBUG [http-bio-8067-exec-7] - Resolving exception from handler [public java.lang.String edu.xlh.controller.DoorController.toUpdate(edu.xlh.pojo.Door,org.springframework.ui.Model)]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'door' on field 'createTime': rejected value [2021-06-07 00:00:00 ]; codes [typeMismatch.door.createTime,typeMismatch.createTime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [door.createTime,createTime]; arguments []; default message [createTime]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'createTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2021-06-07 00:00:00 '; nested exception is java.lang.IllegalArgumentException]
Field error in object 'door' on field 'modifyTime': rejected value [2021-06-08 00:00:00]; codes [typeMismatch.door.modifyTime,typeMismatch.modifyTime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [door.modifyTime,modifyTime]; arguments []; default message [modifyTime]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'modifyTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2021-06-08 00:00:00'; nested exception is java.lang.IllegalArgumentException]
- 表单封装可以将部分属性封装成实体类,另一部分属性传参使用(属性名不能与实体类属性名一样)
- 前端input标签中type="datetime-local"的使用:
<td><input type="datetime-local" step="1" name="createTime1" value=""/></td>
要与step="1"
连用,显示秒数
后端接受
@RequestMapping("/addOrder")public String addOrder(Order order,String created1,String updated2,String createTime1,String endTime1) throws ParseException {int index = created1.indexOf('T');String str1 = created1.substring(0,index);String str2 = created1.substring(index+1);String time = str1+" "+str2;SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date created = sd.parse(time);order.setCreated(created);index = updated2.indexOf('T');str1 = updated2.substring(0,index);str2 = updated2.substring(index+1);time = str1+" "+str2;sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date updated = sd.parse(time);order.setUpdated(updated);index = createTime1.indexOf('T');str1 = createTime1.substring(0,index);str2 = createTime1.substring(index+1);time = str1+" "+str2;sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date createTime = sd.parse(time);order.setCreateTime(createTime);index = endTime1.indexOf('T');str1 = endTime1.substring(0,index);str2 = endTime1.substring(index+1);time = str1+" "+str2;sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date endTime = sd.parse(time);order.setEndTime(endTime);orderService.addOrder(order);return "redirect:/findAllOrders";}
实体类:
package edu.xlh.pojo;import org.springframework.format.annotation.DateTimeFormat;import java.util.Date;public class Order {Integer orderId;Integer dId;String orderNo;String orderType;String cashier;@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")Date createTime;@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")Date endTime;String paymentType;Double price;//@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")Date created;//@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")Date updated;public Integer getOrderId() {return orderId;}public void setOrderId(Integer orderId) {this.orderId = orderId;}public Integer getdId() {return dId;}public void setdId(Integer dId) {this.dId = dId;}public String getOrderNo() {return orderNo;}public void setOrderNo(String orderNo) {this.orderNo = orderNo;}public String getOrderType() {return orderType;}public void setOrderType(String orderType) {this.orderType = orderType;}public String getCashier() {return cashier;}public void setCashier(String cashier) {this.cashier = cashier;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Date getEndTime() {return endTime;}public void setEndTime(Date endTime) {this.endTime = endTime;}public String getPaymentType() {return paymentType;}public void setPaymentType(String paymentType) {this.paymentType = paymentType;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}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;}@Overridepublic String toString() {return "Order{" +"orderId=" + orderId +", dId=" + dId +", orderNo='" + orderNo + '\'' +", orderType='" + orderType + '\'' +", cashier='" + cashier + '\'' +", createTime=" + createTime +", endTime=" + endTime +", paymentType='" + paymentType + '\'' +", price=" + price +", created=" + created +", updated=" + updated +'}';}
}
<fmt:formatDate value="${order.createTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
与实体类配合使用@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
,同时注意:@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
只有在前后端交互中前端封装为实体类属性才会生效,不必关心在java代码中Set实体类属性时会使用到。
- 不使用插件的分页
下一页跳转初始化。查询第一页。
@RequestMapping("/toLimitPage")public String toLimitPage(@RequestParam(name="currentPage",defaultValue = "1") Integer currentPage,Model model){//当前页currentPage = currentPage+=1;Integer pageSize=2;
//获取中记录数int totalSize = orderService.getCountTotal();Integer totalPage = totalSize%pageSize!=0? totalSize/pageSize+1:totalSize/pageSize;if(currentPage>=totalPage){currentPage=totalPage;}if(currentPage<=1){currentPage=1;}
//偏移量 每页显示的条数Integer offSet=(currentPage-1)*pageSize;List<Order> list = orderService.findOrdersByPage(offSet, pageSize);model.addAttribute("totalPage",totalPage);model.addAttribute("orderList",list);
//当前页model.addAttribute("currentPage",currentPage);return "orderList";}
查询上一页:
@RequestMapping("/toUpPage")public String toUpPage(@RequestParam(name="currentPage",defaultValue = "1") Integer currentPage,Model model){int totalSize = orderService.getCountTotal();Integer pageSize=2;Integer totalPage = totalSize%pageSize!=0?totalSize/pageSize+1:totalSize/pageSize;if(currentPage!=1) {currentPage = currentPage - 1;}Integer offSet = (currentPage-1)*pageSize;List<Order> orderList = orderService.findOrdersByPage(offSet,pageSize);model.addAttribute("orderList",orderList);model.addAttribute("totalPage",totalPage);model.addAttribute("currentPage",currentPage);return "orderList";}
前端:
<p style="text-align: center"><a href="toUpPage?currentPage=${currentPage}">上一页</a> |<a href="toLimitPage?currentPage=${currentPage}">下一页</a>| 总页数:<span>${totalPage}</span>页| 当前页:<span>${currentPage}</span>页</p>
- 文件上传
导入依赖
https://mvnrepository.com/搜commons-io(注意还要加上另一个依赖,在下面的.xml中代码中)
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>
springmvc.xml
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--设置上传最大尺寸为50MB--><property name="maxUploadSizePerFile" value="52428800"/><property name="defaultEncoding" value="UTF-8"/><property name="resolveLazily" value="true"/></bean>
controller代码:
@RequestMapping("/toUploadPage")
public String toUploadPage(){return "upload";
}@RequestMapping("/toUpload")public String toUpload(MultipartFile fileData, Model model, HttpServletRequest request) throws IOException {String filename = fileData.getOriginalFilename();System.out.println(filename);if(filename==null){model.addAttribute("msg","文件为空");}int index = filename.lastIndexOf(".");// String uuid = UUID.randomUUID().toString();String suffix = filename.substring(index);long prefix = System.currentTimeMillis();String newFileName= prefix+suffix;String path = request.getSession().getServletContext().getRealPath("/upload");File file = new File(path);if(!file.exists()){file.mkdir();}File file1 = new File(path,newFileName);fileData.transferTo(file1);model.addAttribute("msg","上传成功");return "upload";}
效果:
- mybatis开发效率比jdbc高,jdbc比mybatis访问效率高。
- tomcat内部提供线程池,tomcat启动初始化线程池,为客户端每一条请求分配一条线程(任务结束归还,管理线程和复用线程)访问数据库,而访问数据可能要从连接池获取连接(任务结束归还,管理连接和复用连接)
–提高程序性能
大三东软暑期实训-SSM整合篇相关推荐
- 东软大三上学期实训笔记-javase篇Day12
javase篇Day12 1.类 2.对象的创建 3.构造方法: 4.面向对象三大特性 5.封装: 6.this 关键字 7.继承: 8.方法的重写(方法的覆盖): 9.super 10.多态: 11 ...
- 东软mysql期末题库_东软大三上学期实训笔记-mysql篇Day5完结篇
mysql篇Day5完结篇 知识点讲解: 1.视图:view (1) 虚拟表.和普通表一样使用 (2) 作用: ① 视图存储在数据库中的查询语句.主要作用:安全原因.可以使复杂的查询语句容易理解与使用 ...
- 大三上学期实训——基于SpringBoot的电影后台管理系统
前言 本项目github地址:https://github.com/suobanjin/movie 目 录 1 系统需求分析- 1 1.1 产品非功能需求- 1 1.1.1 用户需求- 1 1.1.2 ...
- 大三计算机课设体会,2019-大三学生计算机实训总结与体会-范文模板 (2页)
2019-大三学生计算机实训总结与体会-范文模板 本文部分内容来自网络,本司不为其真实性负责,如有异议或侵权请及时联系,本司将予以删除! == 本文为word格式,下载后可随意编辑修改! == 大三学 ...
- 【百家稷学】深度学习计算机视觉生产实习(山西农业大学暑期实训)
继续咱们百家稷学专题,本次是有三AI在山西农业大学开设的为期10天的正式暑期专业课程.百家稷学专题的目标,是走进100所高校和企业进行学习与分享. 本次主题 本次实训是在山西农业大学进行,主题是< ...
- 暑期实训总结_李小倩
暑期实训总结 姓名:李小倩 学号:111307105 班级:CSDN-java班 年级:2011级 转眼间实训已经结束有些时间了,我想这个实训对于我们参与的每一个人来说都是一段美好快乐的记忆.记得距 ...
- 暑期实训心得及总结_史国旭
暑期实训心得及总结 姓名:史国旭 学号:111307168 班级:CSDN-java 年级:2011级 转眼间实训已经结束4天了,我想这个实训对于我们参与的每 ...
- 在线大数据 / AI竞赛实训平台深度技术解析 | 文末抽奖
点击"蓝字"关注我们 文末抽奖!留言区留下你的学习心得或疑问,点赞数前3名的粉丝,炫酷奖品等你拿! 12月24日晚,智领云第五次社群图文技术直播如约而至.本次直播由智领云云平台部 ...
- 山东大学暑期实训-饮食健康管理系统设计与实现(一)
山东大学暑期实训-饮食健康管理系统设计与实现(一) 环境配置篇(一) python环境配置 环境配置篇(一) python环境配置 使用Anaconda配置python环境,Python环境选择3.8 ...
最新文章
- 区分什么是Apache、Tomcat,之间有什么关系?
- 湖南省第八届大学生计算机程序设计竞赛1115: 最短的名字(模拟)
- mysql delete and or_Mysql delete操作
- TCP/IP——基本知识
- 年龄测试计算器软件,抖音很火的年龄计算器
- 自建Yum源并与科大开源镜像站进行同步
- 在CentOS上使用Jexus托管运行 ZKEACMS
- jQuery插件实现网页底部自动加载-类似新浪微博
- java hashset 实现_HashSet实现原理分析(Java源码剖析)
- data-mask遮罩无法正常显示与编辑的问题
- leetcode python3 简单题1.Two Sum
- 【2020模拟考试T4】【PAT乙】1034 有理数四则运算 (20分) 测试点2
- 神经网络的介绍与模型搭建
- Windows 7下的虚拟光驱
- Elasticseach api keys are not enabled
- html5正在加载数据,JSP如何做正在加载数据,请稍等...这样的提示页面 loding。。。...
- vb.net 教程 7-1 本地网络信息的获取 3 网络连接信息
- 计算机经典书籍介绍及下载站点
- 八种显示器技术(放映机、投影仪、CRT显示器、LCD显示器、LED显示器、PDP等离子显示器、激光显示器、VR显示器)
- linux下安装matlab运行环境