欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaEE知识体系详细知识点详细讲解

程序员文章站 2022-05-04 16:23:08
...

JavaEE知识体系

idl的快捷方式:

查找:ctrl+F

快速显示文档和信息:ctrl+Q

抽取方法:ctrl+alt+M

修改:shift+F6

导入:ctrl+shift+alt+S

快捷键 英文说明 中文说明
Ctrl + Space Basic code completion (the name of any class, method or variable) 补全代码,由于经常与操作系统的输入法的切换冲突,所以实际很少用。一般直接在 idea 中开启输入自动补全机制。
Ctrl + Shift + Space Smart code completion (filters the list of methods and variables by expected type 在列出的可选项中只显示出你所输入的关键字最相关的信息。(常用)
Ctrl + Shift + Enter Complete statement 代码补全后,自动在代码末尾添加分号结束符
Ctrl + P Parameter info (within method call arguments) 在某个方法中,调用该按键后,会展示出这个方法的调用参数列表信息。
Ctrl + Q Quick documentation lookup 展示某个类或者方法的 API 说明文档
Ctrl + mouse over code Brief Info 跳进到某个类或者方法源代码中进行查看。(常用)
Alt + Insert Generate code… (Getters, Setters, Constructors, hashCode/equals, toString) 自动生成某个类的 Getters, Setters, Constructors, hashCode/equals, toString 等代码。(常用)
Ctrl + O Override methods 展示该类中所有覆盖或者实现的方法列表,注意这里是字母小写的 O!
Ctrl + Alt + T Surround with… (if..else,try..catch, for, synchronized, etc.) 自动生成具有环绕性质的代码,比如:if..else,try..catch, for, synchronized 等等,使用前要先选择好需要环绕的代码块。(常用)
Ctrl + / Comment/uncomment with line comment 对单行代码,添加或删除注释。分为两种情况:如果只是光标停留在某行,那么连续使用该快捷键,会不断注释掉下一行的代码;如果选定了某行代码(选定了某行代码一部分也算这种情况),那么连续使用该快捷键,会在添加或删除该行注释之间来回切换。(常用)
Ctrl + Shift + / Comment/uncomment with block comment 对代码块,添加或删除注释。它与 Ctrl + / 的区别是,它只会在代码块的开头与结尾添加注释符号!(常用)
Ctrl + W Select successively increasing code blocks 选中当前光标所在的代码块,多次触发,代码块会逐级变大。(常用)
Ctrl + Shift + W Decrease current selection to previous state 是 Ctrl + W 的反向操作,多次触发,代码块会逐级变小,最小变为光标。
Alt + Q Context info 展示包含当前光标所在代码的父节点信息,比如在 java 方法中调用,就会展示方法签名信息。
Alt + Enter Show intention actions and quick-fixes 展示当前当前光标所在代码,可以变化的扩展操作
Ctrl + Alt + L Reformat code 格式化代码 (常用)
Ctrl + Alt + O Optimize imports 去除没有实际用到的包,这在 java 类中特别有用。(常用)
Ctrl + Alt + I Auto-indent line(s) 按照缩进的设定,自动缩进所选择的代码段。
Tab / Shift + Tab Indent/unindent selected lines 缩进或者不缩进一次所选择的代码段。(常用)
Ctrl + X 或 Shift Delete Cut current line or selected block to clipboard 剪切当前代码。 (常用)
Ctrl + C 或 Ctrl + Insert Copy current line or selected block to clipboard 拷贝当前代码。 (常用)
Ctrl + V 或 Shift + Insert Paste from clipboard 粘贴之前剪切或拷贝的代码。(常用)
Ctrl + Shift + V Paste from recent buffers… 从之前的剪切或拷贝的代码历史记录中,选择现在需要粘贴的内容。(常用)
Ctrl + D Duplicate current line or selected block 复制当前选中的代码。(常用)
Ctrl + Y Delete line at caret 删除当前光标所在的代码行。(常用)
Ctrl + Shift + J Smart line join 把下一行的代码接续到当前的代码行。
Ctrl + Enter Smart line split 当前代码行与下一行代码之间插入一个空行,原来所在的光标不变。(常用)
Shift + Enter Start new line 当前代码行与下一行代码之间插入一个空行,原来光标现在处于新加的空行上。(常用)
Ctrl + Shift + U Toggle case for word at caret or selected block 所选择的内容进行大小写转换。。(常用)
Ctrl + Shift + ]/[ Select till code block end/start 从当前光标所在位置开始,一直选择到当前光标所在代码段起始或者结束位置。
Ctrl + Delete Delete to word end 删除从当前光标所在位置开始,直到这个单词的结尾的内容。
Ctrl + NumPad(+/-) Expand/collapse code block 展开或收缩代码段。 (常用)
Ctrl + Shift + NumPad(+) Expand all 展开所有代码段。
Ctrl + Shift + NumPad(-) Collapse all 收缩所有代码段。
Ctrl + F4 Close active editor tab 关闭当前标签页。
Shift + F6   修改名字。(常用)

一、数据库

Servlet的ResultInfo的固定步骤:

ResultInfo info=null;
try{
info=new ResultInfo(true,路径,"");
}catch(Exception e){
e.printStackTrace();
info = new ResultInfo(false, "系统忙,请稍候");
}
//把集合转换成json
ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(info);
        response.getWriter().print(json);

action

首先搞明白观念:你action返回的值 ajax是得不到的。ajax能得到的是你action里往前台输出的内容,也就是action往输出流里输出的内容,而不是返回值。如果lz想要得到action返回给ajax的内容,那么在action里要得到输出流,然后把要给ajax的东西给输出流。这样ajax端才能得到你输出的内容。

1. MySql管理

  • 启动服务:net start mysql

  • 关闭服务:net stop mysql

  • 登录MySql:mysql -u用户名 -p密码

2. SQL语句

SQL快捷键

在学习使用sqlyog的时候,想要多行注释SQL语句,就去网上找了相关的快捷键,与大家分享,网上有很多!

Ctrl+M 创建一个新的连接
Ctrl+N 使用当前设置新建连接
Ctrl+F4 断开当前连接

对象浏览器
F5 刷新对象浏览器(默认)
Ctrl+B 设置焦点于对象浏览器

SQL 窗口
Ctrl+T 新建查询编辑器
Ctrl+E 设置焦点于 SQL 窗口
Ctrl+Y 重做
Ctrl+Z 撤销
Ctrl+X 剪切
Ctrl+V 粘贴
Ctrl+H 替换
Ctrl+G 转到
Ctrl+O 在 SQL 窗口打开一个 SQL 文档
Ctrl+Shift+U 使选择内容大写
Ctrl+Shift+L 使选择内容小写
Ctrl+Shift+C 注释 SQL 窗口选择内容
Ctrl+Shift+R 从选择内容删除注释
Ctrl+Shift+T 插入模板
Ctrl+Enter 列出所有的标签
Ctrl+Space 列出匹配的标签

执行查询
F8 执行当前查询并编辑结果集
F9 执行当前查询(默认)
Ctrl+F9 执行选定查询(默认)
Shift+F9 执行全部查询(默认)

粘贴 SQL 语句
Alt+Shift+I 插入语句
Alt+Shift+U 更新语句
Alt+Shift+D 删除语句
Alt+Shift+S 选择语句

结果
F11 插入更新对话框
Ctrl+R 设置焦点于结果面板中的活动标签
Ctrl+L 切换结果窗口/表数据以表格/文本方式显示
Ctrl+Alt+C 以 CSV, SQL, Excel 等导出表数据
Ctrl+Alt+E 以 SQL 转储文件备份数据
Ctrl+Shift+M 从 CSV 导入数据
Ctrl+Shift+E 导出结果集
Alt+1…n 在结果窗口中选择第n个标签

显示/隐藏
Ctrl+1 显示/隐藏 对象浏览器
Ctrl+2 显示/隐藏 结果面板
Ctrl+3 显示/隐藏 查询窗口

数据库/数据表
Ctrl+D 创建数据库
F6 更改 数据库/数据表的结构/索引/视图/存储过程/函数/触发器/事件
F2 重命名 数据表/视图/触发器/事件
Shift+Del 截断 数据库/数据表
F7 管理索引窗口
F10 关联/外键
Ctrl+Alt+R 重新排序字段
Ctrl+Alt+T 数据表诊断
Ctrl+Alt+F 刷新对话框
Ctrl+Shift+Alt+S 以 HTML 格式创建数据库架构
Ctrl+Shift+Q 从 SQL 转储文件恢复数据库

增强工具
Ctrl+W 数据库同步向导
Ctrl+Q 架构同步工具
Ctrl+Alt+O 数据迁移工具包
Ctrl+Alt+N 通知服务向导
Ctrl+Alt+S 计划备份
Ctrl+K 查询创建器
Ctrl+Alt+D 架构设计器

用户管理
Ctrl+U 添加用户
Ctrl+Alt+U 编辑用户
Ctrl+Shift+W 管理用户权限

个人文件夹
Ctrl+Shift+F 添加当前 SQL 语句到个人文件夹

其它
F1 帮助
F12 快捷键窗口
Ctrl+C 复制
Ctrl+A 全选
Ctrl+F/F3 查找 (SQL 窗口/以文本方式显示的结果窗口和表数据)
Ctrl+S 保存
Ctrl+PgUp 切换到上一标签
Ctrl+PgDown 切换到下一标签
DEL 删除选定
Alt+L 关闭标签
Alt+F4 退出程序

2.1 DDL

2.1.1 操作database

-- 1.创建database
create database 数据库名;
-- 2.查看database
show databases;
show create database 数据库名;
-- 3.修改database
alter database 数据库名 character set 字符集
-- 4. 删除database
drop database 数据库名;
-- 5. 使用database
use 数据库名;
select database();

2.1.2 操作table

-- 1. 创建table
create table 表名称(
    字段名 类型 [约束],
   ...
   字段名 类型 [约束]
);
-- 2. 查看table
show tables;
show create table 表名称;
desc 表名称; -- 查看表结构
-- 3. 删除table
drop table 表名称;
-- 4. 修改table
-- 4.1 重命名表
rename table 表名称 to 新名称;
-- 4.2 添加字段
alter table 表名称 add 字段名 类型 [约束];
-- 4.3 修改字段类型
alter table 表名称 modify 字段名 新类型 [约束];
-- 4.4 修改字段名称
alter table 表名称 change 字段名 新字段名 类型 [约束];
-- 4.5 删除字符
alter table 表名称 drop 字段名;

2.2 DML

-- 1. 插入数据
insert into 表名称 (字段1, 字段2,...) values (值1,值2,...);
-- 2. 修改数据
update 表名称 set 字段1=值1, 字段2=值2,... where 条件;
-- 3. 删除数据
delete from 表名称 where 条件;

2.3 DQL

2.3.1 单表查询

-- 1.简单查询
select * from 表名称;
select 字段1,字段2,... from 表名称;
select ifnull(字段,默认值) from 表名称;
select 字段1+字段2, 字段3+100,... from 表名称;
select 字段1 as 别名1, 字段2 别名2 from 表名称;

-- 2.条件查询:>,<,>=,<=,=,<>,like, between...and..., in(),   and, or, not
select * from emp where salary > 5000;
select * from emp where ename like '张%'; -- %表示任意个任意字符; _表示一个任意字符
select * from emp where salary between 2000 and 10000;
select * from emp where dept_id in (10, 30);

-- 3.排序查询:order by 排序字段 排序规则    desc降序,asc升序
select * from emp order by age desc;

-- 4.聚合函数:聚合函数会忽略null值
select count(*) from emp;
select sum(salary) from emp;
select avg(salary) from emp;
select max(salary) from emp;
select min(salary) from emp;

-- 5.分组查询:group by 分组字段 having 分组后过滤条件
select dept_id, count(*) from emp group by dept_id having count(*) > 10;

-- 6.分页查询:limit 起始索引, 查询数量
select * from emp limit 0, 5;

2.3.2 多表查询

-- 1.内连接查询:查询表之间必定有关联的数据
select * from emp e, dept d where e.dept_id = d.id;
select * from emp e inner join dept d on e.dept_id = d.id;

-- 2.外连接查询:查询一张表的全部数据,及另外一张表的关联数据
select * from emp e left join dept d on e.dept_id = d.id;
select * from emp e right join dept d on e.dept_id = d.id;

-- 3.子查询:是查询技巧没有固定语法,是查询嵌套
select * from emp where salary = (select max(salary) from emp);
select * from dept where id in (select dept_id from emp where salary > 10000);
select * from dept d, (select * from emp where salary > 10000) t where d.id = t.dept_id;

2.4 DCL

-- 1. 创建用户
create user 'tom'@'%' identified by 'tom';
-- 2. 用户授权
grant all on *.* to 'tom'@'%';
-- 3. 查看权限
show grants for 'tom'@'%';
-- 4. 取消授权
revoke delete on *.* from 'tom'@'%';
-- 5. 删除用户
drop user 'tom'@'%';
-- 6. 修改密码
set password for 'tom'@'%' = password('1234');

2.5 TCL

-- 1. 开启事务
start transaction;  -- 或者  set autocommit = 0;
-- 2. 执行多条DML语句
-- ......
-- 3. 关闭事务:提交事务
commit;
-- 3. 关闭事务:回滚事务
rollback;

3. JDBC+预编译对象

//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection conn = DriverManager.getConnection("url","username","password");
//3.创建SQL执行平台
PreparedStatement pstmt = conn.prepareStatement("使用?处理过的sql语句");
pstmt.setXXX(参数序号, 参数值);
//4.执行SQL语句   executeUpdate(),  execute()
ResultSet rs = pstmt.executeQuery();
//5.处理结果
while(rs.next()){
   XXX value = rs.getXXX("字段名称");
}
//6.释放资源
rs.close();
pstmt.close();
conn.close();

4. 连接池

4.1 c3p0连接池的使用

  1. 导入jar包:数据库驱动包,c3p0的jar包

  2. 提供配置文件:

    • 文件名称:c3p0-config.xml

    • 文件位置:类加载路径下(src下)

  3. 编写代码,使用连接池

    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    Connection conn = dataSource.getConnectoin();
    //使用conn操作数据库
    conn.close();

4.2 druid连接池的使用

  1. 导入jar包:数据库驱动包,druid的jar包

  2. 提供配置文件

    • 文件名称:xxx.properties

    • 文件位置:建议放在类加载路径下

  3. 编写代码使用连接池

    DataSource dataSource = DruidDataSourceFactory.createDataSource(Properties对象);
    Connection conn = dataSource.getConnection();
    //使用conn操作数据库
    conn.close();

5. JdbcTemplate

5.1 使用步骤

  1. 导入jar包:数据库驱动包,连接池的jar包,JdbcTemplate的jar包

  2. 提供连接池的配置文件,和工具类JdbcUtils(工具类里提供了获取连接池对象的方法)

  3. 编写代码,使用JdbcTemplate执行SQL语句

    JdbcTemplate jdbcTemplate = new JdbcTemplate(JdbcUtils.getDataSource());
    //使用JdbcTemplate的不同方法,执行不同SQL语句

    4.query使用BeanPropertyRowMapper做映射返回对象

public <T> List<T> query(String sql, RowMapper<T> rowMapper)
执行查询语句,返回一个List集合,List中存放的是RowMapper指定类型的数据

案例实现

// query使用BeanPropertyRowMapper做映射返回对象
public static void test07() throws Exception {
JdbcTemplate jdbcTemplate = new JdbcTemplate(JdbcUtils.getDataSource());
// 查询数据的SQL语句
String sql = "SELECT * FROM product;";
List<Product> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>
(Product.class));
for (Product product : list) {
System.out.println(product);
}
}

