学习Java第三天
1 jsp工作原理
JSP的工作模式是请求/响应模式,客户端首先发出HTTP请求,JSP程序收到请求后进行处理并返回处理结果。在一个JSP文件第1次被请求时,JSP引擎(容器)把该JSP文件转换成为一个Servlet,而这个引擎本身也是一个Servlet。
了解了JSP的运行原理后,完全可以利用其中的一些步骤来做一些工作,如:可以在jspInit()中进行一些初始化工作(建立数据库的连接、建立网络连接、从配置文件中获取一些参数等),可以在jspDestroy()中释放相应的资源等
2 JSP脚本元素
JSP脚本元素是指嵌套在<%和%>之中的一条或多条Java程序代码。通过JSP脚本元素可以将Java代码嵌入HTML页面中,所有可执行的Java代码,都可以通过JSP脚本来执行
1.JSP ScriptletsJSP Scriptlets 是一段代码段。当需要使用Java实现一些复杂操作或控制时,可以使用它。JSP Scriptlets的语法格式如下所示。
<% java 代码(变量、方法、表达式等)%>
在JSP Scriptlets中声明的变量是JSP页面的局部变量,调用JSP Scriptlets时,会为局部变量分配内存空间,调用结束后,释放局部变量占有的内存空间。
2.JSP声明语句
JSP 的声明语句用于声明变量和方法,它以"<%!"开始,以"%>"结束,其语法格式如下所示。
<%!定义的变量或方法等%>
需要注意的是,<%!和%>里面定义的属性是成员属性,相当于类的属性,方法相当于全局的方法,也相当于类里面的方法,但是它是不可以进行输出的,因为它只是进行方法的定义和属性的定义。<%和%>可以进行属性的定义,也可以输出内容,但是它不可以进行方法的定义。因为这对标签里面的内容是在此JSP被编译为Servlet的时候,放在_jspService()方法里面的,这个方法就是服务器向客户端输出内容的地方,它本身就是一个方法。所以,如果在它里面定义方法的话,那么就相当于是在类的方法里面嵌套定义了方法,这在Java里面是不允许的。但是,可以在里面定义自己的私有变量,因为方法里面也可以定义变量,也可以调用方法,唯独不可以再定义方法了。
总之,<%!和%>是用来定义成员变量属性和方法的,<%和%>主要是用来输出内容的,因此,如果涉及到了成员变量的操作,那么就应该使用<%!和%>,而如果涉及到了输出内容,就使用<%和%>。
3 .JSP表达式
JSP表达式(expression)用于将程序数据输出到客户端,它将要输出的变量或者表达式直接封装在以"<%="开头和以"%>"结尾的标记中,其基本的语法格式如下所示。<%= expression %>在上述语法格式中,JSP表达式中的变量或表达式的计算结果将被转换成一个字符串,然后插入到JSP页面输出结果的相应位置处。例如,对example01.jsp文件进行修改,将内的脚本元素修改为表达式,具体如下。
<%=a+b %>
<%=print() %>
4 JSP注释
同其他各种编程语言一样,JSP也有自己的注释方式,其基本语法格式如下。
<%-- 注释信息 --%>
5 page指令
在 JSP 页面中,经常需要对页面的某些特性进行描述,例如,页面的编码方式、JSP 页面采用的语言等,这时,可以通过page指令来实现。page指令的具体语法格式如下所示。<%@ page 属性名1= "属性值1" 属性名2= "属性值2" ...%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="java.awt.*" %>
<%@ page import="java.util.*","java.awt.*" %>
除了import属性外,其他的属性都只能出现一次,否则会编译失败。需要注意的是,page指令的属性名称都是区分大小写的。
6 include指令
在实际开发时,有时需要在JSP页面静态包含一个文件,例如HTML文件、文本文件等,这时,可以通过include指令来实现。include指令的具体语法格式如下所示。
<%@ include file="被包含的文件地址"%>
include指令只有一个file属性,该属性用来指定插入到JSP页面目标位置的文件资源。需要注意的是,插入文件的路径一般不以"/"开头,而是使用相对路径。
关于include指令的具体应用,有很多问题需要注意,接下来,将这些问题进行列举,具体如下。
(1)被引入的文件必须遵循 JSP 语法,其中的内容可以包含静态 HTML、JSP 脚本元素和JSP指令等普通JSP页面所具有的一切内容。
(2)除了指令元素之外,被引入的文件中的其他元素都被转换成相应的Java源代码,然后插入当前JSP页面所翻译成的Servlet源文件中,插入位置与include指令在当前JSP页面中的位置保持一致。
(3)file属性的设置值必须使用相对路径,如果以"/"开头,表示相对于当前Web应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。需要注意的是,这里的 file属性指定的相对路径是相对于文件(file),而不是相对于页面(page)
7 JSP隐式对象
在JSP页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象则会非常麻烦。为了简化Web应用程序的开发,JSP2.0规范中提供了9个隐式(内置)对象,它们是JSP默认创建的,可以直接在 JSP 页面中使用。
out对象
在JSP页面中,经常需要向客户端发送文本内容,这时,可以使用out对象来实现。out对象是javax.servlet.jsp.JspWriter类的实例对象,它的作用与ServletResponse.getWriter()方法返回的PrintWriter对象非常相似,都是用来向客户端发送文本形式的实体内容。不同的是,out对象的类型为JspWriter,它相当于一种带缓存功能的PrintWriter。
<%out.println("first line
");
response.getWriter().println("second line
"); %>
尽管out.println();语句位于response.getWriter().println();语句之前,但它的输出内容却在后面。由此可以说明,out 对象通过 print 语句写入数据后,直到整个JSP页面结束,out对象中输入缓冲区的数据(即first line)才真正写入到Serlvet引擎提供的缓冲区中。而response.getWriter().println();语句则是直接把内容(即second line)写入Servlet引擎提供的缓冲区中,Servlet引擎按照缓冲区中的数据存放顺序输出内容。
有时候,开发人员会希望out对象可以直接将数据写入Servlet引擎提供的缓冲区中,这时,可以通过page指令中操作缓冲区的buffer属性来实现。
<%@ page language="java" contentType="text/html; charset=UTF-8" buffer="0kb"%>
8 pageContext对象
在JSP页面中,使用pageContext对象可以获取JSP的其他8个隐式对象。pageContext对象是javax.servlet.jsp.PageContext类的实例对象,它代表当前JSP页面的运行环境,并提供了一系列用于获取其他隐式对象的方法。
JspWriter getOut() 用于获取out隐式对象
Object getPage() 用于获取page隐式对象
ServletRequest getRequest() 用于获取request隐式对象
ServletResponse getResponse() 用于获取response隐式对象
HttpSession getSession() 用于获取session隐式对象
Exception getException() 用于获取exception隐式对象
ServletConfig getServletConfig() 用于获取config隐式对象
ServletContext getServletContext() 用于获取application隐式对象
9 pageContext对象
不仅提供了获取隐式对象的方法,还提供了存储数据的功能。
pageContext对象存储数据是通过操作属性来实现的,
表6-4列举了pageContext操作属性的一系列方法,
具体如下。表6-4
pageContext操作属性的相关方法
void setAttribute(String name,Object value,int scope)
Object getAttribute(String name,int scope)
void removeAttribute(String name,int scope)
void removeAttribute(String name)
Object findAttribute(String name)用于设置pageContext对象的属性用于获取pageContext对象的属性删除指定范围内名称为name的属性删除所有范围内名称为name的属性
其中,参数name指定的是属性名称,参数scope指定的是属性的作用范围。pageContext对象的作用范围有4个值,
具体如下。
• pageContext.PAGE_SCOPE:表示页面范围
• pageContext.REQUEST_SCOPE:表示请求范围
• pageContext.SESSION_SCOPE:表示会话范围
• pageContext.APPLICATION_SCOPE:表示Web应用程序范围
需要注意的是,当使用 findAttribute()方法查找名称为 name 的属性时,会按照page、request、session和application的顺序依次进行查找,如果找到,则返回属性的名称,否则返回null。接下来,通过一个案例来演示pageContext对象的使用。
<%
//pageContext.setAttribute("str", "Java",PageContext.PAGE_SCOPE);
//pageContext.setAttribute("str", "Java Web",PageContext.REQUEST_SCOPE);
HttpServletRequest req = (HttpServletRequest) pageContext.getRequest();
req.setAttribute("str", "Java Web");
pageContext.setAttribute("str", "Java",pageContext.PAGE_SCOPE);
String str2 = (String)pageContext.getAttribute("str",pageContext.PAGE_SCOPE);
String str1 = (String)pageContext.getAttribute("str",pageContext.REQUEST_SCOPE);
%>
<%= "request范围:" + str1 %>
<%= "page范围:" + str2 %>
10 exception对象
在 JSP 页面中,经常需要处理一些异常信息,这时,可以通过 exception 对象来实现。exception对象是java.lang.Exception类的实例对象,它用于封装JSP中抛出的异常信息。需要注意的是,exception 对象只有在错误处理页面才可以使用,即 page 指令中指定了属性<%@page isErrorPage="true"%>的页面。
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" errorPage = "error.jsp" %>
--error.jsp
<%@ page contentType = "text/html; charset = utf-8"
language = "java" isErrorPage = "true" pageEncoding="utf-8"%>
11 jsp处理异常
<%
try{
int a = 6;
int c = a/0 ;
}
catch(Exception exception)
{
out.println(exception.getClass());
out.println(exception.getMessage());
}
%>
12标签
• 标签中要引入的资源和当前JSP页面是两个彼此独立的执行实体,即被动态引入的资源必须能够被Web容器独立执行。而include指令只能引入遵循JSP格式的文件,被引入文件与当前JSP文件需要共同合并才能翻译成一个Servlet源文件。
• 标签中引入的资源是在运行时才包含的,而且只包含运行结果。而include指令引入的资源是在编译时期包含的,包含的是源代码。
• 标签运行原理与RequestDispatcher.include()方法类似,即被包含的页面不能改变响应状态码或者设置响应头,而include指令没有这方面的限制。
13 动作元素
动作元素将当前请求转发到其他Web资源(HTML页面、JSP页面和Servlet等),在执行请求转发之后的当前页面将不再执行,而是执行该元素指定的目标页面。其具体语法格式如下所示。
${pageContext.request.contextPath}会获取项目的名称chapter06并以"/"开头
13 什么是JavaBean
JavaBean是Java开发语言中一个可以重复使用的软件组件,它本质上就是一个Java类。为了规范JavaBean的开发,Sun公司发布了JavaBean的规范,它要求一个标准的JavaBean组件需要遵循一定的编码规范,具体如下。
(1)它必须具有一个公共的、无参的构造方法,这个方法可以是编译器自动产生的默认构造方法。
(2)它提供公共的setter方法和getter方法,让外部程序设置和获取JavaBean的属性。
如果一个属性只有getter方法,则该属性为只读属性。如果一个属性只有setter方法,则该属性为只写属性。如果一个属性既有getter方法,又有setter方法,则该属性为读写属性。通常来说,在开发JavaBean时,其属性都定义为读写属性。需要注意的是,对于 JavaBean 属性的命名方式有一个例外情况。如果属性的类型为boolean,它的命名方式应该使用 is/set,而不是 get/set。例如,有一个boolean 类型的属性married,该属性所对应的方法声明如下所示。
14 EL表达式
由于EL可以简化JSP页面的书写,因此,在JSP的学习中,掌握EL是相当重要的。要使用EL表达式,首先要学习它的语法。EL表达式的语法非常简单,都是以"${"符号开始,以"}"符号结束的,具体格式如下。
用户名:<%=request.getAttribute("username")%>
密 码:<%=request.getAttribute("password")%>
使用EL表达式:
用户名:${username}
密 码:${password}
15 EL隐式对象
pageContext对象:
请求URI为:${pageContext.request.requestURI}
Content-Type响应头:${pageContext.response.contentType}
服务器信息为:${pageContext.servletContext.serverInfo}
Servlet注册名为:${pageContext.servletConfig.servletName}
16 Web域相关对象
使用pageScope、requestScope、sessionScope和applicationScope这4个隐式对象成功地获取到了相应JSP域对象中的属性值。需要注意的是,使用EL表达式获取某个域对象中的属性时,也可以不使用这些隐式对象来指定查找域,而是直接引用域中的属性名称即可,例如表达式${userName}就是在page、request、session、application这4个作用域内按顺序依次查找userName属性的。
<%
pageContext.setAttribute("userName", "itcast");
%>
<%
request.setAttribute("bookName", "Java Web");
%>
<%
session.setAttribute("userName", "itheima");
%>
<%
application.setAttribute("bookName", "Java 基础");
%>
表达式${pageScope.userName}的值为:${pageScope.userName}
表达式${requestScope.bookName}的值为:${requestScope.bookName}
表达式${sessionScope.userName}的值为:${sessionScope.userName}
表达式${applicationScope.bookName}的值为:${applicationScope.bookName}
表达式${userName}的值为:${userName}
17 param和paramValues对象
param 对象用于获取请求参数的某个值,它是 Map 类型,与request.getParameter()方法相同,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。param对象的语法格式比较简单,具体示例如下。
${param.num}
如果一个请求参数有多个值,可以使用paramValues对象来获取请求参数的所有值,该对象用于返回请求参数所有值组成的数组。如果要获取某个请求参数的第1个值,可以使用如下代码。
${paramValues.nums[0]}
举例:
18 .Cookie对象
在JSP开发中,经常需要获取客户端的Cookie信息,为此,在EL表达式中,提供了Cookie隐式对象,该对象是一个代表所有Cookie信息的Map集合,Map集合中元素的键为各个Cookie的名称,值则为对应的Cookie对象,具体示例如下。
获取cookie对象的信息:${cookie.userName}
获取cookie对象的名称:${cookie.userName.name}
获取cookie对象的值:${cookie.userName.value}
举例:
Cookie对象的信息:
${cookie.userName }
Cookie对象的名称和值:
${cookie.userName.name }=${cookie.userName.value }
<%
response.addCookie(new Cookie("userName", "itcast"));
%>
19 什么是JSTL
从JSP 1.1规范开始,JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重用性。为此,许多Web应用厂商都定制了自身应用的标签库,然而同一功能的标签由不同的Web应用厂商制定可能是不同的,这就导致市面上出现了很多功能相同的标签,令网页制作者无从选择。为了解决这个问题,Sun 公司制定了一套标准标签库(JavaServer Pages Standard Tag Library),简称JSTL。
使用JSTL标签库报错,可将 jstl.jar 和 standard.jar 这两个文件复制到 chapter07项目的 lib 目录下,复制到tomcat的lib目录下即可。
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
详解医保改革中的门槛费,有了这些限制你还能报销多少?头条创作挑战赛门诊报销的限制这次医保改革的意义是积极的,虽然个人账户的钱减少了但门诊可以报销了,只不过在门诊报销中又设置了门槛费和封顶线,受到了限制,这个实在是让人觉得不爽。很多人
快手日活用户超3。6亿北京日报客户端记者赵语涵快手2023增量效应磁力大会2月22日在北京召开,披露了平台一系列特色数据和商业化发展新版图等。2022年,平台日活用户超3。6亿,已成为最大的短剧消费市场
9个生活极简目标清单目录01。自律习惯02。日常护理03。精致生活04。消费购物05。身材管理06。投资理财07。健康管理08。自我提升09。修身养性关于自律学习坚持早睡早起,保持作息规律。先做不需要
手游剑与远征魔术礼帽活动别换神魔,换资源难道不香?远征魔术礼帽活动即将回归,但抠门这次不建议换任何的英雄,哪怕是神魔。至于为什么,看了本期兑换英雄你就懂。此外,本期依然会有猎宝雪地最新的平民7队阵容,需要的,别忘提前留存。魔术礼帽
CSGOM4A1削弱影响CT胜率下降明显日前数据统计网站leetify统计了从2021年7月20日到2023年1月13日官方匹配比赛中共计5。4亿个回合,限定为服役地图。从地图上看,受M4A1削弱影响最大的地图是Anci
白发长在哪,病就从哪来?这3处尤其要注意人未老,头先白,这是众多人的生活写照,明明有着年轻美丽的容貌,却有一头白发,看起来显老。导致白发生长的原因有很多,包括疾病缺乏微量元素吸烟精神压力太大等。从中医看来,白发生长在哪个
男人就要偷偷补肾,然后惊艳所有人!5种补肾超强的中成药请收好今天我们来聊一个很普遍又比较实质性的话题,那就是肾虚。说起肾虚可能会很多人想到的是纵欲过度,并不是啊,导致肾虚的原因有很多种,比如长期熬夜,暴饮暴食,大喜大悲,抽烟酗酒等,都会是导
生吃番茄,番茄红素能吸收吗?也能吸收一点,但不多。番茄红素是类胡萝卜素的一种,番茄番石榴西瓜木瓜和粉红葡萄柚等等蔬菜水果里都有。番茄红素抗氧化性很强,能较好地清除活性氧,从而阻挡氧化损伤,观察性研究发现它和降
要照顾好自己今天做完午饭给爷爷,吃完饭后,爷爷突然头晕了起来,因为年龄也大了,有些老年疾病也正常。刚开始我也没太在意,就跟爷爷聊天是不是缺少微量元素了。通过聊天我又想到微量元素缺少会眼前发黑呀
肠道里长了息肉,上厕所时早有提示,别等到中晚期才发现刘女士今年65岁了,在两年前,刘女士做肠镜检查的时候,被发现肠道内有一厘米左右大小的息肉,病理结果显示为管状腺瘤。但是刘女士认为身体没有其他不适症状,所以就没进行下一步的治疗,但是
日版switch下载游戏慢怎么办如果您在使用日版Switch下载游戏时遇到了下载速度缓慢的问题,以下是一些可能会有所帮助的解决方法确认您的网络连接稳定。尽量使用有线网络连接,避免使用WiFi连接或者移动网络数据,