java学习周笔记(第七周)
2021/4/18 14:25:24
本文主要是介绍java学习周笔记(第七周),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
java学习周笔记
- html
- 书写规范
- HTML基本标签
- HTML表单标签
- html框架标签
- css
- CSS导入方式
- CSS选择器
- CSS属性
- CSS盒子模型
- CSS3扩展属性
- servlet
- HTTP协议
- Http协议通信流程
- 请求报文和响应报文
- Servlet详解
- Servlet核心接口和类
- Servlet接口
- GenericServlet抽象类
- HttpServlet类
- Servlet两种创建方式
- Servlet两种配置方式
- Servlet应用
- 转发和重定向
- Servlet生命周期
- Servlet特性
- 状态管理
html
概念:Hyper Text Markup Language(超文本标记语言)
- 超文本:页面内可以包含图片、连接,甚至音乐、程序等非文字元素
- 标记:标签,不同的标签实现不同的功能
- 语言:人与计算机的交互工具
书写规范
- HTML标签是以尖括号包围的关键字
- HTML标签通常是成对出现的,有开始就有结束
- HTML通常都有书写,格式:书写=‘属性值’(多个属性之间用空格隔开)
- HTML标签不区分大小写,建议全小写
HTML基本标签
结构标签
<html>:根标签 <head>:网页头标签 <title></title>:页面的标题 </head> <body></body>:网页正文 </html>
属性名 | 代码 | 描述 |
---|---|---|
text | < body text="#f00"></ body> | 设置网页正文中所有文字的颜色 |
bgcolor | < body bgcolor="#00f"></ body> | 设置网页的背景色 |
background | < body background=“1.png”></ body> | 设置网页的背景图 |
颜色的表示方式:
- 第一种方式:用表示颜色的英文单词,例,red green blue
- 第二种方式:用16进制表示颜色,例,#000000 #ffffff #325687 #377405
排版标签
- 可用于实现简单的页面布局
- 注释标签:
- 换行标签:< br>
- 段落标签:< p>文本文字</ p>
- 特点:段与段之间有空行
- 属性:align对齐方式(left、center、right)
- 水平线标签:< hr/>
- 属性:
- width:水平线的长度(两种:第一种:像素表示;第二种,百分比表示)
- size: 水平线的粗细 (像素表示,例如:10px)
- color:水平线的颜色
- align:水平线的对齐方式
- 属性:
块标签
使用CSS+DIV是现下流行的一种布局方式
标签 | 代码 | 描述 |
---|---|---|
div | < div></ div> | 行级块标签,独占一行,换行 |
span | < span></ span> | 行内块标签,所有内容都在同一行 |
基本文字标签
font标签处理网页中文字的显示方式
属性名 | 代码 | 描述 |
---|---|---|
size | < font size=“7”></ font> | 用于设置字体的大小,最小1号,最大7号 |
color | < font color="#f00"></ font> | 用于设置字体的颜色 |
face | < font face=“宋体”></ font> | 用于设置字体的样式 |
文本格式化标签
标签 | 代码 | 描述 |
---|---|---|
b | < b></ b> | 粗体标签 |
strong | < strong></ strong> | 加粗 |
em | < em></ em> | 强调字体 |
i | < i></ i> | 斜体 |
small | < small></ small> | 小号字体 |
big | < big></ big> | 大号字体 |
sub | < sub></ sub> | 上标标签 |
sup | < sup></ sup> | 下标标签 |
del | < del></ del> | 删除线 |
标题标签
标签 | 代码 | 描述 |
---|---|---|
h1 | < h1></ h1> | 1号标题,最大字号 |
h2 | < h2></ h2> | 2号标题 |
h3 | < h3></ h3> | 3号标题 |
h4 | < h4></ h4> | 4号标题 |
h5 | < h5></ h5> | 5号标题 |
h6 | < h6></ h6> | 6号标题,最小字号 |
列表标签
无序列表:使用一组无序的符号定义, < ul>< /ul>
<ul type="circle"> <li></li> </ul>
属性值 | 描述 | 用法举例 |
---|---|---|
circle | 空心圆 | < ul type=“circle”>< /ul> |
disc | 实心圆 | < ul type=“disc”>< /ul> |
square | 黑色方块 | < ul type=“square”>< /ul> |
有序列表:使用一组有序的符号定义, < ol>< /ol>
<ol type="a" start="1"> <li></li> </ol>
属性值 | 描述 | 用法举例 |
---|---|---|
1 | 数字类型 | < ul type=“1”>< /ul> |
A | 大写字母类型 | < ul type=“A” >< /ul> |
a | 小写字母类型 | < ul type=“a”>< /ul> |
I | 大写古罗马 | < ul type=“I”>< /ul> |
i | 小写古罗马 | < ul type=“i”>< /ul> |
列表嵌套:无序列表与有序列表相互嵌套使用
代码举例: <ol> <li></li> <li></li> <li> <ul> <li></li> </ul> </li> </ol>
图形标签
在页面指定位置处中引入一幅图片, < img />
属性名 | 描述 |
---|---|
src | 引入图片的地址 |
width | 图片的宽度 |
height | 图片的高度 |
border | 图片的边框 |
align | 与图片对齐显示方式 |
alt | 提示信息 |
hspace | 在图片左右设定空白 |
vspace | 在图片的上下设定空白 |
链接标签
在页面中使用链接标签跳转到另一页面
标签: < a href="">< /a>
属性:href:跳转页面的地址(跳转到外网需要添加协议)
设置跳转页面时的页面打开方式,target属性
- _blank在新窗口中打开
- _self在原空口中打开
- 指向同一页面中指定位置
- 定义位置: < a name=“名称”>< /a>
- 指向: < a href="#名称">< /a>
表格标签
<table> <tr> <td></td> </tr> </table>
表格的列标签(th):内容有加粗和居中效果
<table> <tr> <th></th> </tr> </table>
表格的列合并属性(colspan):在同一行内同时合并多个列
<table> <tr> <td colspan=""></td> </tr> </table>
表格的行合并属性(rowspan):在同一列跨多行合并
<table> <tr rowspan=""> <td></td> </tr> </table>
HTML表单标签
html表单用于收集不同类型的用户输入数据
form元素常用属性
- action表示动作,值为服务器的地址,把表单的数据提交到该地址上处理
- method:请求方式:get 和post
- get:
- 地址栏,请求参数都在地址后拼接 path?name=“张三”&password=“123456”
- 不安全
- 效率高
- get请求大小有限制,不同浏览器有不同,但是大约是2KB;一般情况用于查询数据
- post:
- 地址栏:请求参数单独处理。
- 安全可靠些
- 效率低
- post请求大小理论上无限;一般用于插入删除修改等操作
- get:
- enctype:表示是表单提交的类型
- 默认值:application/x-www-form-urlencoded 普通表单
- multipart/form-data 多部分表单(一般用于文件上传)
input元素
作为表单中的重要元素,可根据不同type值呈现为不同状态
属性值 | 描述 | 代码 |
---|---|---|
text | 单行文体框 | < input type=“text”/> |
password | 密码框 | < input type=“password”/> |
radio | 单选按钮 | < input type=“radio”/> |
checkbox | 复选框 | < input type=“checkbox”/> |
date | 日期框 | < input type=“date”/> |
time | 时间框 | < input type=“time”/> |
datetime | 日期和时间框 | < input type=“datetime”/> |
电子邮件输入 | < input type=“email”/> | |
number | 数值输入 | < input type=“number”/> |
file | 文件上传 | < input type=“file”/> |
hidden | 隐藏域 | < input type=“hidden”/> |
range | 取值范围 | < input type=“range”/> |
color | 取色按钮 | < input type=“color”/> |
submit | 表单提交按钮 | < input type=“submit”/> |
button | 普通按钮 | < input type=“button”/> |
reset | 重置按钮 | < input type=“reset”/> |
image | 图片提交按钮 | < input type=“image”/> |
select 元素(下拉列表)
- 单选下拉列表:< select>< /select>
- 默认选中属性:selected=“selected”
<select> <option selected="selected">内容</option> ... <option></option> </select>
- 多选下拉列表属性: < select></ select>
- 多选列表:multiple=“multiple”
<select multiple="multiple"> <option></option> </select>
textarea元素(文本域)
多行文本框: < textarea cols=“列” rows=“行”>< /textarea>
html框架标签
- 通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面。每份HTML文档称为一个框架,并且每个框架都独立于其他的框架。
- 使用框架的缺点:
- 开发人员必须同时跟踪更多的HTML文档
- 很难打印整张页面
框架结构标签frameset
- 框架结构标签( < frameset>< /frameset>)用于定义如何将窗口分割为框架
- 每个 frameset 定义了一系列行或列
- rows/columns 的值规定了每行或每列占据屏幕的面积
- <frameset rows="">< /frameset>
- <frameset cols="">< /frameset>
框架标签frame
每个frame引入一个html页面
<frameset cols="*,*"> <frame src="info1.html" /> <frame src="info2.html" /> </frameset>
注意事项
- 不能将 < body>< /body> 标签与 < frameset>< /frameset> 标签同时使用
- 假如一个框架有可见边框,用户可以拖动边框来改变它的大小。为了避免这种情况发生,可以在< frame>标签中加入:noresize=“noresize”。
其他标签
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <!--该网页的描述--> <meta http-equiv="description" content="this is my page"> <!--该网页的编码--> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!-- href:引入css文件的地址--> <link rel="stylesheet" type="text/css" href="./styles.css"> <!--src:js的文件地址--> <script type="text/javascript" src=""></script>
css
- CSS :全称:Cascading Style Sheets 层叠样式表,定义如何显示HTML元素
- 多个样式可以层层覆盖叠加,如果不同的css样式对同一html标签进行修饰,样式有冲突的
应用优先级高的,不冲突的共同作用
语法:选择器{属性:值;属性:值…}
CSS导入方式
- 内嵌方式(内联方式)
把CSS样式嵌入到html标签当中,类似属性的用法
<div style="color:blue;font-size:50px">This is my HTML page. </div>
- 内部方式
在head标签中使用style标签引入css
<style type=“text/css”> //告诉浏览器使用css解析器去解析 div{color:red;font-size:50px} </style>
- 外部方式
将css样式抽成一个单独文件,使用者直接引用
创建单独文件 div.css 内容示例:div{color:green;font-size:50px} 引用语句写在head标签内部 <link rel="stylesheet" type="text/css" href=“div.css"></link> rel:代表当前页面与href所指定文档的关系 type:文件类型,告诉浏览器使用css解析器去解析 href:css文件地址
- @import方式
在页面中引入一个独立的单独文件
<style type="text/css"> @import url("div.css") </style> 该内容放在head标签中
link和@import方式的区别:
- link所有浏览器都支持,@import某些版本低的IE不支持
- @import是等待html加载完成才加载
- @import不支持js动态修改
CSS选择器
-
基本选择器
- 元素选择器:在head中使用style标签引入在其中声明元素选择器:html标签{属性:属性值}
<style type="text/css"> span{color: red;font-size: 100px} </style>
- id选择器: 给需要修改样式的html元素添加id属性标识,在head中使用style标签引入在其中声明id选择器: #id值{属性:属性值}
创建id选择器: <div id="s1">hello,everyone!</div> <div id="s2">hello,everyone!</div> <div id="s3">hello,everyone!</div> 根据id选择器进行html文件修饰 <style type="text/css"> #s1{color: red;font-size: 100px} #s2{color: green;font-size: 100px} #s3{color: blue;font-size: 100px} </style>
- class选择器:给需要修改样式的html元素添加class属性标识,在head中使用style标签引入在其中声明class选择器: .class名{属性:属性值}
创建class选择器: <div class="s1">hello,everyone!</div> <div class="s2">hello,everyone!</div> <div class="s3">hello,everyone!</div> 根据id选择器进行html文件修饰: <style type="text/css"> .s1{color: purple;font-size: 100px} .s2{color: pink;font-size: 100px} .s3{color: yellow;font-size: 100px} </style>
- 属性选择器
- 根据元素的属性及属性值来选择元素。在head中使用style标签引入在其中声明
- 格式为:
- htm标签[属性=‘属性值’]{css属性:css属性值;}
- html标签[属性]{css属性:css属性值;}
body内容: <form name="login" action="#" method="get"> <font size="3">用户名:</font> <input type="text" name="username" value="zhangsan"><br> <font size="3">密码:</font> <input type="password" name="password" value="123456"><br/> <input type="submit" value="登录"> </form> head中书写: <style type="text/css"> input[type='text'] { background-color: pink; } input[type='password'] { background-color: yellow; } font[size] { color: green } a[href] { color: blue; } </style>
- 伪元素选择器
- 主要是针对a标签
- 语法:
- 静止状态 a:link{css属性}
- 悬浮状态 a:hover{css属性}
- 触发状态 a:active{css属性}
- 完成状态 a:visited{css属性}
代码: <a href="https://hao.360.cn/">点我吧</a> 样式: <style type="text/css"> <!--静止状态 --> a:link {color: red;} <!--悬浮状态 -->’ a:hover {color: green;} <!--触发状态 --> a:active {color: yellow;} <!--完成状态 --> a:visited {color: blue;} </style>
- 层级选择器
父级选择器 子级选择器….,具体示例如下:
<div id="div1"> <div class="div11"> <span>span1-1</span> </div> <div class="div12"> <span>span1-2</span> </div> </div> <div class="div2"> <div id="div22"> <span>span2-1</span> </div> <div id="div23"> <span>span2-2</span> </div> </div>
<style type="text/css"> #div1 .div11{color:red;} #div1 .div12{color:purple;} .div2 #div22{color:green;} .div2 #div23{color:blue;} </style>
CSS属性
文字属性
属性名 | 取值 | 描述 |
---|---|---|
font-size | 数值 | 设置字体大小 |
font-family | 默体、宋体、楷体等 | 设置字体样式 |
font-style | normal正常; italic斜体; | 设置斜体样式 |
font-weight | 100~900数值;bold;bolder; | 粗体样式 |
文本属性
属性名 | 取值 | 描述 |
---|---|---|
color | 十六进制;表示颜色的英文单词; | 设置文本颜色 |
text-indent | 5px缩进5像素;20%缩进父容器宽度的百分之二十; | 缩进元素中文本的首行 |
text-decoration | none;underline;overline;blink; | 文本的装饰线 |
text-align | left;right;center | 文本水平对齐方式 |
word-spacing | normal;固定值; | 单词之间的间隔 |
line-height | normal;固定值; | 设置文本的行高 |
text-shadow | 四个取值依次是: 水平偏移;垂直偏移;模糊值;阴影颜色; | 设置阴影及模糊效果 |
背景属性
属性名 | 取值 | 描述 |
---|---|---|
background-color | 16进制;用于表示颜色的英语单词; | 设置背景色 |
background-image | url(‘图片路径’) | 设置背景图片 |
background-repeat | repeat-y;repeat-x;repeat;no-repeat; | 设置背景图的平铺方向 |
background-position | top;bottom;left;right ; center; | 改变图像在背景中的位置 |
列表属性
属性名 | 取值 | 描述 |
---|---|---|
list-style-type | disc等 | 改变列表的标识类型 |
list-style-image | url(“图片地址”) | 用图像表示标识 |
list-style-position | inside;outside | 标识出现在列表项内容之外还是内部 |
尺寸属性
- width:设置元素的宽度
- height:设置元素的高度
显示属性
显示属性display ,以下是常用取值: - none:不显示
- block:块级显示
- inline:行级显示
轮廓属性
绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。常用属性:
| 属性名 | 取值 | 描述 |
| :-----------: | :-------------------------------------: | :------------: |
| outline-style | solid(实线)/dotted(虚线)/dashed(虚线)等 | 设置轮廓的样式 |
| outline-color | 16进制;用于表示颜色的英文 | 设置轮廓的颜色 |
| outline-width | 数值 | 设置轮廓的宽度 |
浮动属性float - 浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样。
取值 | 描述 |
---|---|
left | 在左侧不允许浮动元素。 |
right | 在右侧不允许浮动元素。 |
both | 在左右两侧均不允许浮动元素。 |
none | 默认值。允许浮动元素出现在两侧。 |
inherit | 规定应该从父元素继承 clear 属性的值。 |
定位属性
相对定位(relative):元素框偏移某个距离,元素仍保持其未定位前的形状,它原本所占的空间仍保留。
<head> <style type="text/css"> h2.pos_left { position: relative; left: -20px } h2.pos_right { position: relative; left: 20px } </style> </head> <body> <h2>这是位于正常位置的标题</h2> <h2 class="pos_left">这个标题相对于其正常位置向左移动</h2> <h2 class="pos_right">这个标题相对于其正常位置向右移动</h2> <p>相对定位会按照元素的原始位置对该元素进行移动。</p> <p>样式 "left:-20px" 从元素的原始左侧位置减去 20 像素。</p> <p>样式 "left:20px" 向元素的原始左侧位置增加 20 像素。</p> </body>
绝对定位(absolute):元素框从文档流完全删除,并相对于其包含块进行定位。包含块可能是文档中的另一个元素或者是初始包含块。元素原先在正常文档流中所占的空间会关闭,就好像元素原来不存在一样。元素定位后生成一个块级框。
<html> <head> <meta charset="utf-8" /> <style type="text/css"> h2.pos_abs { position: absolute; left: 100px; top: 150px } </style> </head> <body> <h2 class="pos_abs">这是带有绝对定位的标题</h2> <p>通过绝对定位,元素可以放置到页面上的任何位置。下面的标题距离页面左侧 100px,距离页面顶部 150px。</p> </body> </html>
固定定位(fixed):元素框的表现类似于将 position 设置为 absolute,不过其包含块是视窗本身。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> #left { width: 200px; height: 200px; background-color: red; position: fixed; left: 0px; bottom: 0px; } #right { width: 200px; height: 200px; background-color: green; position: fixed; right: 0px; bottom: 0px; } #middle{ width: 200px; height: 200px; background-color: blue; position: fixed; left: 0px; bottom: 50%; } </style> </head> <body> <div id="left">左下</div> <div id="right">右下</div> <div id="middle">中间</div> </body> </html>
CSS盒子模型
边框相关属性
属性名 | 取值 | 描述 |
---|---|---|
border-style | solid;double;dashed;dotted等 | 设置边框的样式 |
border-color | 16进制;用于表示颜色的英文; | 设置边框的颜色 |
border-width | 数值 | 设置边框的粗 |
外边距相关属性
margin:外间距,边框和边框外层的元素的距离
属性名 | 取值 | 描述 |
---|---|---|
margin | top;right;bottom;left | 四个方向的距离 |
margin-top | 数值 | 上间距 |
margin-bottom | 数值 | 下间距 |
margin-left | 数值 | 左间距 |
margin-right | 数值 | 右间距 |
内边距相关属性
padding:内间距,元素内容和边框之间的距离((top right bottom left))
属性名 | 取值 | 描述 |
---|---|---|
padding | top;right;bottom;left | 四个方向的距离 |
padding-top | 数值 | 上间距 |
padding-bottom | 数值 | 下间距 |
padding-left | 数值 | 左间距 |
padding-right | 数值 | 右间距 |
CSS3扩展属性
border-radius创建圆角
box-shadow:用于向方框添加阴影
background-size: 属性规定背景图片的尺寸
background-image:为指定元素使用多个背景图像
text-shadow: 可向文本应用阴影。
servlet
概念:
- Servlet:Server Applet的简称,是服务器端的程序(代码、功能实现),可交互式的处理客户端发送到服务端的请求,并完成操作响应
- 动态网页技术
- javaWeb程序开发的基础,javaEE规范(一套接口)的一个组成部分
作用
- 接收客户端请求,完成操作
- 动态生成网页
- 将包含操作结果的动态网页响应给客户端
HTTP协议
概念:超文本传输协议(HTTP)是互联网上应用最为广泛的一种网络协议,是一个基于请求与响应模式的、无状态的、应用层的协议,运行于TCP协议基础之上
- 在网络中传递信息都是以二进制形式存在的
- 接收方【浏览器/服务器】在接收信息后,会将二进制文件进行编译,编译成【文字、图片、视频、命令】等
- 传递信息数据量往往比较大,导致接收方很难在一组连续二进制数据中得到对应的数据
- 而网络协议包是一组有规律的二进制数据,这组数据中存在一个固定空间,每一个空间专门存放特定的信息。这样接收方在接收网络协议包之后就可以到固定空间得到对应信息,大大降低了接收方对接收到的二进制的数据的编译难度
【0000(IP地址) 0000(端口号) 0000(资源文件名) 0000】
特点:
- 支持客户端(浏览器)/服务器模式
- 简单快速:客户端只向服务器发送请求方法和路径,服务器即可响应数据,因而通信速度很快。请求方法常用的有GET、POST等
- 灵活:HTTP允许传输任意类型的数据,传输的数据类型由Content-Type标识
- 无连接:无连接指的是每次TCP连接只处理一个或多个请求,服务器处理完客户的请求后,即可断开连接。采用这种方式可以节省传输时间。
- Http1.0办事是一个请求响应之后,就直接断开了。称为短连接
- Http1.1版本不是响应后就直接断开了,而是等待几秒钟,这几秒钟之内有新的请求,那么还是通过之前的连接通道来接收消息,如果过了这几秒钟用户没有发送新的请求,就会断开连接。称为长连接
- 无状态:Http协议是无状态协议,对事物处理没有记忆功能,但会返回事物处理的状态(404,500等)
常用的网络协议包
- FTP网络协议包
- Http网络协议包
在基于B/S结构下互联网通信过程中,所有在网络中传递的信息都是保存在http网络协议包中
Http协议通信流程
- 客户端与服务器建立间接(三次握手)
- 客户端向服务器发送请求
- 服务器接收请求,并根据请求返回相应文件作为应答
- 客户端与服务器关闭连接(四次挥手)
请求报文和响应报文
请求报文
当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,http请求信息由4部分组成
- 请求行:请求地址url、请求方式method(get/post)、uri(统一资源标识符)协议/版本
- 请求头:请求参数信息,填充条件为请求方式为get
- 空白行:没有任何作用,用于隔离请求头和请求体
- 请求体:请求参数信息,填充条件为请求方式为post
Http响应报文
与请求报文相似
- 状态行:Http状态码
- 响应头:content-type:指定浏览器采用对应编译器,对响应体二进制数据进行解析(通俗的来说就是告诉浏览器要怎么去解析文件,比如图片的话就进行图片解析,文本文件就进行文本解析,如果是文本文件的话,还需要设置编码格式。)
- 空白行:没有任何内容,起到隔离作用
- 响应体:可能是被访问的静态资源文件内容、 可能是被访问的静态资源文件命令、 可能是动态资源文件的运行结果
Servlet详解
Servlet核心接口和类
在Servlet体系机构中,除了实现Servlet接口,还可以通过继承GenericServlet(只需重写Service方法)或HttpServlet(需重写doget()、dopost()方法)类,完成编写
Servlet接口
在ServletAPI中最重要的是Servlet接口,所有Servlet都会直接或间接的与该接口发生联系,或是直接实现该接口,或间接继承自实现了该接口的类
改接口包括一下五个方法:
- Init(ServletConfig config):仅仅在创建Servlet时才调用,用于初始化
- ServletConfig getServletConfig():返回一个ServletConfig对象,其中包含此servlet的初始化和启动参数
- service(ServletRequest req,ServletResponse res):这个方式是在Servlet生命周期中被多次调用的唯一方法,同时也是执行实际任务的只要方法。用于处理客户端的请求。每当服务器接口到对servlet的请求时,服务器将产生一个新线程并调用服务。service()方法检查http请求类型(get、post、put、delete等),并根据需要调用方法
- String getServletInfo():返回有关servlet的信息,如作者,版本和版权
- destroy():在servlet生命周期结束时,该方法由Servlet容器调用,只会调用一次
GenericServlet抽象类
GenericServlet 是编写Servlet变得更容易。它提供生命周期方法init和destroy的简单实现,要编写一般的servlet,只需重写抽象service方法即可
HttpServlet类
HttpServlet是继承GennericServlet的基础上进一步的扩展。提供将要被子类化以创建适用于Web站点的HTTP servlet的抽象类。HttpServlet的子类至少必须重写一个方法,该方法通常是一下这些方法之一:
- doget
- dopost
- doput
- dodelete
Servlet两种创建方式
1.实现接口Servlet
/** * Servlet创建的第一种方式:实现接口Servlet * */ public class HelloServlet2 implements Servlet{ @Override public void destroy() { } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { return null; } @Override public void init(ServletConfig arg0) throws ServletException { } @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("OK"); response.getWriter().println("welcome use servlet"); } }
2.继承HttpServlet
/** * Servlet implementation class HelloServlet * Servlet的第二种创建方式,继承HttpServlet.也是开发中推荐的 * */ public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().print("welcome use servlet"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Servlet两种配置方式
1.使用web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>Web_Day11</display-name> <!--Servlet配置 --> <servlet> <!--名称 --> <servlet-name>hello2</servlet-name> <!--Servlet的全称类名 --> <servlet-class>com.qf.web.servlet.HelloServlet</servlet-class> <!--启动的优先级,数字越小越先起作用 --> <load-on-startup>1</load-on-startup> </servlet> <!--映射配置 --> <servlet-mapping> <!--名称 --> <servlet-name>hello2</servlet-name> <!--资源的匹配规则:精确匹配 --> <url-pattern>/hello2</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.html</welcome-file> </welcome-file-list> </web-app>
配置属性
url-pattern定义匹配规则,取值说明: 精确匹配 /具体的名称 只有url路径是具体的名称的时候才会触发Servlet 后缀匹配 *.xxx 只要是以xxx结尾的就匹配触发Servlet 通配符匹配 /* 匹配所有请求,包含服务器的所有资源 通配符匹配 / 匹配所有请求,包含服务器的所有资源,不包括.jsp load-on-startup 1元素标记容器是否应该在web应用程序启动的时候就加载这个servlet。 2它的值必须是一个整数,表示servlet被加载的先后顺序。 3如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。 4如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。
2.使用注解(Servlet3.0后支持)
/** * Servlet implementation class HelloServlet * 演示Servlet注解式配置 */ @WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().print("OK"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
@WebServlet注解常用属性
- name:Servlet名字
- value:配置url路径,可以配置多个
- urlPatterns:配置url路径,和value作用一样,不能同时使用
- loadOnStartup:配置Servlet的创建时机,如果是0或者正数,启动程序时创建,如果是负数,则访问时创建。数字越小优先级越高
Servlet应用
在Servlet中用来处理客户端请求需要用doGet或doPost方法的request对象
get提交方法特点
- 提交的参数数量(大小)最大为4kb,超过大小会截断
- 会在浏览器地址栏上将请求参数信息展示出来
- 会将请求参数信息保存在http请求协议包中
- 接受到服务器返回的资源文件内容后,会将资源文件内容保存在浏览器的缓冲中
浏览器以GET方式发送的请求内容在到达http服务器后,会由服务器进行解码,此时如果http服务器是Tomcat的话,会默认使用utf-8来解码,所以在参数有中文的情况下不会乱码
浏览器以POST方式发送的请求内容在到达http服务器后,会由请求对象(request)来进行解码,默认使用【iso-8859-1】来解码,所以在参数有中文的情况会乱码。需要设置编码类型为utf-8(setCharacterEncoding(utf-8))
post方法特点
- post方法是吧提交的数据放在Http包的body中(请求体)
- 密文传递数据,数据量大,安全
- 效率没有get高
- 对应的Servlet的方法是dopost
request主要方法
方法名 | 说明 |
---|---|
String getParameter(String name) | 根据表单组件名称获取提交数据 |
void setCharacterEncoding(String charset) | 指定每个请求的编码 |
setCharacterEncoding(charset) | 进行编码设置 |
response主要方法
方法名称 | 作用 |
---|---|
setHeader(name,value) | 设置响应信息头 |
setContentType(String) | 设置响应文件类型、响应式的编码格式 |
setCharacterEncoding(String) | 设置服务端响应内容编码格式 |
getWriter() | 获取字符输出流 |
转发和重定向
转发:作用在服务端,将请求发送给服务器上的其他资源,以共同完成一次请求的处理
语法:request.getRequsetDispatcher(“目标url-pattern”).forward(request,response)
使用forward跳转时,是在服务器内部跳转,地址栏不发生变化,属于同一次请求
数据传递
request作用域:拥有存储数据的空间,作用范围是一次请求有效(一次请求可以经过多次转发)
可以将数据存入request后,在一次请求过程中的任何位置进行获取
可以传递任何类型的数据
存数据:request.setAttribute(key,value)
取数据:request.getAttribute(key,value)
转发特点
- 转发是服务器行为
- 浏览器只做了一次请求
- 转发浏览器地址不变
- 转发两次跳转之间传输的信息不会丢失,所以可以通过request进行数据的传递
- 转发只能将请求转发给同一个Web应用中的组件
重定向:重定向作用在客户端,客户端将请求发送给服务器后,服务器响应给客户端一个新的请求地址,客户端重新发送请求
语法:response.sendRedirect(“目标uri”)
sendRedirect跳转时,地址栏改变,代表客户端重新发送的请求。属于两次请求
- response没有作用域,两次request请求中的数据无法共享
- 传递数据:通过uri的拼接信息数据传递(“uri/?username=tom”);
- 获取数据:request.getParameter(“username”);
重定向特点
- 重定向是客户端行为
- 重定向是浏览器做了至少两次的访问请求
- 重定向浏览器地址改变
- 重定向两次跳转之间传输的信息会丢失
- 充定向可以指向任何的资源,包括当前应用程序中的其他资源、同一个站点上的其他应用程序中的资源、其他站点的资源
当两个Servlet需要传递数据时,选择forward转发。不建议使用sendRedirect进行传递
Servlet生命周期
- 实例化
当用户第一次访问Servlet时,由容器调用Servlet的构造器创建具体的Servlet对象。也可以在容器启动之后like穿件实例。使用如下代码可以设置Servlet是否在服务器启动时就创建 - 初始化
在初始化阶段,init()方法会被调用。这个方法在javax.servlet.Servlet接口中定义。其中,方法以一个ServletConfig类型的对象作为参数 - 服务
当客户端有一个请求时,容器就会将请求ServletRequest与响应ServletResponse对象转给Servlet,以参数的形式传给service方法 - 销毁
当Servlet容器停止或者重启启动都会引起销毁Servlet对象并调用destroy方法
Servlet特性
Servlet在访问之后,会执行实例化操作,创建一个Servlet对象。而我们Tomcat容器可以同时多个线程并发访问同一个Servlet,如果在方法中对成员变量做修改操作,就会有线程安全的问题
如何保证线程安全
- synchronized:将存在线程安全问题的代码放到同步代码块中(拖慢运行速度)
- 实现SingleThreadModel接口:servlet实现SingleThreadModel接口后,每个线程都会创建servlet实例,这样每个客户端请求就不存在共享资源的问题,但是servlet响应客户端请求的效率太低,所以已经淘汰。
- 尽可能使用局部变量
状态管理
现有问题
- HTTP协议是无状态的,不能保存每次提交的信息
- 如果用户发来一个新的请求,服务器无法知道它是否与上次的请求有联系
- 对于那些需要多次提交数据才能完成的Web操作,比如登录来说,就成问题了
概念:将浏览器与web服务器之间多次交互当做一个整体来处理,并且将多次交互所涉及的数据(状态)保存下来
状态管理分类
- 客户端状态管理技术:将状态保存在客户端。代表性的是Cookie技术
- 服务器状态管理技术:将状态保存在服务器。代表性的数session技术(服务器传递sessionID时需要使用Cookie的方式)
这篇关于java学习周笔记(第七周)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?
- 2024-05-30java excel上传--poi
- 2024-05-30安装笔记本应用商店的pycharm,再安排pandas等模块,说是没有打包工具?
- 2024-05-29java11新特性
- 2024-05-29哪些无用敏捷指标正在破坏敏捷转型?
- 2024-05-29鸿蒙原生应用再新丁!新华社 入局鸿蒙
- 2024-05-29设计模式 之 迭代器模式(Iterator)