5.2 常用方法

//1. 查询一个值,比如:查询表里的数量
Integer value = jdbcTemplate.queryForObject("sql", Integer.class, params);

//2. 查询多条数据,得到JavaBean的集合
List<JavaBean> list = jdbcTemplate.query("sql",new BeanPropertyRowMapper<>(JavaBean类名.class), params);

//3. 查询一条数据,得到一个JavaBean对象
JavaBean obj = jdbcTemplate.queryForObject("sql",new BeanPropertyRowMapper<>(JavaBean类名.class),params);

二、客户端

1. HTML

2. CSS

3. JavaScript

3.1 js的作用

  • 操作浏览器:使用bom对象

  • 操作网页(被jQuery封装简化了,代替掉了)

3.2 js的组成:

  • ECMAScript:基本语法规范

  • bom:浏览器对象模型,用于操作浏览器的

  • dom:文档对象模型,用于操作网页的

3.3 bom操作

3.3.1 window

  • 弹窗方法:

    • alert()

    • confirm()

    • prompt()

JavaEE知识体系详细知识点详细讲解

  • 定时器:

    • var timer = setInterval(fn, ms)

      • clearInterval(timer)

    • var timer = setTimeout(fn, ms)

      • clearTimeout(timer)

  • 全局函数

eval(string):把字符串作为js代码执行一次,把json格式的字符串转换成json对象

