JavaEE知识体系详细知识点详细讲解
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连接池的使用
-
导入jar包:数据库驱动包,c3p0的jar包
-
提供配置文件:
-
文件名称:c3p0-config.xml
-
文件位置:类加载路径下(src下)
-
-
编写代码,使用连接池
ComboPooledDataSource dataSource = new ComboPooledDataSource();
Connection conn = dataSource.getConnectoin();
//使用conn操作数据库
conn.close();
4.2 druid连接池的使用
-
导入jar包:数据库驱动包,druid的jar包
-
提供配置文件
-
文件名称:xxx.properties
-
文件位置:建议放在类加载路径下
-
-
编写代码使用连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(Properties对象);
Connection conn = dataSource.getConnection();
//使用conn操作数据库
conn.close();
5. JdbcTemplate
5.1 使用步骤
-
导入jar包:数据库驱动包,连接池的jar包,JdbcTemplate的jar包
-
提供连接池的配置文件,和工具类JdbcUtils(工具类里提供了获取连接池对象的方法)
-
编写代码,使用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()
-
-
定时器:
-
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); } }
-
请求转发(是服务器内部的事,不牵扯浏览器,转发的时候请求好没有结束)
通过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技术的使用
-
创建一个Cookie对象
Cookie cookie = new Cookie(String name, String value);
-
设置Cookie的有效期
-
有效期:是Cookie存活到什么时候
-
默认情况下,有效期是一次会话期间(数据是在浏览器内存中保存的)
-
设置有效期:
cookie.setMaxAge(int seconds)
-
-
设置Cookie的有效范围
-
有效范围:只有在访问有效范围内的资源时,浏览器才会把Cookie携带到服务端
-
默认情况下,有效范围是 生成Cookie的资源上一层目录
-
设置有效范围:
cookie.setPath(String path)
-
-
把Cookie传递给客户端
-
response.addCookie(cookie)
-
-
接收客户端携带的Cookie数据
-
Cookie[] cookies = request.getCookies()
-
4.3 session技术的使用
-
得到一个session对象
-
HttpSession session = request.getSession()
-
什么时候是创建新的session:客户端没有JSESSIONID, 或者 服务端没有对应的session对象
-
什么时候是获取旧的session:客户端有JSESSIONID, 并且 服务端有对应的session对象
-
-
向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:{
规则:提示信息,
...,
规则:提示信息
}
}
});表单校验的规则
-
自定义错误信息的位置
<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)
-
参数说明:
-
url:请求地址,必须
-
params:提交的表单参数
-
callback:响应完成之后的回调函数
function(result){}
-
type:服务端响应的数据类型
text/json
-
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>
解析:
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:
-
解析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的方式
项目中图片项目讲解
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工具的使用
在上图只需要关注步骤和其中一些方法的作用即可。至于方法以及参数,不需要太过深究。结果都是通过用户层传过来的数据,调用dao层的方法来实现数据访的,最后将数据返还给用户。根据自己的需求而定。