书城项目笔记

总结

  • <script>标签中写js时,若想得到当前触发该事件的dom对象的属性的值,则用$(this).attr("属性名"),但若想得到当前触发该事件的dom对象的value属性的值,则用this.value即可
  • jsp页面的域requestScope就是后端servlet中的req,也就是说后端req.setAttribute("键名"),在jsp页面直接可以用requestScope.属性名得到相应的属性值
  • jsp页面的域SessionScope就是后端servlet中的req.getSession(),也就是说后端req.getASession().setAttribute("键名"),在jsp页面直接可以用sessionScope.属性名得到相应的属性值
  • ${}中不可嵌套${}
  • HttpServletRequest req
    req.getContextPath():返回的是工程路径/book
  • 请求重定向的/是浏览器解析 请求转发的/是服务器解析
  • js中在得到dom对象后调方法dom.text(XXX),XXX会将原dom对象中的文本覆盖掉(也就是得到的那个标签的其实标签和结束标签之间的内容会被text()方法中的内容覆盖)
  • 当html页面已经加载出来后,他就不会再去重读页面(即重读html页面代码)再加载,除非刷新页面才会重读页面并加载,所以如果像html页面中有<c:if>,他在加载页面的时候会判断是否满足条件当满足时执行if中的语句,不满足时不执行,但如果在加载页面的时候是不满足,则if中的语句不会执行,但若在页面浏览过程中对其进行了操作,此时看if时他又满足了,但也不会去执行,因为一旦页面读完,加载完显示了,他就不会再去读,除非是刷新页面才会重新读代码加载也页面,例:
<c:if test="${empty sessionScope.cart.items}">
   您购物车中有<span id="cartTotalCount" style="color: red">0</span>件商品
   <div>
      <span style="color: red" id="cartLastName">当前购物车为空</span>
   </div>
</c:if>
<c:if test="${not empty sessionScope.cart.items}">
   您购物车中有<span id="cartTotalCount" style="color: red"></span>件商品
   <div>
      您刚刚将<span id="cartLastName" style="color: red"></span>加入到购物车
   </div>
</c:if>

刚进入页面时购物车为空,所以在读代码加载页面是只会执行第一个if下的代码,因为满足该if可执行的条件,而不会执行第二个if下的代码,但在页面中在点击加入购物车后,此时,实则是满足第二个if的条件的,但页面不会自动刷新变成执行了第二个if而没有执行第一个if的样子,除非此时刷新页面,就会重新读代码加载页面,而再读的时候就是满足第二个if不满足第一个if,页面的样子就是执行了第二个if没有执行第一个if的样子


  • 后端向前端传数据:
    resp.getWriter().write(要传的数据)

  • 如果点击一个按钮需要向服务器发送请求,一般用ajax请求;

  • 如果是点击超链接需要向服务器发送请求,一般用同步请求(即不用ajax)

  • 登录业务:当登录失败时在登录页面显示提示“用户名或密码错误”,本来是想给登录按钮绑定一个点击事件,然后从req域中取查找到的user,如果不为空则不显示,如果为空则显示,但遇到一个问题,就是当点击按钮后,是js先执行还是发请求先执行(就是servlet先执行)还是同时执行呢,无法判断 ,而如果要采用这种方法必须保证servlet先执行,先去根据用户名和密码查找用户,然后将用户存储到req域中,然后再执行js从request域中取用户在判断是否为空,但由于本段加粗部分所述问题,这中方法就不行了,所以可以在servlet中去判断和设置,也就是在servlet中根据用户名和密码查询用户,如果查到则不在request域中保存“用户名或密码错误” 提示信息,如果没查到,则在request域中保存“用户名或密码错误” 提示信息,然后在jsp页面中直接在req域中取信息,如果有就显示,如果没有就不显示

  • form表单的action属性是用来指明表单的提交位置的即该表单点击提交按钮(type=submit)时该表单提交到哪,并不作为请求参数,而且action的值只能写url不能写任何请求参数(也可以写,但没用,因为浏览器不会识别form标签action属性的请求参数部分也就是action值中?及后面的部分),所以不要在action属性这里写任何请求参数,而在servlet中想通过请求参数action来决定调用哪个方法,需要在form表单中写一个隐藏域,其name属性的值是action,value属性的值是该表单提交到servlet需调用的方法的方法名,例如:userServlet的登录

