第一天上午:
- 数据库建表名称:tbl_表名 tb_表名
- id 主键字段 类型String 存储方法:UUID(保证全球唯一性)
- 日期类型字段:年-月-日 长度:char(10)
年-月-日 时:分:秒 char(19) - varchar 可变定长字符串
char 不可变定长字符串 - 主键:不设置自动增长
- 外键:不添加外键约束(设置一个普通字段作为外键字段)
第二天上午:
- Jsp中的路径全部使用绝对路径
- 将WEB-INF 下的HTML修改成jsp
- 需求:光标聚焦,刷新页面不保留数据,点击回车进行登录(绑定窗口键盘事件),点击登录进行登录,ajax发送登录请求,显示错误提示信息,success:true/false判断是否跳转
- 手写的动态代理们不能使用debug启动
- IP:localhost:request.getRomeotAttr();//0.0.0…1
第三天上午:
- 静态常量:接口或枚举中定义
- 清除session对象:session.invalidate()
- window.location.href=”请求”
- 判断条件中有对象是否为空的判断,将它放在所有判断条件最前面,以防止出现空指针异常
- iframe 标签设置name属性,在页面加载时,通过window.open(“请求地址”,”iframe的name”)表示主页面,也可以用来设置超链接跳转的工作区域
- 退出登录:销毁session对象使用session.invalidate()方法;将已经存在的cookie的value设置为null,设置全路径“/”,存在时间清零,response到响应体中
第四天上午:
- 登录页:防止退出账号后登录页面出现在iframe中
If(window.top != window){
Window.top.location = window.location;
} - 传递多个参数操作数据库时,在dao接口要使用@Param声明参数
- 重定向时:使用绝对路径,重定向请求开头使用“/”;也可以使用相对路径,同路径请求可省略相同部分
- Service层处理异常,增删改
- Sql语句排序在order by 字段*1 或者 order by 字段+0 可以达到自然数排序
- 警告提示在每次保存时先清空
- 保存前先发请求进行必要字段非空验证,根据返回值判断显示提示信息或者使用传统form表单提交方式
第五天上午
- 跳转修改页面,在checkbox上面绑定主键,请求时将主键传递进去,通过查询获取数据,传到修改页面
- Jquery对象是一个数组
- this表示绑定jquery对象的dom对象
- $(“input[name=xz]”).prop(“checked”,this.checked)
- 通过判断选中复选框的长度与普通复选框的数量是否相等决定总复选框是否选中
- 批量删除,动态sql之foreach:collection只有两个选择:array和list
- 事务回滚设定为exception,不设定事务回滚默认是运行时异常回滚
- 最出现的一个错误:错误提示sql语句中的foreach循环的array不存在。产生的原因:前台传的值后台没有接收到,可能是参数不匹配的原因。前台传多个code,后台字符数组就应该是String[] code 来接收
- 更新时如果没有主键则建议写一个隐藏域存放传进来的主键值
- 后台默认使用请求转发,一般是转发页面,如果需要使用转发请求需要加“forword:请求”;重定向是发送请求“redirect:请求”
CRUD练习error:
- request.getContextPath输出是:/crm
- 常出现错误1:org.springframework.web.servlet.PageNotFound.noHandlerFound No mapping found for HTTP request with URI [//crm02/workbench/main/toIndex.do] in DispatcherServlet with name ‘dispatcherServlet’,找不到地址,查看你所有请求:前台请求不加“/”,后台请求全部加“/”.路径确实没问题,重启idea。
- 常出现错误2:ajax不执行,原因一:相关请求在后台没加@ResponseBody;原因二:web.xml没有配置关联dispatcherServlet.xml;原因三:mapper.xml文件中存在无关字段
- 常出现错误3:jstl表达式foreach标签中item使用${ item }来接收值
第六天上午
- 32位 UUID
10位 年月日
19位 年月日 时分秒
有外键的表是多,以外键字段为主键的表是一 - function执行过程,如何扫描:先扫描(加载)function标准形式,在加载其他形式
- 想访问WEB-INF下的页面,只能访问后台
- 模态框打开modal(“show”);关闭modal(“hide”) ;
- Bootstrap的自定义属性data-
- Bootstrap只支持ajax不支持传统请求(request作用域,使用表单发送请求)
- Contenteditable=true 输入框自动换行属性
- $.each(data,function (i,n)
data是需要遍历的数组,i表示次数,n表示每一个数组对象 - 打开模态框这一步必须写在ajax请求中
- El表达式取值在js使用需要套在双引号中
第七天上午
- 执行完新增操作要清空表单:
- Jquery中没有提供表单的reset方法,转换成dom元素使用表单的reset方法
- Data-dismiss=”modal” 关闭按钮的关闭模态框
- Ajax获取下拉框信息,通过el表达式取得id,放在select的value属性中,select会自动选中ajax中的这个id对应的值
- Catch是捕获异常,异常捕获后还会继续执行下面代码,throw 抛出异常,则不会执行下面的代码。自定义异常的时机由开发者决定
- Limit 略过的记录数,显示的记录数
- 动态sql中的模糊查询like中,% 与取值使用空格进行拼接:like ‘%’ #{name} ‘%’ 。动态sql中的if条件判断test属性中可以使用and,不能使用&&
- Statement 对值进行拼接,无法防止sql注入${}
PreparedStatement 对值进行站位,防止sql注入#{} - 在业务层加%作为参数,使业务层与dao层耦合度更高
- mapper.xml文件大于:
>
小于:<
- 一般情况下将数据使用降序排列,例如按照创建时间排序
- String xx = new String (“xxxx”);//这是创建了两个对象
String x = new String(“java”);//这是创建了一个对象,因为在JVM中的常量池中本身就存在这个java常量。 - 对需要从前台传向后台输入框中的值,在前台一律使用$.trim()进行处理
第八天上午
- @RequestParam Map类型参数,参数可以使用map来传递
- Pojo bean javabean domain 实体类,bean 范围更广
VO:Value Object 用来表现值得对象.将需要展现值得信息,展现在vo类的属性中。存取值使用setter,getter实现,不需要与数据库表对应
Pojo(domain):与数据库表和字段一一对应的类 - Integer比int的好处是可以识别null值,int默认值是0,识别不了null
- Js中使用on方法绑定动态的元素
- 文本域textarea 没有value属性,他的信息作为它本身的value值,使用val()获取,不能使用html()
- 后台参数接收可以使用@RequestParam Map,实体类
- get请求比post请求效率高,post比get更安全
- 在maven中加入任何外部资源时都需要刷新一下maven
- EL表达式取值取出NULL,会自动改为空字符串""
- 删除时,弹窗用confirm(“消息”),保证数据的安全性
第九天上午
- Mapper.xml文件中的select语句一定要有返回值
- 文件上传下载插件POI,workbook:Excel文件;sheet创建一页,row创建一行createRow(0)0表示第一行;cell便是一个单元格(列),createCell(0),0表示第一个单元格;插件不支持异步请求,使用传统请求
- 在for循环中i+1与++i的区别,i的值会改变
- 请求头浏览器通知服务器,如何正确接受处理信息;响应头,服务器通知浏览器如何正确打开响应信息
- 文件上传时使用虚拟路径,真实路径盘符可能不存在。后台接收使用MultipartFile来接收file
- Response.setContentType(“octets/stream”)//提供一个下载框
- 通过response执行 的响应流,不用自己关闭,Tomcat会帮你关闭响应流
- Jquery没有提供取得文件的方法,使用js原生的files方法
- 虚拟路径:找的是当前项目下的路径。在文件上传时使用的是虚拟路径
- 在webapp根路径下新建一个文件夹存放上传文件,如果target没有生成,在这个文件夹下,新建一个jsp文件,这个文件夹编辑执行
- 全局作用域下的realPath方法获的虚拟路径下的真实路径;
- Sheet.getLastRowNum()获取行的索引值,row.getLastCellNum()返回列具体的数量
- 上传时使用的是list,不使用数组,因为list是变长,数组是定长
第十天上午
- 拼接HTML三种方法:使用jquery 的html方法,覆盖div中的内容;使用append,在兄弟元素后面追加html;使用before,在兄弟元素之前追加html
- 传递多个数据列表,使用map键值对,传递一组类型的数据,使用list集合
- javascript:void(0)禁用超链接,手型鼠标显示只能在超链接中,超链接必须使用触发事件的形式执行操作
- 动态拼接html,我们一般使用触发事件来进行操作,不是绑定事件,方法中的参数要放在引号中
οnclick=“deleteRemark(’’+n.id+’’)” - Delete(物理删):好处:及时清除表中的不需要的记录,这些记录删除掉之后不占用过多的内存空间,坏处:危险;update(逻辑删):好处:安全,坏处:记录会越来越多,查询效率也会越来越低
- Mysql数据库存进的数据默认按照主键排序
- 执行分页,获取数据,total是String,进行除法运算要转成int类型在+1, var totalPages = data.total % pageSize == 0 ? data.total / pageSize : parseInt(data.total / pageSize)+1;
- 删除出现问题,可能是input前面加上了#,重点检查
- 市场活动备注(评论)crud全流程:
(1) 在动态添加的超链接中,需要使用触发事件的形式来绑定事件,执行跳转页面操作,这里要传入id
(2) 后台使用ModelAndView存放查询的activity数据
(3) 在detail页面使用el表达式在相应的位置赋值
(4) 加载完activity信息,页面发送ajax请求,获取remark集合,需要传递activityId.(使用ajax发送请求,因为需要局部刷新备注信息)
(5) 备注的3种添加方式:第一种,建一个div,给id属性,将备注放到这里面;第二种,采用追加的方式append,在需要显示的位置找他的父级元素使用append追加到尾部;第三种,采用before的方式,找到显示位置的兄弟元素,在兄弟元素前面追加。(append,父级元素使用,添加到父级元素内部最后;before,兄弟元素使用,添加到兄弟元素之前)
(6) 删除也需要使用触发事件的方式绑定事件,这里需要传递参数id。这里的id需要放在引号中,οnclick=“deleteRemark(’’+n.id+’’)”。删除返回success:true/false;成功则使用remove方法移除元素
(7) 注意:因为修改会有内容,人员,时间的变动,所以读取remark集合时,需要在相关位置加上id值,id=”字母+id值”.
(8) 点击修改,使用onclick触发事件,弹出模态框,读取remark的id值放在隐藏域中,读取noteContent的值显示在修改框。点击更新保存,使用ajax发送请求,返回结果success和remark对象。通过id更新显示内容,修改人,修改时间