var str = "{....}";
var jsonObj = eval("(" + str + ")")

3.3.2 location

  • location.href = "网址"

  • location.reload()刷新当前页

3.3.3关于重定向和请求转发的问题讲解

  •  重定向

浏览器发起的请求已被服务器响应,该请求已经结束,但因为服务器给浏览器响应了一个重定向的链接,所有浏览器会自动在发一次给链接的请求,所以整个过程牵扯到了浏览器

只能通过response.sendRedirect("path");//response是HttpServletResponse的对象

注解:

重定向发了两次请求,且浏览器的地址栏发生变化,可以访问域外链接

转发是服务器内部的发生的,不会引起浏览器的二次请求,所以地址栏不会发生改变,但不能访问域外链接,且因为是一次的请求,所以内部传递数据。

通常为了提供访问速度等,一般采用转发

package com.itheima.servlet;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class demo8 extends HttpServlet {
 
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		this.getServletContext().getRequestDispatcher("path");//转发
		request.getRequestDispatcher("path");//转发
		response.sendRedirect("path");//重定向
	}
 
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
 
}

JavaEE知识体系详细知识点详细讲解

  • 请求转发(是服务器内部的事,不牵扯浏览器,转发的时候请求好没有结束)

通过request.getRequesDispatcher("path").forward(request,response);//resquest是HttpServletRquest的对象