<form action="userServlet" method="post">
   <input type="hidden" name="action" value="login" />
  • form标签把哪些包括住都行,只要将所要提交的<input>标签和提交按钮包含在form标签中就行,至于还包住了其他标签也没事,只要是位置对就可以(也就是你form标签开始包哪些标签,这些被包住的标签要是完整的,也就是在form标签中是有其开始标签和结束标签,单标签除外)

  • 超链接的href属性中如果需要域中的值做为请求参数,直接在href的值中写就行,即直接在href=""的引号中写就行不用写在引号外面然后又用+号进行字符串的拼接

  • 当需要回显数据时,必须经过后端把数据存储到域中,然后跳转至想要回显数据的页面,在页面中读取域中的数据

  • 当jsp页面只负责请求转发时整个页面只写<%@ page contentType="text/html;charset=UTF-8" language="java" %>和请求转发句子,其他的什么<html>之类的标签都不写

  • 如果某页面是公共页面就比如导航栏,他基本都是被静态导入的,这种页面在首行一定要写<%@ page contentType="text/html;charset=UTF-8" language="java" %>这句话是避免乱码,然后其他写的东西就是你需要被引入啥就写啥,你写的东西都会原封不动的出现在引入他的位置

  • js中$(this).val()this.value一样都是用来得到相应的dom对象的输入值(value)的

  • 如果要给不同行相同的dom对象绑定上同一个事件,此时用calss属性来绑定才可以成功,比如,对于购物车,要给每一行的“数量”都绑定修改事件(.change(function())),此时将该修改文本框的class置为一个值,用该class属性来绑定事件,这样才能使每一行的修改数量都绑定上,代码如下,因每一行是同通过循环输出的,而id是唯一的,当第一行输出时就有这个id值了,其他行循环输出时,也有这个id值但id是唯一的,只对一个有用(经代码测试,只对第一行有用),所以这种情况最好用class绑定事件,因为每一行循环输出时都会有这个class属性,而绑定事件时是class,也就是只要是class为你绑定事件的那个class的所有dom对象都能绑定上这个事件,此时只要你需要绑定事件的dom对象的class和绑定事件时的class一样,每一行的相应dom对象都能绑定上该事件

<c:forEach items="${sessionScope.cart.items.values()}" var="item">
    <tr>
        <td>${item.name}</td>
        <td><input class="changeCount" bookId="${item.id}" type="text" value="${item.count}" style="width: 40px"></td>
        <td>${item.price}</td>
        <td>${item.totalPrice}</td>
        <td><a href="cartServlet?action=deleteItem&id=${item.id}" class="deleteItem">删除</a></td>
    </tr>
</c:forEach>
$(".changeCount").change(function () {
    var bookId = $(this).attr("bookId");
    var name = $(this).parent().parent().find("td:first").text();
    var count = $(this).val();
    if (confirm("你确定要将【" + name + "】的数量修改为【" + count + "】吗?"))
        location.href = "cartServlet?action=updateCount&id=" + bookId+"&count="+count;
    else
       this.value = this.defaultValue;
});
  • jdbcUtils:获取数据库连接和关闭连接
  • BaseDao:通用增删改,查询结果为一个Bean,查询结果为Bean集合,查询结果为一行一列的
  • BookDao:对图书的crud操作

注意

  • 当数据库中属性名和Java代码中的JavaBean的属性名不一样时,写sql语句时要注意给查找的列请别名,别名和JavaBean中属性名相同,如果数据库中属性名和Java代码中的JavaBean的属性名相同的话,就不用起别名了【如果数据库中属性名和Java代码中的JavaBean的属性名不一样时,还没有起别名,是无法将查出的结果封装到相应的Bean对象中的,因为找不到名字】
  • 在JavaBean中,get和set方法,定义的那些属性是什么类型的get的返回值就得是什么类型,set的形参也必须得是什么类型,必须一模一样,如果定义的属性是包装类,就get,set就得是相应的包装类不能是基本数据类型,如果定义的属性是基本数据类型,就get,set就得是相应的基本数据类型不能是包装类
  • 注意数据的类型,尤其是你方法申明中方法的返回值类型是啥,在方法中返回的时候就得是啥类型,包装类就得是包装类,基本数据类型就得是基本数据类型

该项目的具体项目地址:
github:https://github.com/Mia-3/book_store
gitee:https://gitee.com/mia-3/book_store

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值