JavaWeb 复习讲义
原始讲义
第六部分 自测与附录

附录C 三十条高频易错点清单

考前最后一遍,只看这张表。每一条都是"看起来会、一写就错"的地方。

HTML / CSS

  1. 表单控件没有 name 属性,数据不会被提交,只写 id 不够。
  2. <td colspan> 是跨列,rowspan 是跨行,口诀"col 是 column(列)"。
  3. <br> 只换行不加空行,<p> 自带上下间距。
  4. id 在一个页面必须唯一,class 可以重复。
  5. CSS 权重:内联 1000 > id 100 > class 10 > 元素 1;!important 直接压过一切。
  6. box-sizing: content-box(默认)时 width 只算内容区,加了 padding 和 border 会变宽。
  7. 行内元素设 width/height 无效,要改 display: inline-block 或 block。

JavaScript

  1. var 有变量提升、无块级作用域;let 有块级作用域;const 声明后不能重新赋值。
  2. "5" == 5 为 true(隐式转换),"5" === 5 为 false(类型不同)。
  3. parseInt("12px") 得 12,parseInt("px12") 得 NaN。
  4. onclick 绑定的是函数引用,写成 btn.onclick = f() 会立即执行。
  5. onsubmit 里 return false 才能阻止提交,只写 false 没用。
  6. document.getElementById 取不到元素时返回 null,直接访问属性就会报错,所以脚本要放在 </body> 前或 DOMContentLoaded 里。

HTTP / Tomcat

  1. GET 的参数在 URL 上,不在请求体;POST 的参数在请求体。
  2. GET 可缓存、可收藏、幂等;POST 都不行。
  3. 302 是重定向,304 是"资源没变,用缓存",两者完全不同。
  4. 404 是路径问题(请求没进代码),500 是代码问题(进去了但抛异常)。
  5. Content-Type 里的 charset 决定浏览器用什么编码解析,写错就乱码。

Servlet

  1. Servlet 是单实例多线程,成员变量会被并发共享,能用局部变量就别用成员变量。
  2. init() 和 destroy() 各调用一次,service() 每次请求都调。
  3. loadOnStartup 大于等于 0 时,服务器启动就创建实例;默认是第一次访问才创建。
  4. urlPattern 优先级:精确匹配 > 目录匹配(/user/*)> 扩展名匹配(*.do)> 默认(/),/* 会吃掉所有请求包括静态资源。
  5. getWriter() 与 getOutputStream() 同一次响应里只能用一个。
  6. setCharacterEncoding 必须在 getParameter 之前;response.setContentType("text/html;charset=UTF-8") 要写在 getWriter() 之前。

转发与重定向

  1. 转发是服务器行为(1 次请求,地址栏不变,request 域共享);重定向是浏览器行为(2 次请求,地址栏变,域丢失)。
  2. 重定向地址必须加 getContextPath(),否则会跳到域名根下。

会话

  1. setMaxAge(0) 是删除 Cookie;负数才是会话级 Cookie。
  2. 关闭浏览器不等于 Session 销毁:服务端 Session 还在,只是浏览器丢了 JSESSIONID。
  3. Cookie 单个约 4KB,且不能存中文(要 URLEncoder 编码)。

JSP / JDBC

  1. ${} 取不到值输出空串不报错,这是它与 <%= %> 最大的差别。
  2. c:forEach 用之前必须写 <%@ taglib prefix="c" ... %>,否则标签原样输出。
  3. PreparedStatement 的下标从 1 开始。
  4. 模糊查询要写 like ?,参数值为 "%" + name + "%";写成 like '%?%' 占位符在引号内,永远匹配不到。
  5. 资源释放顺序是"先开后关":ResultSet → Statement → Connection。