或者通过调用:this.getServletContext().getRequestDispatcher("path").forward(request,response)来实现

4. Bootstrap

三、web核心

1. Servlet

1.1 Servlet的生命周期

  • 何时创建:默认第一次访问时,由Tomcat生成Servlet对象,会执行init方法

  • 何时销毁:服务器关闭时,销毁时会执行destroy方法

  • 每次访问必定会执行的方法:service方法

1.2 Servlet的创建方式

  • 继承httpServlet的方式

@WebServlet(urlPatterns="/demo")
public class DemoServlet extends HttpServlet{
   
    public void doGet(HttpServletRequest request, HttpServletResponse response){
        System.out.println("功能代码");
    }
   
    public void doPost(HttpServletRequest request, HttpServletResponse response){
        this.doGet(request, response);
    }
}

1.3 ServletContext对象

  • 是一个域对象

    • 由Servlet规范提供的,可以存取数据的对象。存储的数据在其作用范围里可以共享。

    • ServletContext的生命周期

      • 何时创建:服务器启动时

      • 何时销毁:服务器关闭时

      • 作用范围:整个web项目中

  • 可以获取项目里任意资源

    • 获取src里的资源:类加载器.getResourceAsStream("资源文件在src里的路径");

    • 获取web里的资源:servletContext.getResourceAsStream("资源文件在web里的路径");

