# 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 ![image-20220303145142647](assets/image-20220303145142647.png) #### 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 ~~~ ~~~ ![image-20220317153530818](assets/image-20220317153530818.png) * 公开的dtd ~~~ ~~~ dtd本地引入: ![image-20220317160148170](assets/image-20220317160148170.png) ~~~ 中国 河南省 郑州 开封 ~~~ 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" > ~~~ ![image-20220317173948185](assets/image-20220317173948185.png) 作业: 定义一个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+< ![image-20220324162617596](readme.assets/image-20220324162617596.png) ### Schemal语法 ##### 1 元素定义 语法 ~~~ ~~~ type: ![image-20220324163225902](readme.assets/image-20220324163225902.png) ![image-20220324163249659](readme.assets/image-20220324163249659.png) 常用类型 * string 字符串 * decimal 小数 * integer 整数 ..... ##### 2 属性定义 ~~~ ~~~ ##### 3 简单类型 只包含字符串数据 ~~~ ~~~ * 限定值 的范围 * 枚举 * 空白处理 * 模式匹配 正则表达式 (Pattern Mather ) ![image-20220324164845709](readme.assets/image-20220324164845709.png) ##### 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?参数名=参数值&参数名=参数值 > ~~~ > > 地址栏长度是有限制的: > > ![image-20220331163829059](readme.assets/image-20220331163829059.png) > > * post > 参数不会显示在地址栏中 > > 可以传大量的数据 > > 可以传二进制数据 #### 请求头 向服务器发送的附加消息 ![image-20220331165529758](readme.assets/image-20220331165529758.png) ![image-20220331165844462](readme.assets/image-20220331165844462.png) ![image-20220331170000919](readme.assets/image-20220331170000919.png) ![image-20220331170054934](readme.assets/image-20220331170054934.png) ### HTTP响应消息 响应状态行: * http版本号 * 状态码、文本信息 ![image-20220331172619143](readme.assets/image-20220331172619143.png) 响应头 ![image-20220331172925446](readme.assets/image-20220331172925446.png) ![image-20220331173224935](readme.assets/image-20220331173224935.png) ![image-20220331173328103](readme.assets/image-20220331173328103.png) ![image-20220331173728808](readme.assets/image-20220331173728808.png) ## 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工程 ![image-20220407144300243](readme.assets/image-20220407144300243.png) ![image-20220407144910624](readme.assets/image-20220407144910624.png) ### 引入servlet-api 1. 直接引用本地的jar包 ![image-20220407145132428](readme.assets/image-20220407145132428.png) ![image-20220407145331895](readme.assets/image-20220407145331895.png) ![image-20220407145520705](readme.assets/image-20220407145520705.png) 2、通过maven引入依赖 到mvn仓库去查找依赖: https://mvnrepository.com/ 在pom.xml文件中增加如下依赖: ~~~ javax.servlet javax.servlet-api 4.0.1 provided ~~~ ### servlet接口 ![image-20220407152452125](readme.assets/image-20220407152452125.png) ![image-20220407153037812](readme.assets/image-20220407153037812.png) ### servlet定义 #### 通过注解的形式映射 @WebServlet > 在servlet3.0之后出现的 参数描述: ![image-20220407162605320](readme.assets/image-20220407162605320.png) #### 通过xml映射来实现 在WEB-INF/web.xml里配置 ##### servlet3.0之前 ![image-20220407163301893](readme.assets/image-20220407163301893.png) ~~~ hello02Servlet com.by.day01.Hello02Servlet hello02Servlet /hello2 ~~~ ### Servlet生命周期 分为三个阶段 * 初始化阶段 > 对象的创建 ----init方法的调用 > > 对象创建的时间: > > 1. 在访问的时候创建 > > 2. 在servlet容器启动时创建 > > ![image-20220407165457299](readme.assets/image-20220407165457299.png) * 运行阶段 * 销毁阶段 服务器关闭或web应用被移除servlet容器时,servlet对象也会随着移除并销毁 执行销毁方法 释放资源 ![image-20220407170224183](readme.assets/image-20220407170224183.png) ### ServletConfig接口 ![image-20220407172301519](readme.assets/image-20220407172301519.png) ### 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对象之间的数据共享 ![image-20220407174458895](readme.assets/image-20220407174458895.png) 作业: ​ 实现 登录servlet,如果用户是admin/123456 提示用户登录 成功,否则提示失败 ​ (登录页面参照案例) #### 读取web应用下的资源文件 ![image-20220414152134811](readme.assets/image-20220414152134811.png) 方法: * **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对象 #### 请求行相关信息 ![image-20220414174528217](readme.assets/image-20220414174528217.png) #### 获取请求头 * 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 ~~~ ![image-20220421173430214](assets/image-20220421173430214.png) ### Cookie API ![image-20220421180017503](assets/image-20220421180017503.png) 方法: * setPath 设置cookie的有效的访问路径 ,只有请求的路径是指定路径及其子路径,浏览器才会带上cookike信息 * setDomain 设置浏览器访问的域名,只有指定 的域名访问服务器,浏览器才 会带上cookie信息 ### Session对象 将会话数据保存到服务器上。 > 受限于服务器资源 当访问: * jsp * servlet servlet容器就会创建一个session对象 一个id属性(JSESSIONID=...) ### Session API ~~~ javax.servlet.http.HttpSession ~~~ ![image-20220423155008419](assets/image-20220423155008419.png) ![image-20220423155746362](assets/image-20220423155746362.png) 重要方法: * setAttribute(String name,Object o) 将对象o与属性name关联后存储到相关的session 中 * getAttribute(String name) 获取属性值从当前session中 * removeAttribute(String name)移除 模拟用户登录功能 ### Session生命周期 * session 生效 > 第一次访问jsp/servlet等程序里才会创建session * session失效 两种方式: 1. 配置服务器超时限制 > * servlet容器默认配置: > > ![image-20220423162621104](assets/image-20220423162621104.png) > > 可以在应用的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 属性="值" ... %> ~~~ ![image-20220428170218517](assets/image-20220428170218517.png) ### include指令 通过该指令包含其它页面。它将被包含的页面的代码原封不动的嵌入到当前当面,最终生成一个servlet 语法: ~~~ <%@ include file="要引用的文件地址" %> ~~~ ## JSP动作指令 ### jsp:include 包含 引入其它页面 语法: ~~~ ~~~ 将被包含页面编译处理后的结果包含在当前面中。 对比: * include指令 是将页面的内容写入到当前的页面中 ,与当前页面成为一个整体,生成一个java文件 > ![image-20220428173313950](assets/image-20220428173313950.png) jsp:include 被包含的页面同样会生成java文件,会编译 ,然后将结果包含到当前页面 ![image-20220505145214522](assets/image-20220505145214522.png) 项目考核: 一旦重复全部视为0分 ### jsp:forward 请求转发 > 在request中请求转发: > > ~~~ > RequestDispatcher dispatcher=req.getRequestDispatcher("/要转发的请求地址") > dispatcher.forward(req,resp) > ~~~ > > 语法: ~~~ ~~~ ![image-20220505150747935](assets/image-20220505150747935.png) ## 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个内置对象: ![image-20220505155328847](assets/image-20220505155328847.png) # 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官网下载 ![image-20220512150741337](assets/image-20220512150741337.png) ![image-20220512151121100](assets/image-20220512151121100.png) ### 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 ~~~ ![image-20220512152318730](assets/image-20220512152318730.png) ![image-20220512152439851](assets/image-20220512152439851.png) ~~~ <%@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 ![image-20220512155949299](assets/image-20220512155949299.png) 解压: ![image-20220512161234934](assets/image-20220512161234934.png) 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 变量的作用域 > > ![image-20220512162121017](assets/image-20220512162121017.png) * 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开始 > > ``` ![image-20220512172207432](assets/image-20220512172207432.png) 动手做: 定义一个List 存放字符串 ,使用forEach遍历 作业:模拟商品列表,在jsp页面显示,及购买 要求: 1. servlet模拟数据 2. jstl 标签的使用 3. el的使用 MVC: M 模型 业务层 V 视图 jsp 用来显示数据的 C 控制器 接收用户的请求 调用业务逻辑(M) 根据业务逻辑返回的结果 跳转到相应的视图上 jsp+servlet servlet: 访问时创建 启动时创建 servlet创建时执行init方法