JavaWeb核心
Posted 正在努力的澎澎
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb核心相关的知识,希望对你有一定的参考价值。
JavaWeb
JavaEE规范:Java企业版
javaEE规范是很多Java开发技术的总称,一共包括13个技术规范
包括:JDBC,JNDI,EJB,RMI,IDL/CORBA,JSP,Servlet,XML,JMS,JTA,JTS,JavaMail,JAF
WEB在计算机领域代表的是网络
静态资源:网站中提供给人展示的资源时一成不变的,也就是说不同人在不同时间看到的内容是一样的
动态资源:网站中给人们展示的资源是由程序产生的,在不同时间不同人看到的效果是不一样的
HTTP协议
概述:超文本传输协议
HTTP协议是基于TCP/IP协议的
超文本:比普通文本更加强大
传输协议:客户端和服务器端的规则(握手规则)
HTTP协议的请求:
-
请求的组成部分
- 请求行
- 请求头
- 请求空行
- 请求体
-
请求的方式:
- GET
- POST
注意:只有POST请求才存在请求体
-
请求行:请求参数,提交路径(提交参数)HTTP/版本号
-
请求头:
-
请求空行
普通换行,用来区分请求头和请求体
-
请求体
只有POST提交方式才有请求体,用于显示提交参数
HTTP协议的响应
-
响应的组成部分
- 响应行
- 响应头
- 响应空行
- 响应体
-
响应行:
请求方式HTTP/版本号 状态码 状态描述
常见状态码:
-
响应头:
-
响应空行:
普通换行,用来区分响应头和响应体
-
响应体:
将资源文件发送给客户端浏览器进行解析
Servlet
概述:Servlet是运行在JavaSE服务器端的程序,用于接收和响应来自客户端基于HTTP协议的请求
如果想实现Servlet的功能,可以通过实现javax.servlet.Servlet接口或者继承它的实现类(GenericServlet、HttpServlet)
核心方法:service(),任何客户端的请求都会经过该方法
执行过程:
Servlet关系视图
Servlet的实现方式:
-
第一种,实现Servlet接口
实现所有的抽象方法,该方式支持最大程度的自定义。
-
第二种,继承GenericServlet抽象类
必须重写service方法,其他方法可选择重写,该方式让我们开发Servlet变得简单,但是这种方法和HTTP协议无关
-
第三种,继承HttpServlet抽象类
需要重写doGet和doPost方法,该方式表示请求和响应都需要和Http协议相关
Servlet的生命周期
就是对象从出生到死亡的过程,官方的说法就是从创建到销毁
出生:请求第一次到达Servlet时,对象就创建出来,并且初始化成功,只出生一次将对象放到内存中
活着:服务器提供服务的整个过程,该对象一直存在,每次都是执行service方法
死亡:当服务停止时,或者服务宕机时,对象死亡
结论:Servlet对象只会创建一次,销毁一次,所以servlet对象只有一个实例,如果一个对象实例在应用中是唯一存在的,我们就称他为单例模式。
Servlet的线程安全问题
Servlet是线程不安全的
Servlet映射方式
Servlet创建时机
-
第一次访问时创建
优势:减少对服务器内存的浪费,提高了服务器启动的效率
缺点:如果有一些需要在应用加载时就做的初始化操作,无法完成
-
服务器加载时创建
优势:提前创建好对象,提高了首次执行的效率,可以完成一些应用加载时要做的初始化操作
弊端:对服务器内存占用较多,影响了服务器启动效率
修改servlet创建时机,在
正整数代表服务器加载时创建,值越小,优先级越高
负整数或者不写代表第一次访问时创建
ServletConfig
概述:是servlet的配置参数对象,在servlet规范中,允许为每一个servlet都提供一些初始化的配置,所以,每一个servlet都有一个自己的ServletConfig
作用:在Servlet初始化时,把一些配置信息传递给Servlet
生命周期:和Servlet相同
ServletConfig配置方式
在servlet标签中,通过
:代表初始化参数的key :代表初始化参数的value
ServletConfig常用方法
ServletContext
概述:是应用上下文对象(应用域对象),每个应用中只有一个ServletContext对象
作用:可以配置和获得应用的全局初始化参数,可以实现Servlet之间的数据共享
生命周期:应用一加载则创建,应用停止则销毁
域对象:
域对象指的是对象有作用域,也就是有作用范围。域对象可以实现数据的共享,不同范围作用域对象,共享数据能力也不一样
在servlet规范中,一共有4个域对象。ServletContext是其中一个,它是web应用中最大的作用域,也叫application域,他可以实现整个应用的数据共享
ServletContext配置方式
在
ServletContext常用方法
请求对象
- 请求:获取资源
- 请求对象:就是在项目中用于发送请求的对象
请求对象常用方法-获取各种路径
获取请求头信息
获取请求参数信息
通过流对象获取请求信息
中文乱码问题
get方式,没有乱码问题
post方式,可以通过setCharacterEncoding()方法来解决
请求域
也叫request域:可以在一次请求范围内进行共享数据
请求对象操作共享数据的方法
请求转发
就是客户端的一次请求到达之后,发现需要借助其他servlet来实现功能
特点:
- 浏览器地址栏不变
- 域对象中的数据不丢失
- 负责转发的servlet转发前后的响应正文会丢失
- 由转发的目的地来响应客户端
请求包含
可以合并其他sevlet中的功能一起响应给客户端
特点:
- 地址栏不变
- 域对象中的数据不丢失
- 被包含的servlet响应头会丢失
响应对象
设置缓存
缓存:对于不经常变化的数据,我们可以设置合理缓存时间,以避免浏览器频繁请求服务器,以此来提高效率
设置缓存:setDateHeader(String name,long time) 设置消息头添加缓存 返回值void
定时刷新:
方法名:setHeader(String name,String value) 设置消息头定时刷新 返回值void
请求重定向
客户端的一次请求到达之后,发现需要借助其他Servlet来实现功能
特点:浏览器的地址栏会发生改变,两次请求,请求域对象中不能共享数据,可以重定向到其他服务器
重定向:设置响应状态码为302 resp.setStatus(302);
设置响应的资源路径:resp.setHeader("location","/response/responseDemo");
响应对象重定向方法:方法名:sendRedirect(String name); 设置重定向 返回值void
文件下载
- 创建字节输入流,关联读取的文件
- 设置响应消息头支持的类型
- 设置响应消息头以下载方式打开资源
- 通过响应对象获取字节输出流对象
- 循环读写
- 释放资源
Cookie
会话:浏览器和服务器之间的多次请求和响应
会话中产生的数据,可以通过会话技术(Cookie和Session)保存
概述:客户端会话技术,把要共享的数据保存到客户端,从而实现多次请求的数据共享!
作用:可以保存客户端访问网站的相关内容,从而保证每次先从本地缓存中获取,以此来提高效率
常见属性
Cookie方法
添加:HttpServletResponse
方法名:addCookie(Cookie cookie) 向客户端添加cookie 返回值void
获取:HttpServletRequest
方法名:getCookies() 获取所有的Cookie
Cookie的使用
- 通过响应对象写出一个提示信息
- 创建cookie对象,指定name和value
- 设置Cookie最大存活时间
- 通过响应对象将Cookie对象添加到客户端
- 通过请求对象获取Cookie对象
- 将cookie对象中的访问时间写出
Cookie的细节
数量限制:
每个网站只能有20个cookie,且大小不能超过4kb,所有网站的Cookie总数量不能超过300个
名称限制:
Cookie名称只能包含ASCII码表中的字母、数字。不能包含逗号、分号、空格不能以$开头
Cookie的值不支持中文
存活时间setMaxAge()方法接收数字
负整数:当前会话有效,浏览器关闭则清除
0:立即清除
正整数:以秒为单位设置存活时间
JSP
page指令
include指令
可以包含其他页面
<%@ include file=包含的页面 %>
taglib指令:可以引入外部标签库
<%@ taglib uri=标签库的地址 prefix=前缀名称 %>
细节:
九大隐式对象
PageContext对象
是JSP独有的,Servlet中没有
是四大页面域中的页面域对象,还可以操作其他三个域对象中的属性
还可以获取其他八个隐式对象
生命周期随着JSP的创建而创建,随着jsp的结束而消失,每个JSP页面都有一个PageContext对象
四大域对象
MVC模型
EL表达式
概述:EL(Expression Languge):表达式语言
在JSP2.0规范中加入的内容,也是Servlet规范的一部分
作用:在JSP页面中获取数据,让我们的JSP脱离java代码块和JSP表达式
语法:${表达式内容}
获取数据
-
获取基本数据类型数据
-
获取自定义对象类型数据
${stu.name} //注意name即使是private修饰的也会获取到,因为他会自动调用getName方法
-
获取数组类型数据
${arr[0]}
-
获取list集合类型数据
${list[0]}
-
获取map集合类型数据
${map.key.name}
注意:
- EL表达式没有空指针异常
- EL表达式没有索引越界异常
- EL表达式没有字符串的拼接
EL表达式中的运算符
- 关系运算符
- 逻辑运算符
- 其他运算符
三元运算符:如果条件成立取表达式1,否则就去表达式2
演示:
<%
String str1 = null;
String str2 = "";
String arr = {};
%>
${empty str1} //true
${empty str2} //true
${empty str3} //true
<%--三元运算符,获取性别数据,在对应按钮上进行勾选--%>
<% pageContext.setAttribute("gender","men"); %>
<input type="radio" name="gender" value="men" ${gender == "men" ? "checked":""}>男
<input type="radio" name="gender" value="women" ${gender == "women" ? "checked":""}>女
EL表达式使用细节
EL表达式能获取四大域对象中的数据,根据名称从小到大在域对象中查找
还可以获取JSP其他八个隐式对象,并调用对象中的方法
EL表达式隐式对象
JSTL
概述:Java Server Pages Standard Tag Library:JSP标准标签库
主要给开发人员一个标准通用的标签库
开发人员可以利用这些标签库取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度
JSTL核心标签库
多条件判断
if条件判断
以上的test表示我们可以通过el表达式获取数据
循环
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
pageContext.setAttribute("list",list);
遍历集合
<c:forEach items="${list}" var="str">
${str} <br>
</c:forEach>
## items表示我们可以通过el表达式获取数据
## var表示我们每一次遍历获取到的元素
以上是关于JavaWeb核心的主要内容,如果未能解决你的问题,请参考以下文章
《java精品毕设》基于javaweb宠物领养平台管理系统(源码+毕设论文+sql):主要实现:个人中心,信息修改,填写领养信息,交流论坛,新闻,寄养信息,公告,宠物领养信息,我的寄养信息等(代码片段