2. response

2.1 操作响应行

  • 响应行的格式:协议版本 响应状态码

  • 操作响应状态码:response.setStatus(int code)

2.2 操作响应头

  • 响应头的格式:一行一个键值对,一个键值对是一个响应头,一次响应可以有多个响应头

  • 设置响应头:response.setHeader(String name, String value)

2.3 操作响应体

  • 本次响应的正文内容,会显示到浏览器的页面上

  • ==字符型:==

    response.setContentType("text/html;charset=utf-8");
    response.getWriter().print("会显示到浏览器页面上的内容");

  • 字节型:

    ServletOutputStream os = response.getOutputStream();

2.4 ==重定向跳转==

response.sendRedirect("/项目路径/资源路径");

3. request

3.1 获取请求行数据

  • 请求行的格式:请求方式 请求资源 协议版本

  • 获取请求方式:request.getMethod()

  • 获取项目路径:request.getContextPath()

3.2 获取请求头数据

  • 请求头的格式:一行一个键值对,一个键值对是一个请求头,一次请求可以有多个请求头

  • 获取请求头:request.getHeader(String name)

3.3 ==获取请求参数==

  • 获取单值的一个表单项:request.getParameter(String name)

  • 获取多值的一个表单项:request.getParameterValues(String name)

  • 获取所有的表单项:Map<String,String[]> map = request.getParameterMap()

  • 如果获取中文参数,只有POST乱码,get方式已经由Tomcat8帮我们解决了乱码问题

    request.setCharacterEncoding("utf-8");

3.4 是一个域对象

  • request域对象:

    • 何时创建:一次请求开始

    • 何时销毁:一次请求结束

    • 作用范围:一次请求中

3.5 ==可以实现请求转发跳转==

  • 方法:

    request.getRequestDispatcher("/资源路径").forward(request, response);

  • 请求转发和重定向的区别

    • 请求转发有1次请求;重定向有2次请求

    • 请求转发时地址栏不变;重定向进地址栏会变

    • 请求转发是服务端跳转;重定向是浏览器跳转

4. 会话技术

4.1 什么是会话技术

  • 会话技术:用来临时保存会话数据的技术,要求:

    • 一个会话内部,多次请求之间,数据要共享

    • 多个会话之间,数据相互独立互不干扰的

  • 会话技术有:

    • Cookie:客户端的会话技术

      • 优点:服务器压力小

      • 缺点:不安全

    • session:服务端的会话技术,依赖于Cookie

      • 优点:安全

      • 缺点:服务器压力大

4.2 Cookie技术的使用

  1. 创建一个Cookie对象

    Cookie cookie = new Cookie(String name, String value);

  2. 设置Cookie的有效期

    • 有效期:是Cookie存活到什么时候

    • 默认情况下,有效期是一次会话期间(数据是在浏览器内存中保存的)

    • 设置有效期:cookie.setMaxAge(int seconds)

  3. 设置Cookie的有效范围

    • 有效范围:只有在访问有效范围内的资源时,浏览器才会把Cookie携带到服务端

    • 默认情况下,有效范围是 生成Cookie的资源上一层目录

    • 设置有效范围:cookie.setPath(String path)

  4. 把Cookie传递给客户端

    • response.addCookie(cookie)

  5. 接收客户端携带的Cookie数据

    • Cookie[] cookies = request.getCookies()

