# javaweb-2022-2010
**Repository Path**: nieps/javaweb-2022-2010
## Basic Information
- **Project Name**: javaweb-2022-2010
- **Description**: 郑州理工javaweb 2010计网案例
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-03-03
- **Last Updated**: 2023-08-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# JavaWeb 课程设计
主讲: 牛肖宁
QQ: 3519973006
源码地址: https://gitee.com/nieps/javaweb-2022-2010
java的三个方向:
* javase java基础
* javaee 框架 ssm(spring springmvc mybaits ....)
> ssh spring + structs1 + mybatis/hibernate ...
>
> ssh spring + structs2 + mybatis/hibernate ...
spring boot
* javame
jsp:
> 动态技术 :
>
> asp --------升级 asp.net c#
>
> php lamp ==linux + apache+mysql+php
MVC
* m model 业务层 (业务逻辑)
* v view 视图层 jsp 显示数据
* c controller 控制层 (接收请求)
前后端分离
美工: UI设计师
前端工程师
## 网页开发基础
### HTML
> 小程序开发:
>
> wxml 小程序标记语言 -----html
>
> wxss 小程序样式表----css
>
> wxs 小程序脚本 ----javascript

#### head
设置与当前页面相关的信息 并不会显示
> 计算机最小存储单位: bit 位 存储的值为0或1
>
> 字节: byte 1个字节 8位 256个数字
编码 :
ascii码: 1个字节
> a ---- 97 (内码)
中国的编码规则:
gb2312 ----2个字节存储 256*256= 收集了常用的简体和繁体字
gbk ---gb2312的升级版 收录了很多不常用的字
unicode编码: 统一编码 万国码
utf-8 : 3个字节存储 256 *256 *256
> java 和javascript是什么关系 ? 没关系
#### 标签
* 单标签
>
>
>
* 双标签
> 有开始有结束的成对的标签
* 注释标签
>
>
> 不会显示在页面上,可以通过源码查看
#### 常用标签
##### 块元素
独占一行的元素
* div
* p 段落
* 列表元素
> 1. ol order list 有序列表
>
> > li list item 列表项
> >
> > ol中的type属性: 1 A I 用不同的符号表示顺序
>
> 2. ul unordered list 无序列表
>
> > li list item 列表项
> >
> > type:
> >
> > circle 空心圆
> >
> > disc 实心圆
> >
> > square 正方形
##### 行内元素
允许在一行出现的元素
* span
* a 超连接
> target属性值:
>
> 1. _self 默认值 连接在自身页面打开
> 2. _blank 在新的窗口打开
> 3. _parent 在父窗口打开
> 4. _top 在顶层窗口打开
> 5. 显示到指定的窗口上(通常是iframe的name值)
* input元素
> type属性值:
>
> 1. text 单行文本框
> 2. password 密码框
> 3. radio 单选框
> 4. checkbox 复选框
> 5. submit 提交按钮
> 6. .....
* form 表单
> 属性:
>
> 1. action 指明表单提交的地址
>
> 2. method 指明表单提交的方法
>
> > * get 请求 (是默认的请求)
> >
> > 特点:
> >
> > 1. 将参数显示在地址栏中
> > 2. 参数的格式: 参数名=参数值 多个参数之间用&符号隔开
> > 3. 不适用敏感数据的提交
> > 4. 地址栏的长度有限制
> >
> > * post 请求
> >
> > 特点:
> >
> > 1. 参数以formdata 表单数据传递 隐藏参数
> > 2. 适合提交大数据或敏感数据
* textarea 多行文本框
> 属性:
>
> 1. rows 显示多少行 设置的高度
> 2. cols 显示多少列 设置的宽度
> 3. style="resize: none;" 禁用自动缩放
> 4. 富文本编辑器 如百度ueditor
* 表格
> 1. table 代表表格
> 2. tr 定义一行的开始
> 3. td 定义一列的开始
### CSS
#### 使用方式
1. 行内样式
> 在元素上通过style属性来定义 样式
2. 内嵌式
> 在页面中通过标签来定义
3. 外链式
> 通过标签来引用
>
> 至少提供两个重要的属性:
>
> * href 指明外部样式的路径
> * rel 固定值 stylesheet 说明引用的是样式表
4. 导入式
~~~
~~~
#### css定义
语法:
~~~
选择器 {
属性名:属性值,
属性名:属性值,
....
}
~~~
选择器:
1. 元素选择器
> 也称为标签选择器 ,用html标签做为选择器 ,它会应用到所有的标签上
2. 类选择器
> .样式名
>
> 在html标签中通过属性class引用
3. id 选择器
4. 包含选择器
> (元素、类选择器、id选择器 ...) 后面跟上新的css选择器
5. "*" 统配符 所有的元素都应用
### JavaScript
node.js
> chrome 浏览器 v8引擎
>
> node.js是一个js运行环境 ,它里面包含了v8引擎
ECMAScript
es6 ecmascript 2015
#### 使用方式
1. 行内式 直接在元素上通过事件属性
2. 内嵌式
3. 外链式
#### 数据类型
* 基本数据类型
> 1. 字符串 String
> 2. 数字 Number
> 3. 布尔类型 true/false
> 4. null
> 5. undefined
> 6. Sybmol 独一无二 的 (es6新增的 )
* 引用数据类型
> 1. 对象 Object {} Date
> 2. 数组 Array
> 3. 函数 Function
变量: 是内存中的一块存储单元 ,操作变量就是操作变量所指向的空间中的值
>语法:
>
>var 变量名=变量值; //声明变量时赋值
>
>var 变量名; //只声明变量
>
>扩展: 在es6中新增两个声明语法
>
>* let 声明具有块作用域的变量
>* const 声明常量 的
js是弱类型语言,其类型由变量的值来决定
标识符:凡是自己可以命名的地方统称为标签符
变量名的组成:
* 变量名必须以字母 _ $ 开头
* 同时可以包含数字
* 变量名可以使用中文 (不建议使用 )
* 不能是js中的关键字
* 不能使用保留字 interface goto
驼峰命名法:
1. 小骆驼命名法 标识符由多个单词组成,第一个单词首字母小写,后面的单词首字母大小 如 userName
2. 大驼峰命名法 标识符由多个单词组成 每个单词首字母大写 如UserName
#### 运算符
##### 算术运算法
~~~
var x=1;
console.log("x=",x);
// ++ 在后,先赋值后运算
var y=x++;
console.log("x=",x," y=",y)//x= 2 y= 1
// ++ 在前 先运算后赋值
y=++x;
console.log("x=",x," y=",y)//x= 3 y= 3
// --在后 先赋值后运算
y=x--;
console.log("x=",x," y=",y)// x= 2 y= 3
//-- 在前 先运算后赋值
y=--x;
console.log("x=",x," y=",y)//x= 1 y= 1
~~~
##### 比较运算符
比较的结果是: true 或 false
##### 逻辑运算符
结果是: true 或 false
* && 逻辑与 两边的表达式为true,结果才为true
> 换句话: 只要有一个表达式为false,结果为false
>
> 特点: &&左边的表达式为false,则右边的表达式不再参与运算
>
> ~~~
> var x=5,y=7,a,b;
> //特点:
> console.log((a=x-2)<1&&(b=y+1)<3)
> console.log("a=",a," b=",b)//a= 3 b= undefined
> ~~~
* 逻辑或 || 两边的表达式只要有一个结果为true,结果就是true
> 换句话: 只有||两边的表达式结果同为false ,结果才为false
>
> 特点: 如果|| 左边的表达式为true ,则右边的表达式不再参与运算
>
> ~~~
> var x=5,y=7,a,b;
> //特点:
> console.log((a=x-2)>1 || (b=y+1)<3)
> console.log("a=",a," b=",b)//a= 3 b= undefined
> ~~~
* 逻辑非 ! 取反
##### 赋值运算符
= 赋值
> = 、 ==、=== 三个符号的区别?
算术运算符与=结合的运算符:
如: a+=b 等同于 a=a+b
##### 三元运算符
语法 :
~~~
条件表达式 ? 表达式1 : 表达式2
如果条件表达式的值为true,最终结果取表达式1,否则取表达式2
~~~
#### 条件判断语句
##### if语句
1. if (expression) {}
2. if else
~~~
if (表达式){
//表达式=true
}else{
//表达式=false
}
~~~
3. if /else if /else
##### switch语句
适合多重分支 语句
语法 :
~~~~
switch(表达式){
case 1:
....
break;
case 2:
....
break;
default:
....
}
~~~~
思考作业: 使用switch 语句 ,结合 算术运算符 、Math对象里的函数,实现成绩的优良中差判断
#### DOM操作
> dom document object modal 文档对象模型
dom操作html元素
* 创建html元素 (设置属性值 )
* 获取html元素 (读取或更改属性值)
##### 常用方法
* document.getElementById("元素的id值") 查找页面中的某个元素
* document.querySelector("css选择器")
* document.getElementsByName 根据相同的name值获取多个元素
#### BOM
> brower object modal 浏览器对象模型
window对象: 全局对象 可以直接调用 window对象上的属性和方法
window对象的属性:
* document 文档 对象
* Location 地址栏对象 (可以实现页面跳转、或者读取解析地址栏的url地址如协议、主机、资源路径等待 )
* Navigator 浏览器对象
* Screen 获取屏幕相关的信息
* History 历史对象 (记录你的访问历史,可以实现前进、后退功能 )
##### 加载事件
* onload 页面加载(包含dom结构、图片、css\js等资源)完毕 触发事件
* DOMContentLoaded
~~~
document.addEventListener("DOMContentLoaded",function(){
console.log("---dom加载完毕-------")
})
~~~
#### 函数
语法 :
~~~
function 函数名(参数...){
//要执行的一系列js语句
}
~~~
> 延伸:
>
> 定义方式:
>
> 1. 声明式函数 (上面) 它不会自动执行,必须经过调用才会执行
>
> 2. 表达式函数
>
> ~~~
> var f= funcion(){} //函数常量值 匿名函数
> //引用
> f()
> ~~~
##### 事件处理
作业: 用Js实现一个时钟的功能 (实时显示几点几分几秒)
> 参考:
>
> 北京时间: 17:44:36
>
> 用到的:
>
> Date 对象
>
> setInterval 函数 定时器
## Java Web 概述
### XML :
EXtensible Markup Language 可扩展的标记语言
使用:
1. 应用于不同应用之间的数据交互 (传递数据的一种格式)
2. 应用配置 (一种数据格式的描述)
> html hyper text markup language
>
> json 替换xml
eclipse (IDEA)
### 语法
#### 文档声明
~~~
~~~
> version 是必须的属性
* 元素 元素的名称可以自定义 默认成对出现
> 如果一个元素没有子元素,可以设置为空元素 如: <元素/>
* 属性 对元素的说明
* 注释 一种辅助
约束:
* dtd
* schema
### DTD
Document Type Definition
是一种xml格式约束的语言
语法规则
dtd的引入:
* 本地的dtd
~~~
~~~

