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协议的请求:
  1. 请求的组成部分

    • 请求行
    • 请求头
    • 请求空行
    • 请求体
  2. 请求的方式:

    • GET
    • POST

    注意:只有POST请求才存在请求体

  1. 请求行:请求参数,提交路径(提交参数)HTTP/版本号

  2. 请求头:

  3. 请求空行

    普通换行,用来区分请求头和请求体

  4. 请求体

    只有POST提交方式才有请求体,用于显示提交参数

HTTP协议的响应
  1. 响应的组成部分

    • 响应行
    • 响应头
    • 响应空行
    • 响应体
  2. 响应行:

    请求方式HTTP/版本号 状态码 状态描述

常见状态码:

  1. 响应头:

  2. 响应空行:

    普通换行,用来区分响应头和响应体

  3. 响应体:

    将资源文件发送给客户端浏览器进行解析

Servlet

概述:Servlet是运行在JavaSE服务器端的程序,用于接收和响应来自客户端基于HTTP协议的请求

如果想实现Servlet的功能,可以通过实现javax.servlet.Servlet接口或者继承它的实现类(GenericServlet、HttpServlet)

核心方法:service(),任何客户端的请求都会经过该方法

执行过程:

Servlet关系视图

Servlet的实现方式:
  1. 第一种,实现Servlet接口

    实现所有的抽象方法,该方式支持最大程度的自定义。

  2. 第二种,继承GenericServlet抽象类

    必须重写service方法,其他方法可选择重写,该方式让我们开发Servlet变得简单,但是这种方法和HTTP协议无关

  3. 第三种,继承HttpServlet抽象类

    需要重写doGet和doPost方法,该方式表示请求和响应都需要和Http协议相关

Servlet的生命周期

就是对象从出生到死亡的过程,官方的说法就是从创建到销毁

出生:请求第一次到达Servlet时,对象就创建出来,并且初始化成功,只出生一次将对象放到内存中

活着:服务器提供服务的整个过程,该对象一直存在,每次都是执行service方法

死亡:当服务停止时,或者服务宕机时,对象死亡

结论:Servlet对象只会创建一次,销毁一次,所以servlet对象只有一个实例,如果一个对象实例在应用中是唯一存在的,我们就称他为单例模式。

Servlet的线程安全问题

Servlet是线程不安全的

Servlet映射方式

Servlet创建时机
  1. 第一次访问时创建

    优势:减少对服务器内存的浪费,提高了服务器启动的效率

    缺点:如果有一些需要在应用加载时就做的初始化操作,无法完成

  2. 服务器加载时创建

    优势:提前创建好对象,提高了首次执行的效率,可以完成一些应用加载时要做的初始化操作

    弊端:对服务器内存占用较多,影响了服务器启动效率

修改servlet创建时机,在标签中,添加标签

正整数代表服务器加载时创建,值越小,优先级越高

负整数或者不写代表第一次访问时创建

ServletConfig

概述:是servlet的配置参数对象,在servlet规范中,允许为每一个servlet都提供一些初始化的配置,所以,每一个servlet都有一个自己的ServletConfig

作用:在Servlet初始化时,把一些配置信息传递给Servlet

生命周期:和Servlet相同

ServletConfig配置方式

在servlet标签中,通过标签来配置,有两个子标签

  • :代表初始化参数的key
  • :代表初始化参数的value

ServletConfig常用方法

ServletContext
概述:是应用上下文对象(应用域对象),每个应用中只有一个ServletContext对象

作用:可以配置和获得应用的全局初始化参数,可以实现Servlet之间的数据共享

生命周期:应用一加载则创建,应用停止则销毁

域对象:

域对象指的是对象有作用域,也就是有作用范围。域对象可以实现数据的共享,不同范围作用域对象,共享数据能力也不一样

在servlet规范中,一共有4个域对象。ServletContext是其中一个,它是web应用中最大的作用域,也叫application域,他可以实现整个应用的数据共享

ServletContext配置方式

标签中,通过标签来配置,有两个子标签

:代表全局初始化参数的key

:代表全局初始化参数的value

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

文件下载
  1. 创建字节输入流,关联读取的文件
  2. 设置响应消息头支持的类型
  3. 设置响应消息头以下载方式打开资源
  4. 通过响应对象获取字节输出流对象
  5. 循环读写
  6. 释放资源

会话:浏览器和服务器之间的多次请求和响应

会话中产生的数据,可以通过会话技术(Cookie和Session)保存

概述:客户端会话技术,把要共享的数据保存到客户端,从而实现多次请求的数据共享!

作用:可以保存客户端访问网站的相关内容,从而保证每次先从本地缓存中获取,以此来提高效率

常见属性

Cookie方法

添加:HttpServletResponse

方法名:addCookie(Cookie cookie) 向客户端添加cookie 返回值void

获取:HttpServletRequest

方法名:getCookies() 获取所有的Cookie

Cookie的使用
  1. 通过响应对象写出一个提示信息
  2. 创建cookie对象,指定name和value
  3. 设置Cookie最大存活时间
  4. 通过响应对象将Cookie对象添加到客户端
  5. 通过请求对象获取Cookie对象
  6. 将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表达式

语法:${表达式内容}

获取数据

  1. 获取基本数据类型数据

  2. 获取自定义对象类型数据

    ${stu.name} //注意name即使是private修饰的也会获取到,因为他会自动调用getName方法

  3. 获取数组类型数据

    ${arr[0]}

  4. 获取list集合类型数据

    ${list[0]}

  5. 获取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核心的主要内容,如果未能解决你的问题,请参考以下文章

CSP核心代码片段记录

《java精品毕设》基于javaweb宠物领养平台管理系统(源码+毕设论文+sql):主要实现:个人中心,信息修改,填写领养信息,交流论坛,新闻,寄养信息,公告,宠物领养信息,我的寄养信息等(代码片段

javaWeb核心技术第九篇之JSP

javaweb核心之页面技术

Java itext为pdf 文件添加水印核心功能代码片段

markdown [Apereo CAS 3.5 CORE] Apereo CAS 3.5 #CAS的核心代码片段