4.3 session技术的使用

  1. 得到一个session对象

    • HttpSession session = request.getSession()

    • 什么时候是创建新的session:客户端没有JSESSIONID, 或者 服务端没有对应的session对象

    • 什么时候是获取旧的session:客户端有JSESSIONID, 并且 服务端有对应的session对象

  2. 向session对象里存取数据(是一个域对象)

    • 何时创建:一次会话开始

    • 何时销毁:一次会话结束

      • 服务器非正常关闭,session销毁

      • 会话超时,session自动销毁(默认30分钟)

      • 手动销毁:session.invalidate()

    • 作用范围:一次会话期间

5. 域对象总结

  • 域对象:由Servlet规范提供的,可以存储数据的对象。存取的数据在作用范围里可以共享

  • 域对象共同的存取数据的方法:

    • setAttribute(String name, Object value)

    • getAttribute(String name)

    • removeAttribute(String name)

  • 不同域对象,作用范围不同:

    • ServletContext:

      • 何时创建:服务器启动时

      • 何时销毁:服务器关闭时

      • 作用范围:整个web项目中

    • session:

      • 何时创建:一次会话开始

        客户端没有JSESSIONID,或者服务端没有session对象

      • 何时销毁:一次会话结果

        服务器非正常关闭、会话超时、手动销毁session.invalidate()

      • 作用范围:一次会话期间

    • request:

      • 何时创建:一次请求开始

      • 何时销毁:一次请求结束

      • 作用范围:一次请求中

    • pageContext:

      • 何时创建:一个JSP被访问时

      • 何时销毁:一个JSP被访问结束

      • 作用范围:一个JSP内部

  • 域对象使用原则:

    • 在满足要求的基础上,域对象越小越好

6. JSP/EL/JSTL

6.1 JSP

  • JSP的嵌套Java脚本:

    • <%=Java表达式 %>:用来把表达式结果输出显示到页面上

    • <% Java代码块 %>:用来写一些代码逻辑,比如:if、for循环

    • <%! Java声明 %>:用来声明一些成员方法、成员变量

  • JSP的注释:<%-- JSP注释内容 --%>

  • JSP的原理:

    • JSP必须要部署在服务器里,才可以运行。

    • JSP被服务器翻译成Servlet

    • 服务器把Sevlet编译成class文件

    • 访问JSP,本质是调用了Servlet的代码

6.2 EL

  • 用来代替JSP里:<%=Java表达式%>,用来向页面输出显示内容

  • 作用:

    • 从域里取数据,显示到页面上:${key[索引].key}

    • 数据运算:+-*/%, >,<,>=,<=,==,!=,&&,||,!, empty,三元运算

6.3 JSTL

  • 使用步骤:

    • 导入jar包

    • 在JSP里引入标签库

      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

  • 常用标签:

    • c:if用于判断

      <c:if test="使用EL表达式进行判断">
      如果判断为true,这里的内容会生效
      </c:if>

    • c:forEach用于循环遍历

      <c:forEach var="i" begin="1" end="10" step="1">
      ${i}
      </c:forEach>

      <c:forEach items="EL获取被循环遍历的对象" var="变量" varStatus="vs">
      ${变量},
          当前序号:${vs.count},
          当前索引:${vs.index}
      </c:forEach>

7. 使用JSP开发的模式

 

8. jQuery

  • 本质是js,简化了js的操作

  • 使用jQuery的方法只有两步:1.找到它(用选择器),2.操作它(用dom的方法)

8.1 选择器

  • 基本选择器:

    • $("div")

    • $("#div1")

    • $(".classname")

  • 层级选择器

    • $("div span"):后代选择器,选择div的后代span

    • $("div>span"):子选择器,选择div的子元素span

  • 属性选择器

    • $("input[type='text']"):选择type属性值为text的input标签

    • $("link[type]"):选择所有 包含type属性的link标签

    • $("a[href][target='_blank']"):复合属性选择器

  • 基本过滤选择器

    • :first, :last, :not(selector), :even, :odd, :eq(n), :lt(n), :gt(n), :header

  • 表单属性选择器

    • :enabled:获取可用的表单项(没有disabled属性的表单项)

    • :disabled:获取不可用的表单项(有disabled属性的表单项)

    • :checked:获取被选中的radio/checkbox

    • :selected:获取被选中的下拉选项option标签

8.2 dom操作方法

1. 操作标签体

  • html():获取标签体

  • html("html代码"):设置标签体,并且html代码会生效,是覆盖式设置

  • text():获取标签体里的文本

  • text("字符串"):设置文本字符串内容,如果有html代码也不会生效

2. 操作属性

  • attr(attrName)/prop(attrName):获取属性值

  • attr(attrName, attrValue)/prop(attrName, attrValue):设置属性值

  • removeAttr(attrName):删除属性

  • 注意:

    • 如果要获取checked和selected属性,必须使用prop的方法;

    • 其它属性操作优先使用attr方法,如果不行,再用prop的方法