* 公开的dtd
~~~
~~~
dtd本地引入:

~~~
中国
河南省
郑州
开封
~~~
dtd约束语法 :
#### 元素定义
> 语法:
>
> ~~~
>
> ~~~
>
> 元素内容:
>
> 1. #PCDATA (parsed character data) 元素的内容是字符串
> 2. 子元素 用()将要包含的元素括起来(多个元素之间用逗号隔开)
> 3. 混合数据 既可以包含子元素也可以包含文本数据 (#PCDATA|子元素名称)
> 4. EMPTY 空元素 既不包含字符数据 也不包含子元素
> 5. ANY 可以包含任意字符和子元素 (不建议使用)
符号:
* ? 出现0次或1次 最多出现一次
* ~~~
* 代表可以出现任意次
~~~
* ~~~
+ 表示最少出到1 次
~~~
* | 表示在列出的对象中选择1个
* , 表示对象按照指定的顺序出现
* () 对元素进行分组
#### 属性定义
attribute 属性
~~~
~~~
##### 设置说明
* #REQUIRED 必须的
* #IMPLIED 可以有也可以没有
* #FIXED 固定的值 ,后面提供的固定值 用""引起来
* 默认值 默认值 用""引起来
##### 属性类型
* CDATA 字符数据
* Enermerated 枚举类型
* ID 要求属性的值必须是唯一的
* IDREF 引用一个存在的id值
### Schema 约束
dtd的升级版本
基于xml的验证
名称空间: 命名空间 绑定一个对应的空间uri 上
语法:
~~~
<元素名 xmlns:prefixname="uri" >
~~~

作业: 定义一个dtd文档,要求定义一个班级做为根元素,下面有允许 有多个学生,每个学生记录(名称、性别、电话、年龄) ,引用 dtd 验证xml文件
#### 名称空间
#### 语法
~~~
<元素名 xmlns:prfiexName="URI" >
~~~
### 文档格式
~~~
~~~
### schemal引入方式
1. xsi:schemalLocation 引入
~~~
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
~~~
> xsi:schemaLocation="{namespace} {location }"
2. xsi:noNamespaceSchemalLocation 引入本地的schemal 文件
快捷键: ctrl+shift+<

### Schemal语法
##### 1 元素定义
语法
~~~
~~~
type:


常用类型
* string 字符串
* decimal 小数
* integer 整数 .....
##### 2 属性定义
~~~
~~~
##### 3 简单类型
只包含字符串数据
~~~
~~~
* 限定值 的范围
* 枚举
* 空白处理
* 模式匹配 正则表达式 (Pattern Mather )

##### 4 复杂类型
可以包含子元素和属性的元素
~~~
~~~
###### 属性
~~~
~~~
###### 子元素
~~~
~~~
###### 包含文本元素
dtd #PCDATA
~~~
~~~
###### 包含元素和文本元素
~~~
~~~
作业: 使用schemal定义 商品列表
提示:根元素 goodslist
商品项: goods
商品的名称 价格 数量 售价等信息
### 程序开发体系
两种结构:
C/S client server 客户端服务器
B/S brower server 浏览器服务器
swing 组件 awt组件
tomcat 服务器 Servlet容器
> jboss
jdk 8
解压既可使用前提jdk环境正常
代表本机的地址:
localhost
127.0.0.1
## HTTP协议
HyperText Transfer Protocol 超文本传输协议
ftp://
pop:邮箱协议
### 邮件协议POP3/IMAP/SMTP
http是一种请求响应的协议
http协议特点:
* 支持客户端/服务器
* 简单快速
* 灵活
* 无状态
协议版本:
* http0.9 1990
* http1.0 1996
>
>
>1. tcp 连接 (3次握手)
>2. 发送请求
>3. 响应
>4. 关闭tcp
* http 1.1 1997
长连接
> 1. tcp 连接 (3次握手)
>
> 2. 发送请求
>
> 3. 响应
>
> 。。。。。。。。
>
> 4. 关闭tcp
http: 默认的端口号是80
https: 默认的端口号是443
### http请求消息
完整的请求
* 请求行
>
* 请求头
* 实体内容
请求方法:
* get
> 特点:
>
> 参数显示在地址栏 ,格式:、
>
> ~~~
> url?参数名=参数值&参数名=参数值
> ~~~
>
> 地址栏长度是有限制的:
>
> 
>
>
* post
> 参数不会显示在地址栏中
>
> 可以传大量的数据
>
> 可以传二进制数据
#### 请求头
向服务器发送的附加消息




### HTTP响应消息
响应状态行:
* http版本号
* 状态码、文本信息

响应头




## Servlet技术
静态web 资源 :html css js 图片 ...
动态web资源 : 交互
技术 :
* asp -----> .net
* jsp -----sun(最初退出servlet-----jsp(先将jsp生成servlet类型的java文件 ,编译运行))
* php (做网站 、) lamp ===> linux+ apahce + mysql +php
> 使用html与脚本混合的形式编写
>
> <% %>
什么是servlet?
* servlet是服务器端的小程序 (java类、本向的实例化与运行,由serlvet容器来处理)
* 封装了对http请求的处理
正常的请求:
客户端请求----->http服务器(只解析静态html资源 apache ngnix)---->servlet容器(实例化servlet\处理请求、处理请求路径与servlet之间的映射关系 )
tomcat(实现了http服务器的功能和servlet容器的功能 )
### 特点
* 功能强大
* 可移植
* 性能高效
* 安全性高
* 可扩展 (面向接口开发 )
spring mvc (DispatcherServlet 核心拦截器 它本身就是一个servlet)
structs1 框架: ActionServlet
Servlet接口: (功能和常量 的集合 )
### 创建web工程


### 引入servlet-api
1. 直接引用本地的jar包



2、通过maven引入依赖
到mvn仓库去查找依赖:
https://mvnrepository.com/
在pom.xml文件中增加如下依赖:
~~~
javax.servlet
javax.servlet-api
4.0.1
provided
~~~
### servlet接口


### servlet定义
#### 通过注解的形式映射
@WebServlet
> 在servlet3.0之后出现的
参数描述:

#### 通过xml映射来实现
在WEB-INF/web.xml里配置
##### servlet3.0之前

~~~
hello02Servlet
com.by.day01.Hello02Servlet
hello02Servlet
/hello2
~~~
### Servlet生命周期
分为三个阶段
* 初始化阶段
> 对象的创建 ----init方法的调用
>
> 对象创建的时间:
>
> 1. 在访问的时候创建
>
> 2. 在servlet容器启动时创建
>
> 
* 运行阶段
* 销毁阶段
服务器关闭或web应用被移除servlet容器时,servlet对象也会随着移除并销毁
执行销毁方法 释放资源

### ServletConfig接口

### ServletContext接口
* 封装当前web应用所有的信息
* 实现多个servlet之间数据共享
#### 配置整个应用程序 的初始化参数
~~~
username
root
password
123456
~~~
~~~
//获取整个应用的初始 参数
//获取ServletContext对象
ServletContext sc=config.getServletContext();
System.out.println("用户名>>>>"+sc.getInitParameter("username"));
System.out.println("密码>>>>>"+sc.getInitParameter("password"));
~~~
#### 实现多个servlet对象之间的数据共享

作业:
实现 登录servlet,如果用户是admin/123456 提示用户登录 成功,否则提示失败
(登录页面参照案例)
#### 读取web应用下的资源文件

方法:
* **getRealPath** 获取服务器资源路径 (掌握 )
* **getResourceAsStream** 将服务器资源转化输入流 (掌握 )
* getResource (了解)
* getResourcePaths (了解)
### HttpServletResponse对象
是一个接口
接口是功能(抽象方法)和常量 的集合
发送响应状态码 (一般情况 不需要设置响应状态码 交给服务器 )
* setStatus
* sendError
发送响应头
* addHeader 添加同名的响应头字段 (允许响应头中 同名的有多个)
* setHeader 覆盖同名字段
* addIntHeader
* setIntHeader 设置数字类型的响应头
* setContentType 设置响应内容类型及编码 (重要)
> 解决乱码方案一(推荐)
>
> resp.setContentType ("text/html,charset=utf-8")
* setCharacterEncoding 设置响应编码的 (了解 必须跟系统的默认编码一致 才不会乱码
> 解决乱码方案二
>
> resp.setCharacterEncoding("utf-8");
>
> resp.setHeader("Content-Type","text/html,charset=utf-8")
响应方法
* getWrite 字符流 1 char=2byte 直接输出字符串的内容
* getOutputStream 字节流 1byte 以二进制格式输出
#### 请求重定向
sendRedirect 重定向
### HttpServletRequest对象
#### 请求行相关信息

#### 获取请求头
* getHeader (重要) 获取指定请求头参数 token
* getIntHeader
* getDateHeader
* getHeaders
* getHeaderNames
* getContentType
* getCharacterEncoding
### 获取请求参数(重要)
* getParameter 获取指定参数的值 (重要)
* getParameterValues 获取一个参数多个值的情况(重要)
* setCharacterEncoding 设置请求编码 用于解决获取中文乱码问题(重要)
~~~
req.setCharacterEncoding("UTF-8");
~~~
* getParameterMap 获取所有参数封装成map (二次封装) (了解)
* getParameterNames 获取所有的参数名称(了解)
### 通过Request对象传递数据
设置到request里的数据,只有在同一请求链中才能获取 !!!
操作属性方法:
* setAttribute(String name,Object o) 将对象o存储到属性name里
* getAttribute(String name) 获取属性值
* removeAttribute(String name) 删除属性
* getAttributeNames () 获取所有属性名称
### 请求转发
RequestDispatcher 对象 ,该对象封装了路径所指定的资源
* 表单提交过来的
* request.setAttribute设置的属性
* 路径参数 url?参数名=参数值
方法:
~~~
forward(req,resp) 将请求传递给其它web资源(serlvet/jsp ...)
~~~
~~~
jsp本质也是servlet
~~~
> jsp内置对象
jsp: 表达式 语法:
~~~
<%= 表达式 %>
~~~
jsp脚本请求:(允许在jsp中写java代码)
~~~
<%
....写java代码
%>
~~~
## 会话及会话技术
html5---本地存储技术:localStorage /sessionStorage
Cookie(生命周期)-----------localStorage 存储在缓存中(缓存不清理 一直存在)
session ------ sessionStorage 会话 (浏览器关闭了 会话结束)
前后端分离开发: 使用token 令牌技术
客户端(浏览器) 记录了你的身份信息(用户id 用户名称 。。。)
### Cookie对象
* 存储在客户端的
~~~java
BIDUPSID=EE6940D471EA8B6E871B21159A43A6C8; PSTM=1647157413; BAIDUID=EE6940D471EA8B6E8C36B646CFE92669:FG=1; BD_UPN=12314753; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BAIDUID_BFESS=EE6940D471EA8B6E8C36B646CFE92669:FG=1; baikeVisitId=3b37c10c-984d-472e-b1b7-b0e9a482450b; COOKIE_SESSION=47659_1_9_9_5_14_1_1_8_7_0_0_17494_0_0_0_1650348764_1650456617_1650504266|9#1811896_10_1650456607|4; RT="z=1&dm=baidu.com&si=bs745irsr6&ss=l28bmjk2&sl=5&tt=2uh&bcn=https://fclog.baidu.com/log/weirwood?type=perf&ld=4hh&ul=1sq76&hd=1sqax"; BD_HOME=1; H_PS_PSSID=35837_36019_34812_36166_34584_36120_36074_36324_36126_36297_36232_26350_36303_36061; BA_HECTOR=aga08gag0l250k840t1h628t20r
~~~

### Cookie API

方法:
* setPath 设置cookie的有效的访问路径 ,只有请求的路径是指定路径及其子路径,浏览器才会带上cookike信息
* setDomain 设置浏览器访问的域名,只有指定 的域名访问服务器,浏览器才 会带上cookie信息
### Session对象
将会话数据保存到服务器上。
> 受限于服务器资源
当访问:
* jsp
* servlet
servlet容器就会创建一个session对象 一个id属性(JSESSIONID=...)
### Session API
~~~
javax.servlet.http.HttpSession
~~~


重要方法:
* setAttribute(String name,Object o) 将对象o与属性name关联后存储到相关的session 中
* getAttribute(String name) 获取属性值从当前session中
* removeAttribute(String name)移除
模拟用户登录功能
### Session生命周期
* session 生效
> 第一次访问jsp/servlet等程序里才会创建session
* session失效
两种方式:
1. 配置服务器超时限制
> * servlet容器默认配置:
>
> 
>
> 可以在应用的web.xml中重写默认配置:
>
> 时间:
>
> 1. 正值 代表有效时间
> 2. 0或负值 表示session永不超时
>
> ~~~xml
>
>
> 60
>
> ~~~
* session api 设置
>~~~
>session.setMaxInactiveInterval();
>~~~
>
>设置session默认超时时间间隔 单位 秒
2. 使用session api中的invalidate方法,强制session对象失效
~~~java
session.invalidate();
~~~
作业: 完善上面的购物车功能,要求用户必须登录后,才能购买,如果用户点击购买时,没有登录,跳转到登录页面,登录成功后进入商品列表。
提示:
从session中获取用户user ,如果存在,认为登录过,否则没有登录,则去登录(用户admin/123456是正确的),登录成功后,可以购买。
# JSP技术
## 介绍
jsp: java server pages java服务器页面
html与java代码共存
jsp最终会被编译成servlet,用于处理用户请求 。
## 特征
* 跨平台
> jvm
* 业务代码相分离
* 组件重要
* 预编译
## JSP运行原理
1. 第一次访问jsp时 会由jsp容器先将jsp生成servlet
2. 由容器编译servlet成class 文件
3. 解释执行class文件 用容器对用户请求做出响应
## JSP语法
### jsp页面组成
* 指令标识
* html代码
* javascript
* java代码
* 注释
* JSP动作标识
### JSP脚本元素
语法:
~~~jsp
<%
java代码
%>
~~~
脚本中的代码最终会生成对应servlet的service方法中。
jsp页面输出流: JspWriter , Jsp内置该类的对象 out
引入maven依赖:
~~~xml
javax.servlet.jsp
jsp-api
2.2
provided
~~~
### 声明标识
如同在java在声明成员变量 ,成员方法等
语法:
~~~
<%!
java变量或方法
%>
~~~
声明的变量或方法 必须引用或调用
### JSP表达式
用于向页面输出信息
语法:
~~~
<%= 表达式 %>
~~~
注意:<%= 中间不能有空格
## JSP注释
脚本中的注释
* 单行注释 //
* 多行注释 /* 注释的内容 */
* 文档注释 /** */ 同样适用于声明语句
对比:
html注释:
~~~
~~~
隐藏注释:
~~~
<%-- jsp隐藏注释 页面不渲染 ,源码不可见 更安全 --%>
~~~
动态注释:
在html注释语法中 应用jsp脚本
~~~
~~~
## JSP指令
三个指令:
* page 设置页面的
* include 将其它页面包含到当前页面
* taglib 引入jstl标签的
### page指令
语法:
~~~
<%@ page 属性="值" ... %>
~~~

### include指令
通过该指令包含其它页面。它将被包含的页面的代码原封不动的嵌入到当前当面,最终生成一个servlet
语法:
~~~
<%@ include file="要引用的文件地址" %>
~~~
## JSP动作指令
### jsp:include 包含
引入其它页面
语法:
~~~
~~~
将被包含页面编译处理后的结果包含在当前面中。
对比:
* include指令 是将页面的内容写入到当前的页面中 ,与当前页面成为一个整体,生成一个java文件
> 
jsp:include 被包含的页面同样会生成java文件,会编译 ,然后将结果包含到当前页面

项目考核: 一旦重复全部视为0分
### jsp:forward 请求转发
> 在request中请求转发:
>
> ~~~
> RequestDispatcher dispatcher=req.getRequestDispatcher("/要转发的请求地址")
> dispatcher.forward(req,resp)
> ~~~
>
>
语法:
~~~
~~~

## jsp隐式对象
面试题: jsp的内置对象有哪些?
有9个内置对象,分别是:
### out
~~~
javax.servlet.jsp.JspWriter
~~~
页面输出流 ,用于输出jsp页面中的表达式
> io流按方向分为:
>
> 输入流 读
>
> 输出流 写
>
> 按单位分为字节流 和字符流
>
> 字节流:以Stream结尾
>
> InputStream 输入流 读
>
> OutputStream 输出流 写
>
> 字符流:以Reader/Writer结尾
>
> xxxReader 输入流 读
>
> xxxWriter 输出流 写
### request
~~~
javax.servlet.http.HttpServletRequest
~~~
### response
~~~
javax.servlet.http.HttpServletResponse
~~~
### config
在servlet中 init方法 里 获取配置信息
~~~
javax.servlet.ServletConfig
~~~
### application
用于多个servlet(jsp) 共享数据 属于全局作用域
~~~
javax.servlet.ServletContext
~~~
### sessoin
代表会话
~~~
javax.servlet.http.HttpSession
~~~
### page
指jsp转换为servlet后的实例 类似于java中的this
### pageContext
jsp的页面容器 页面级的作用域
~~~
javax.servlet.jsp.PageContext
~~~
### exception
代表页面异常对象 只有jsp页面的isErrorPage="true" 时才会有
根据作用域不同,jsp内置对象作用域从小到大排序:
pageContext(页面级)-->request(请求链)-->session(会话)-->application(整个应用 全局)
以上都可以在对应作用域中保存获取删除属性 (相当于定义变量)
pageContext可以获取其它8个内置对象:

# EL和JSTL
## EL
Expression Language 表达式语言 jsp2.0引入的新内容
语法:
~~~
${表达式}
~~~
访问的属性作用域: pageContext--request---session--application
标识符:
凡是可以自己命名的,都是标识符: 变量名 方法 名 类名....
建议:尽量遵循java标识符组成:
字母 数字 下划线 $
不能以数字开头
and or gt(greater then ) ge lt le
and==&&
or == ||
gt >
注意:
java中整数默认是int 类型
小数默认是double类型
### 访问数据
* . 运算符 访问javabean中的属性 map中的key
* 中括号运算符 [] 访问对象的属性 map中的key 数组 list 下标访问时
### 运算符
* 算术运算符
* 比较运算符
> ~~~
> == eq (equal)
>
> != ne (not equal)
>
> < lt letter then
>
> > gt
> <= le
> >= ge
> ~~~
* 逻辑运算符
~~~
&& and 两边同时为true结果才为true
|| or 只要有一个为true结果为true
! not 取反
~~~
* empty 运算符
判断变量是否为空
~~~
${empty expression} 表达式不存在 返回true 存在返回false
~~~
* 条件运算符
~~~
${ 条件?表达式1:表达式2}
~~~
* ()运算符
### 隐式对象
* pageContext -------对应jsp内置pageContext
* pageScope------------page 页面作用域 读取 pageContext中的属性
* requestScope---------request
* sessionScope----------session
* applicationScope-----application
> 以上4个xxxScope 代表保存属性的map对象 ,你可以理解为它们都是map 访问里的里属性 ${pageScope.属性名}
* param 保存请求参数的map对象
> request.getParamer 类似于
* paramValues 保存所有请求参数的map对象 将一个参数的多个值封装成数组
> 类似于request.getParamerMap
* header 保存所有请求头的map对象
> 类似于request.getHeaders
* headerValues 保存所有请求头的map对象 返回字符串数组
* cookie 获取cookie的map对象
* initParam 保存所有应用 的初始化参数map对象
默认情况下:el表达式取相同变量值的顺序:
page----request----session----application
## JSTLT
* 是一个开放源代码的标签库
分类:
* 核心标签库 c标签
* 国际化/格式化标签 fmt标签
* sql标签库 sql标签
* xml标签库 xml标签
* 函数标签库 fn标签
### tomcat官网下载


### maven下载
~~~xml
org.apache.taglibs
taglibs-standard-impl
1.2.5
runtime
org.apache.taglibs
taglibs-standard-spec
1.2.5
org.apache.taglibs
taglibs-standard-jstlel
1.2.5
org.apache.taglibs
taglibs-standard-compat
1.2.5
~~~


~~~
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
~~~
分析c标签:
~~~xml
Like <%= ... >, but for expressions.
out
org.apache.taglibs.standard.tag.rt.core.OutTag
JSP
Expression to be evaluated.
value
true
true
Default value if the resulting value is null.
default
false
true
Determines whether characters <,>,&,'," in the
resulting string should be converted to their
corresponding character entity codes. Default value is
true.
escapeXml
false
true
~~~
> Like <%= ... >, but for expressions. ==== <%= %>
>
> 字符实体:
>
> ~~~
> < <
> ~~~
>
>
### jakarat组织
> https://attic.apache.org/projects/jakarta-taglibs.html

解压:

maven依赖:
~~~xml
javax.servlet.jsp.jstl
jstl
1.2
taglibs
standard
1.1.2
~~~
### Core标签库
##### 表达式标签
* c:out 标签
> 作用: <%= %>
>
> ${}
>
> 标签属性:
>
> * value 要计算的表达式
>
> * defaultValue 如果计算表达式为null 输出的默认值
>
> * escapeXML 是否将< >等特殊符号进行转码后输出 ,如 字符实体
>
> ~~~
> < 默认不转码 直接输出<
> escapeXML=false 输出 <
> ~~~
>
>
##### 定义变量
* c:set标签 定义变量
> 属性
>
> * var 变量名
>
> * value 表达式
>
> * scope 变量的作用域
>
> 
* c:remote 移除变量
> 属性
>
> * var 要删除的变量
> * scope 要删除的指定作用域中的变量
##### 流程控制
* c:if标签
> 属性:
>
> test 接收表达式 为true 执行标签体内的内容
* c:choose c:when c:otherwise 标签
~~~xml
page中的name已删除
page中的name未删除
~~~
##### 循环标签
* c:forEach
> 便利集合
>
> ```
> varStatus="sta"
> sta.index 索引 从0开始
> sta.count 从1开始
>
> ```

动手做:
定义一个List 存放字符串 ,使用forEach遍历
作业:模拟商品列表,在jsp页面显示,及购买
要求:
1. servlet模拟数据
2. jstl 标签的使用
3. el的使用
MVC:
M 模型 业务层
V 视图 jsp 用来显示数据的
C 控制器 接收用户的请求 调用业务逻辑(M) 根据业务逻辑返回的结果 跳转到相应的视图上
jsp+servlet
servlet:
访问时创建
启动时创建
servlet创建时执行init方法