Java、JavaScript和Web开发笔记
·
Java 编程基础
基本命令和概念
- 基本命令: Dir, Cd…, Cd, Cls, Exit
- 项目结构: project, module, package, class
- 代码注释: /* +enter, ctrl+shift+/
- 特殊字符: \n (换行), \t (制表符)
代码示例:
CMD 常用命令:
Dir 列出目录内容
Cd.. 返回上一级目录
Cd\ 回到根目录
Cls 清屏
Exit 退出
项目层级:project → module → package → class
数据类型和运算
- 基本数据类型:
- int (整数)
- long (长整数, L后缀)
- double (双精度浮点数)
- float (单精度浮点数, F后缀)
- char (字符)
- 字符编码: A(65), a(97), 0(48)
- 存储单位: B(字节), KB, MB, GB, TB (1024进制)
- 进制转换: 十进制、二进制、八进制、十六进制
代码示例:
字符编码对照:
'A' = 65 'a' = 97 '0' = 48
存储单位换算(1024 进制):
1 KB = 1024 B
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB
进制换算(8421 法):
二进制 1010 = 十进制 8+0+2+0 = 10
数组操作
- 数组声明:
数据类型[] 数组名 = new 数据类型[长度];数据类型[] 数组名 = {元素1, 元素2, ...};数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, ...};
- 数组遍历: for循环、while循环
- 数组索引: 从0开始,最大索引为长度-1
- 多维数组: 二维数组、三维数组
代码示例:
// 方式一:指定长度
数据类型[] 数组名 = new 数据类型[长度];
// 方式二:直接初始化
数据类型[] 数组名 = {元素1, 元素2, ...};
// 方式三:new 同时初始化
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, ...};
// 遍历示例(while + for)
int[] Arr = new int[4];
int index = 0;
while (index < Arr.length) {
// 处理 Arr[index]
index++;
}
for (int i = 0; i < Arr.length; i++) {
// 处理 Arr[i]
if (i == 2) break; // 满足条件跳出
}
控制流程
- 条件语句:
if-else结构switch语句
- 循环语句:
for循环while循环do-while循环break和continue关键字
代码示例:
// if-else
if (条件) {
// true 分支
} else {
// false 分支
}
// switch
switch (变量) {
case 值1: ...; break;
case 值2: ...; break;
default: ...;
}
// for / while / do-while
for (int i = 0; i < 10; i++) { }
while (条件) { }
do { } while (条件);
面向对象编程
- 类与对象:
- 类的定义和实例化
- 构造方法: 无参构造、有参构造
this关键字: 引用当前对象- 对象创建:
Student s1 = new Student();
- 封装:
- 私有成员变量
- 公共getter/setter方法
- JavaBean规范
- 继承:
extends关键字- 方法重写 (
@Override) super关键字: 调用父类方法
- 多态:
- 接口实现
- 抽象类
instanceof关键字: 类型检查
- 访问修饰符:
public: 公共访问protected: 受保护访问private: 私有访问- 默认: 包访问
代码示例:
// 对象创建:new 在堆中创建对象,s1 指向它
Student s1 = new Student();
Student s1 = new Student(); // s1 指向新对象
// 空字符串
String s = "";
// this 关键字:区分成员变量与局部变量
this.name = name;
// JavaBean 规范:私有字段 + get/set
public class Student {
private int score;
public int getScore() { return score; }
public void setScore(int score) { this.score = score; }
}
// 访问属性
s1.score;
// 继承:构造方法调用
super(); // 调用父类构造(第一行)
this(...); // 调用本类重载构造(第一行)
// 多态:向下转型前用 instanceof 判断,防止 ClassCastException
父类 变量名 = new 子类();
if (变量名 instanceof 子类) {
子类 s = (子类) 变量名;
}
// final:类不能继承、方法不能重写、变量为常量
// static final:静态常量
// abstract:抽象类 / 抽象方法
高级特性
- 静态成员:
- 静态变量: 类级别共享
- 静态方法: 可以直接通过类名调用
- 静态代码块: 类加载时执行
- 静态内部类
- 内部类:
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
- 泛型:
- 泛型类:
class Box<T> - 泛型方法:
public <T> void printArray(T[] inputArray) - 通配符:
? extends Type,? super Type - 类型擦除
- 泛型类:
- 异常处理:
try-catch-finally结构- 自定义异常类
- 异常链
throws关键字
代码示例:
// 静态代码块(类加载时执行)与实例代码块(创建对象时执行)
class Demo {
static {
// 静态代码块
}
{
// 实例代码块
}
}
// 注意:static 上下文中不能使用 this
// 内部类创建方式
外部类.内部类 对象1 = new 外部类().new 内部类();
外部类.内部类 对象2 = new 外部类.内部类();
// 内部类中访问外部类成员:外部类.this
// 泛型定义
class 类名<...> { }
interface 接口名<...> { }
// 通配符
? extends Car // 上限:Car 及其子类
? super Car // 下限:Car 及其父类
? // 任意类型
// 常用字母:E T K V
// 异常处理
try {
// 可能抛异常的代码
} catch (异常类型 e) {
// 处理
} finally {
// 一定会执行
}
Java API
- String类:
- 不可变性
- 常用方法:
length(),charAt(),substring(),indexOf(),replace() - 字符串连接:
+运算符,concat()方法 - 字符串比较:
equals(),equalsIgnoreCase()
- 集合框架:
ArrayList: 动态数组HashMap: 键值对存储HashSet: 不重复元素集合LinkedList: 链表结构- 泛型集合
- IO流:
- 文件操作:
File类 - 字节流:
InputStream,OutputStream - 字符流:
Reader,Writer - 缓冲流:
BufferedReader,BufferedWriter - 转换流:
InputStreamReader,OutputStreamWriter
- 文件操作:
代码示例:
// String:两种创建方式(常量池 vs new)
String s1 = "..."; // 常量池
String s2 = new String("..."); // 堆中新建对象
// ArrayList 集合
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.get(0);
// File 类:文件/目录操作
File file = new File("路径");
// 1. 创建 2. 删除 3. 判断/获取
JavaScript 编程
DOM操作
- 元素选择:
document.getElementById(): 通过ID选择document.getElementsByClassName(): 通过类名选择document.getElementsByTagName(): 通过标签名选择document.querySelector(): CSS选择器document.querySelectorAll(): 多个元素选择
- 事件处理:
addEventListener(): 添加事件监听器- 事件类型: click, mouseover, keydown等
- 事件对象:
event.target,event.type - 事件冒泡与捕获
- 元素属性:
- 获取属性:
element.getAttribute() - 设置属性:
element.setAttribute() - 删除属性:
element.removeAttribute()
- 获取属性:
- 节点操作:
- 创建节点:
document.createElement() - 添加节点:
parentNode.appendChild() - 删除节点:
parentNode.removeChild() - 替换节点:
parentNode.replaceChild() - 克隆节点:
element.cloneNode()
- 创建节点:
代码示例:
// 选择器 + 事件 + 遍历
const box = document.querySelector('#id');
box.addEventListener('click', function() { /* ... */ });
for (let i = 0; i < list.length; i++) { /* ... */ }
// 自定义属性 / 扩展属性
data-name="new"
// 节点关系
元素.parentNode; // 父节点
元素.children; // 子元素集合
元素.nextElementSibling; // 下一个兄弟元素
元素.previousElementSibling; // 上一个兄弟元素
// 滚动 / 偏移量
元素.scrollTop; 元素.scrollLeft;
元素.offsetTop; 元素.offsetLeft;
BOM操作
- 窗口对象:
window对象: 全局对象alert(): 弹出警告框confirm(): 确认对话框prompt(): 输入对话框console.log(): 控制台输出
- 位置对象:
location对象: URL操作location.href: 获取或设置URLlocation.reload(): 刷新页面location.assign(): 加载新文档
- 历史对象:
history对象: 浏览历史history.back(): 后退history.forward(): 前进history.go(): 跳转到指定历史记录
- 浏览器检测:
navigator对象: 浏览器信息navigator.userAgent: 用户代理字符串- 设备检测: Android、iPhone等移动设备
代码示例:
// Window(全局) 与 DOM(document)
window.alert();
console.log();
var a = 1; // var 声明的全局变量属于 window
// location:操作地址栏
location.href; // 获取/设置地址,可用于跳转
// navigator:浏览器信息 + 移动端跳转
(function () {
const userAgent = navigator.userAgent;
// Android / iPhone 判断
const android = userAgent.match(/(Android);?[\s\/]+([\d.]+)?/);
const iphone = userAgent.match(/(iPhone\sOS)\s([\d_]+)/);
// 命中则跳转到移动端站点
if (android || iphone) {
location.href = 'http://m.itcast.cn';
}
})();
数据存储
- localStorage:
- 本地存储: 永久保存
localStorage.setItem(key, value): 设置值localStorage.getItem(key): 获取值localStorage.removeItem(key): 删除值localStorage.clear(): 清空所有
- sessionStorage:
- 会话存储: 页面关闭后清除
- 使用方法与localStorage类似
- Cookie:
- 客户端存储: 有过期时间
document.cookie: 读取和设置Cookie
代码示例:
// localStorage 三件套
localStorage.setItem(key, value); // 存
localStorage.getItem(key); // 取
localStorage.removeItem(key); // 删
// sessionStorage 用法相同,关闭页面后清除
正则表达式
- 基本语法:
- 字符类:
[abc],[^abc],\d,\w,\s - 量词:
*(0次或多次),+(1次或多次),?(0次或1次),{n},{n,},{n,m} - 分组:
() - 或:
|
- 字符类:
- 常用模式:
- 数字:
\d+ - 字母:
[a-zA-Z]+ - 邮箱:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ - 电话:
^1[3-9]\d{9}$
- 数字:
- 方法:
test(): 测试字符串是否匹配exec(): 执行搜索返回结果match(): 字符串方法,返回匹配数组replace(): 替换匹配内容search(): 搜索匹配位置
代码示例:
// 基本方法
regex.test(字符串); // 返回 true / false
regex.exec(字符串); // 匹配返回结果数组,否则 null
// 元字符
\d // 数字 0~9
[ ] // 字符集合
[^a-z] // 取反:非 a-z
. // 任意单个字符
// 修饰符
/i // 忽略大小写
/g // 全局匹配
Web开发技术
JDBC数据库操作
- 驱动加载:
Class.forName("com.mysql.jdbc.Driver"): 加载MySQL驱动
- 连接管理:
DriverManager.getConnection(): 获取数据库连接- 连接URL:
jdbc:mysql://localhost:3306/database_name
- SQL执行:
Statement: 执行静态SQLPreparedStatement: 执行预编译SQL,防止SQL注入CallableStatement: 调用存储过程
- 结果处理:
ResultSet: 结果集对象next(): 移动到下一行getInt(),getString(): 获取列值
- 事务管理:
conn.setAutoCommit(false): 关闭自动提交conn.commit(): 提交事务conn.rollback(): 回滚事务
- 连接池:
- DBCP, C3P0, Druid等连接池技术
代码示例:
// 1. 注册驱动(MySQL 默认端口 3306)
Class.forName("com.mysql.jdbc.Driver");
// url 格式:jdbc:mysql://ip:端口/数据库名
// 2. 获取连接 + 事务控制
conn.setAutoCommit(false);
conn.commit();
conn.rollback();
// 3. 预编译 SQL:? 占位,setXxx(位置从1开始, 值)
String sql = "UPDATE ... WHERE id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setXxx(1, 值); // 第1个 ?
pstmt.setXxx(2, 值); // 第2个 ?
// 执行:DDL/DML 用 executeUpdate();DQL 用 executeQuery()
// 4. 结果集遍历
ResultSet rs = stmt.executeQuery("...");
while (rs.next()) {
int id = rs.getInt("id"); // int 列
String name = rs.getString("name"); // String 列
}
// 5. 实体类 Account.java:字段 email、userId,提供 get/set/toString
附:MySQL 日志开启配置(my.ini)
log-output=FILE
general-log=1
general_log_file="D:\mysql.log"
slow-query-log=1
slow_query_log_file="D:\mysql_slow.log"
long_query_time=2
MyBatis框架
- 配置文件:
mybatis-config.xml: 主配置文件- 环境配置: development, production
- 数据源配置
- 映射器注册
- Mapper映射:
- XML映射文件: SQL语句定义
- 接口映射: Mapper接口
- 命名空间: 避免SQL ID冲突
- 动态SQL:
if标签: 条件判断choose-when-otherwise: 类似switch-caseforeach标签: 集合遍历where标签: 自动处理AND/ORset标签: 自动处理逗号
- 参数处理:
- 单个参数: 直接使用
- 多个参数:
@Param注解 - 对象参数: 属性映射
- 集合参数:
collection属性
- 结果映射:
resultType: 简单类型映射resultMap: 复杂类型映射- 列名与属性名映射
- 常用注解:
@Select: 查询@Insert: 插入@Update: 更新@Delete: 删除
代码示例:
<!-- 列名与属性名不一致:方式1 起别名 -->
<select id="selectAll" resultType="brand">
select id, brand_name as brandName, company_name as companyName,
ordered, description, status from tb_brand;
</select>
<!-- 方式3:resultMap 映射 -->
<mapper namespace="mapper.usersMapper">
<resultMap type="User" id="brandResultMap">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<select id="selectAll" resultMap="brandResultMap">
select * from tb_brand;
</select>
</mapper>
// Mapper 接口
public interface usersMapper {
User selectById(int id);
}
<!-- 多条件查询 -->
<select id="selectByCondition" resultMap="UserResultMap">
select * from tb_brand
where status = #{status}
and company_name like #{companyName}
and brand_name like #{brandName}
</select>
<!-- 动态 SQL:choose / when / otherwise 相当于 switch-case-default -->
<select id="selectByConditionSingle" resultMap="brandResultMap">
select * from tb_brand
<where>
<choose>
<when test="status != null">status = #{status}</when>
<when test="companyName != null and companyName != '' ">
company_name like #{companyName}
</when>
<when test="brandName != null and brandName != ''">
brand_name like #{brandName}
</when>
</choose>
</where>
</select>
<!-- 更新 -->
<update id="update" parameterType="pojo.User">
UPDATE tb_brand SET
brand_name = #{brandName},
company_name = #{companyName},
description = #{description},
status = #{status},
ordered = #{ordered}
WHERE id = #{id}
</update>
<!-- 删除单个 -->
<delete id="deleteById">
delete from tb_brand where id = #{id};
</delete>
<!-- 批量删除:foreach -->
<delete id="deleteByIds">
delete from tb_brand where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
;
</delete>
// 接口方法(@Param 指定集合参数名)
void deleteByIds(@Param("ids") int[] ids);
// 调用:数组参数 collection 用 array,多个参数时用 param1...
int[] id = {4, 7, 8};
usersMapper.deleteByIds(id);
// 注解方式(替代 XML)
@Select @Insert @Update @Delete
// MyBatis 测试类
public class Mybatisdemo {
public static void main(String[] args) throws Exception {
int id = 1;
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
usersMapper usersMapper = sqlSession.getMapper(usersMapper.class);
// List<User> users = usersMapper.selectAll();
User users = usersMapper.selectById(id);
System.out.println(users);
sqlSession.close();
// 输出:User [id=1, brandName=, companyName=, ordered=5, description=, status=0]
}
}
// 注意:openSession(false) 需手动 commit();openSession(true) 自动提交
Servlet技术
- 生命周期:
init(): 初始化方法service(): 服务方法doGet(),doPost(): HTTP方法处理destroy(): 销毁方法
- 请求处理:
HttpServletRequest: 请求对象HttpServletResponse: 响应对象- 请求参数获取:
getParameter() - 请求头获取:
getHeader()
- 会话管理:
HttpSession: 会话对象setAttribute(): 设置会话属性getAttribute(): 获取会话属性invalidate(): 使会话失效
- 过滤器:
Filter接口实现- 过滤器链
- 请求预处理和后处理
- 监听器:
ServletContextListener: 应用上下文监听HttpSessionListener: 会话监听ServletRequestListener: 请求监听
代码示例:
// 基础 Servlet 骨架
public class DemoServlet extends HttpServlet {
@Override
public void init() { /* 初始化 */ }
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
String param = req.getParameter("key"); // 获取请求参数
HttpSession session = req.getSession();
session.setAttribute("user", "tom"); // 会话存储
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
doGet(req, resp);
}
@Override
public void destroy() { /* 销毁 */ }
}
更多推荐


所有评论(0)