3. 操作class属性

  • 添加class:addClass(类名)

  • 删除class:removeClass(类名)

  • 切换class:toggleClass(类名)

    • 如果标签上有此类名,就删除掉

    • 如果标签上没有此类名,就添加上

4. 操作样式:

  • css(cssName, cssValue):设置样式

  • css(cssName):获取样式

5. 操作表单项的值

  • val():获取表单项的值

  • val(v):设置表单项的值

  • 可以操作文本框、密码框、下拉框、文本域

6. 操作标签

  • $("<h1>创建一个标签h1</h1>"):创建标签

  • append(标签对象):把标签对象插入到 内部最后

  • 标签对象.appendTo():把标签对象插入到 内部最后

8.3 事件

  • 基本事件写法,和js区别:

    • 事件名称不带on

    • 事件是方法

    • 响应行为 是事件方法的实参

  • hover

    • hover(fn1,fn2):鼠标移入触发fn1,鼠标移出触发fn2

    • hover(fn):鼠标移入和移出共同触发fn

  • 事件绑定与解绑

    • 绑定事件:事件源.on("事件名称", fn)

    • 解绑事件:事件源.off("事件名称")

  • 未来元素事件:

    • 绑定事件:on函数

    $("ul").on("click","li",function(){
       
    });

    • 解绑事件:off函数

    $("ul").off("click","li");

8.4 循环遍历

  • js的循环遍历

    for(var i=0;i<10;i++){
        alert(i);
    }

    for(var item of items){
           
    }

  • jQuery的循环遍历

    $.each(被循环遍历对象, function(index, element){
        index:索引
        element:当前元素,可以使用this代替
    });

    jQuery对象.each(function(index,element){//循环jQuery对象自己
        index:索引
        element:当前元素,可以使用this代替
    });

    对JQuery的循环遍历

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="jquery-3.3.1.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
$(function(){
var $lis = $("#city li");
$lis.each(function(index,element){
alert(index+"--"+$(element).html());
});
});
</script>
</head>
<body>
<ul id="city">
<li>北京</li>
<li>上海</li>
<li>天津</li>
<li>重庆</li>
</ul>
</body>
</html>

8.5 表单校验插件

  • 使用步骤

    • 导入js文件:jQuery,插件的js文件

    • 基本语法:

      表单jQuery对象.validate({
          submitHandler:function(form){
              //表单校验通过之后,执行的函数。form:校验的那个表单
          },
          rules:{
              表单项name:{
                  规则:参数值,
                  ...,
                  规则:参数值
              }
          },
          messages:{
              表单项name:{
                  规则:提示信息,
                  ...,
                  规则:提示信息
              }
          }
      });

      表单校验的规则

      JavaEE知识体系详细知识点详细讲解

    • 自定义错误信息的位置

      <label class="error" for="表单项的name"></label>

    • 自定义校验规则

      $.validator.addMethod("规则名称",function(value, element, params){
          value:用户输入的值,要校验的值
          element:用户输入的那个表单项
          params:使用规则时,配置的规则参数
         
          如果校验通过,就返回true;否则返回false
      },"默认提示信息");

9. Ajax

9.1 jQuery的常用的Ajax方法

  • $.get(url, params, callback, type)

  • $.post(url, params, callback, type)

JavaEE知识体系详细知识点详细讲解

  • 参数说明:

    • url:请求地址,必须

    • params:提交的表单参数

    • callback:响应完成之后的回调函数function(result){}

    • type:服务端响应的数据类型text/json

JavaEE知识体系详细知识点详细讲解

9.2 jQuery的备用Ajax方法

  • $.ajax({key:value,key:value,...})

  • 配置项:

    • url:请求地址,必须

    • data:提交的表单参数

    • type:请求方式。get/post

    • dataType:服务端响应的数据类型text/json

    • success:响应成功之后的回调函数

    • async:是否异步

代码块演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Ajax请求方式代码</title>
    <script src="js/jquery-3.3.1.js" type="text/javascript" charset="UTF-8"></script>
    <script type="text/javascript">
        function sendRequest() {
            $.ajax({
                url:"demo03",
                async:true,
                data:"name=luliang&age=18",
                type:"GET",
                dataType:"text",
                success:function (data) {
                    alert(data);
                },
                error:function () {
                    alert("数据没有成功返回")
                }
            });
        }
    </script>
</head>
<body>
<input type="button" value="ajax的异步访问服务器" οnclick="sendRequest()">
</body>
</html>

解析:

JavaEE知识体系详细知识点详细讲解

10. json

