Java教程

java学习周笔记(第七周)

本文主要是介绍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请求大小理论上无限;一般用于插入删除修改等操作
  • 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”/>
email电子邮件输入< 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-stylenormal正常; italic斜体;设置斜体样式
font-weight100~900数值;bold;bolder;粗体样式

文本属性

属性名取值描述
color十六进制;表示颜色的英文单词;设置文本颜色
text-indent5px缩进5像素;20%缩进父容器宽度的百分之二十;缩进元素中文本的首行
text-decorationnone;underline;overline;blink;文本的装饰线
text-alignleft;right;center文本水平对齐方式
word-spacingnormal;固定值;单词之间的间隔
line-heightnormal;固定值;设置文本的行高
text-shadow四个取值依次是: 水平偏移;垂直偏移;模糊值;阴影颜色;设置阴影及模糊效果

背景属性

属性名取值描述
background-color16进制;用于表示颜色的英语单词;设置背景色
background-imageurl(‘图片路径’)设置背景图片
background-repeatrepeat-y;repeat-x;repeat;no-repeat;设置背景图的平铺方向
background-positiontop;bottom;left;right ; center;改变图像在背景中的位置

列表属性

属性名取值描述
list-style-typedisc等改变列表的标识类型
list-style-imageurl(“图片地址”)用图像表示标识
list-style-positioninside;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-stylesolid;double;dashed;dotted等设置边框的样式
border-color16进制;用于表示颜色的英文;设置边框的颜色
border-width数值设置边框的粗

外边距相关属性
margin:外间距,边框和边框外层的元素的距离

属性名取值描述
margintop;right;bottom;left四个方向的距离
margin-top数值上间距
margin-bottom数值下间距
margin-left数值左间距
margin-right数值右间距

内边距相关属性
padding:内间距,元素内容和边框之间的距离((top right bottom left))

属性名取值描述
paddingtop;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协议基础之上

  1. 在网络中传递信息都是以二进制形式存在的
  2. 接收方【浏览器/服务器】在接收信息后,会将二进制文件进行编译,编译成【文字、图片、视频、命令】等
  3. 传递信息数据量往往比较大,导致接收方很难在一组连续二进制数据中得到对应的数据
  4. 而网络协议包是一组有规律的二进制数据,这组数据中存在一个固定空间,每一个空间专门存放特定的信息。这样接收方在接收网络协议包之后就可以到固定空间得到对应信息,大大降低了接收方对接收到的二进制的数据的编译难度
    【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部分组成

  1. 请求行:请求地址url、请求方式method(get/post)、uri(统一资源标识符)协议/版本
  2. 请求头:请求参数信息,填充条件为请求方式为get
  3. 空白行:没有任何作用,用于隔离请求头和请求体
  4. 请求体:请求参数信息,填充条件为请求方式为post

请求报文

Http响应报文
与请求报文相似

  1. 状态行:Http状态码
  2. 响应头:content-type:指定浏览器采用对应编译器,对响应体二进制数据进行解析(通俗的来说就是告诉浏览器要怎么去解析文件,比如图片的话就进行图片解析,文本文件就进行文本解析,如果是文本文件的话,还需要设置编码格式。)
  3. 空白行:没有任何内容,起到隔离作用
  4. 响应体:可能是被访问的静态资源文件内容、 可能是被访问的静态资源文件命令、 可能是动态资源文件的运行结果

响应报文

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生命周期

  1. 实例化
    当用户第一次访问Servlet时,由容器调用Servlet的构造器创建具体的Servlet对象。也可以在容器启动之后like穿件实例。使用如下代码可以设置Servlet是否在服务器启动时就创建
  2. 初始化
    在初始化阶段,init()方法会被调用。这个方法在javax.servlet.Servlet接口中定义。其中,方法以一个ServletConfig类型的对象作为参数
  3. 服务
    当客户端有一个请求时,容器就会将请求ServletRequest与响应ServletResponse对象转给Servlet,以参数的形式传给service方法
  4. 销毁
    当Servlet容器停止或者重启启动都会引起销毁Servlet对象并调用destroy方法

Servlet特性

Servlet在访问之后,会执行实例化操作,创建一个Servlet对象。而我们Tomcat容器可以同时多个线程并发访问同一个Servlet,如果在方法中对成员变量做修改操作,就会有线程安全的问题

如何保证线程安全

  • synchronized:将存在线程安全问题的代码放到同步代码块中(拖慢运行速度)
  • 实现SingleThreadModel接口:servlet实现SingleThreadModel接口后,每个线程都会创建servlet实例,这样每个客户端请求就不存在共享资源的问题,但是servlet响应客户端请求的效率太低,所以已经淘汰。
  • 尽可能使用局部变量

状态管理

现有问题

  • HTTP协议是无状态的,不能保存每次提交的信息
  • 如果用户发来一个新的请求,服务器无法知道它是否与上次的请求有联系
  • 对于那些需要多次提交数据才能完成的Web操作,比如登录来说,就成问题了

概念:将浏览器与web服务器之间多次交互当做一个整体来处理,并且将多次交互所涉及的数据(状态)保存下来
状态管理分类

  • 客户端状态管理技术:将状态保存在客户端。代表性的是Cookie技术
  • 服务器状态管理技术:将状态保存在服务器。代表性的数session技术(服务器传递sessionID时需要使用Cookie的方式)
这篇关于java学习周笔记(第七周)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!