关于json的固定的异常处理的Servlet的写法:

public void search(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ResultInfo info = null;
    try {
        //1.接收参数
        String cid = request.getParameter("cid");
        String rname = request.getParameter("rname");
        int pageNumber = 1;
        int pageSize = 8;
        String pageNumberStr = request.getParameter("pageNumber");
        if (pageNumberStr != null && !"".equals(pageNumberStr)) {
            pageNumber = Integer.parseInt(pageNumberStr);
        }

        //2.封装实体:略
        //3.完成功能
        PageBean<Route> pageBean = routeService.search(cid,rname, pageNumber,pageSize);

        //4.处理结果
        info = new ResultInfo(true, pageBean);
    } catch (Exception e) {
        e.printStackTrace();
        info = new ResultInfo(false, "系统忙,请稍候");
    }

    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(info);
    response.getWriter().print(json);
}

10.1 json的定义和解析(基本语法)

  • 定义json:

JavaEE知识体系详细知识点详细讲解

  • 解析json:

    • 数组[索引]

    • 对象.key

10.2 json转换工具

  • jackson把Java对象转换成json格式的字符串

  • 使用步骤:

    • 导入jar包

    • 编写代码:

      ObjectMapper mapper = new ObjectMapper();
      String json = mapper.writeValueAsString(Java对象);

11. 使用Ajax开发的模式

 

12. redis

12.1 字符串的操作命令

  • 设置:set key value

  • 获取:get key

  • 删除:del key

12.2 Jedis的基本操作

  • 导入jar包

  • 编写代码:

    Jedis jedis = new Jedis("ip", 端口);
    jedis操作数据库,方法名和命令名一样
    jedis.close()

12.3 Jedis的连接池使用

  • 导入jar包

  • 编写代码:

    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxTotal(50);
    config.setMaxIdle(5);

    JedisPool pool= new JedisPool(config, "ip", 端口);
    Jedis jedis = pool.getResource();
    使用jedis操作数据库
    jedis.close()

12.4 web项目里使用Redis的方式

项目中图片项目讲解

JavaEE知识体系详细知识点详细讲解

 

JavaEE知识体系详细知识点详细讲解

 

JavaEE知识体系详细知识点详细讲解

pageBean的分页工具

在开发中有时需要将数据库中的数据显示到页面中,数据中的数据又比较多,使用一页是显示不了的。此时需要在数据库中分页查询,然后分页显示在页面中。如果使用一个通用的分页工具类,会比较方便。只需在创建该类时传入每页显示的行数,总行数(数据库中的数据总行数),以及当前页码。就可以求出总页数,并且对传入的页码数进行判断。

PageBean代码

package com.book.Until;
 
import java.util.List;
 
/**
 * 分页工具类  泛型类
 * @param <T>
 */
public class PageBean<T> {
    private List<T> lists;// 存放  需要显示的 实体类数据
    private Integer pageNo = 1;// 当前页码数(默认给1)
    private Integer pageSize; // 每页显示的行数
    private Integer totalPage;// 总页数
    private Integer rows;// 总行数
 
    //对私有属性的封装    
    // 不需要对外提供totalPage总页数的set方法   因为totalPage是根据  总行数  和  每页显示的行数求出来的 
    public List<T> getLists() {
        return lists;
    }
    public void setLists(List<T> lists) {
        this.lists = lists;
    }
    public Integer getPageNo() {
        return pageNo;
    }
    public Integer getPageSize() {
        return pageSize;
    }
    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }
    public Integer getTotalPage() {
        return totalPage;
    }
    public Integer getRows() {
        return rows;
    }
 
    //设置有行数据 并求出页数
    public void setRows(Integer rows) {
        this.rows = rows;
        //页数      根据传入的 总行数 以及 每页显示的行数 求出总页数
        this.totalPage=rows % pageSize==0 ? rows/pageSize : (rows/pageSize+1);
    }
    //设置页码
    public void setPageNo(Integer pageNo) {
        //如果传入的页码为空 或者小于0  就默认给 1
        if (null == pageNo || pageNo < 0)
            this.pageNo = 1;
        //如果当前页码数>总页码数    就让 当前页码数 等于 最大页码数
        else if (pageNo > this.totalPage && this.totalpage> 0)
            this.pageNo = this.totalPage;
        //都符合条件 就让 当前页码数 等于 传入的页码数
        else
            this.pageNo = pageNo;
    }
}

Page工具的使用

JavaEE知识体系详细知识点详细讲解

在上图只需要关注步骤和其中一些方法的作用即可。至于方法以及参数,不需要太过深究。结果都是通过用户层传过来的数据,调用dao层的方法来实现数据访的,最后将数据返还给用户。根据自己的需求而定。