学习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"%>
辽篮三消息郭艾伦又要缺阵杨鸣意外之喜青训彻底崩塌辽宁男篮第三阶段比赛已经进行了两场,做客山东在一片大好的形势下双加时输球,随后到宁波一场大胜给年轻球队上课,回到主场之后辽宁迎来两个坏消息一个好消息,本赛季本就出场不多的郭艾伦又将
贺希宁286萨林杰16147琼斯11711深圳大胜吉林直播吧3月5日讯深圳今日坐镇主场迎战吉林,两支球队在第三阶段开局都取得2连胜,同时双方最近6场比赛也都赢下了其中的5场,目前深圳排在第四,吉林排在第九。首节开局深圳给远道而来的吉林
埃塞俄比亚选手包揽东京马拉松赛男子前三新华社东京3月5日电(记者王子江)2023年东京马拉松赛5日举行,埃塞俄比亚选手不仅包揽男子比赛前三名,而且还在女子比赛中获得第二三四名的成绩。盖尔米萨在最后400米时冲刺,超过同
火星发来的信号?46亿年后人类才收到,中国探测器将是破解关键?你不会是火星来的吧?这句话想必很多人都不陌生,曾几何时这也是嘲讽一个人跟不上时代潮流的一句流行语。可你知道吗?还真的有一种特殊的东西,穿越浩瀚的宇宙,从火星发出信号来到地球,它的名
气象中的24节气惊蛰节气黑龙江省气温升高明显央广网哈尔滨3月6日消息(记者庞淼通讯员黄英伟李新华)惊蛰,古称启蛰,是二十四节气中的第3个节气。月令七十二候集解二月节万物出乎震,震为雷,故曰惊蛰,是蛰虫惊而出走矣。春雷响,万物
为什么不孕不育的年轻人越来越多本文来源中华医学会科学普及部从古至今,生育都是人们重点关注的一个话题。然而,随着生活水平的提高,生育率却在下降。除了生育意愿降低之外,不孕不育的比例也在逐步上升,并呈年轻化趋势。那
孩子在家家长能做什么?文广州日报全媒体记者谢泽楷刘晓星在线学习期间,广报求学推出知心小贴士系列科普报道,为家长和学生等答疑解惑,也带来关于亲子沟通家校沟通提高注意力和学习效率,以及保护视力等相关报道。在
绝了,几分钟一集的动画片,拯救了我的带娃焦虑都说女儿是妈妈的小棉袄,而儿子是皮大褂。何为皮大褂?冬天穿着觉得冷,春秋穿着觉得热,夏天连挡太阳都用不上。而我这个先养了一个小棉袄,又来了一个皮大褂的老母亲,真心觉得这皮大褂的温度
宁愿离家出走,也不想做作业前几天,娃说不想读书要去隐居,这两天,娃不做作业直接离家出走,真是把大人折磨到没了脾气,事情是这样的。我写完这篇文章后,助理问我,写这篇文章的目的是什么?我说,本质上没目的,我只是
家校共育绘新篇倾心交流促成长为了进一步增进家校之间的联系,促进学校与家庭老师与家长的交流沟通,促进学生的全面发展,樊口街道周屴小学于2023年3月2日成功召开了家长会。家长会上,各班班主任及任课老师就学生的学
孩子此处时隐时现的鼓包,家长得重视!当心来者不疝益阳头条桃江县人民医院近日,桃江县石牛江的李奶奶遇到一个烦心事,她在给2岁的小孙子洗澡的时候,忽然发现小孙子两侧阴囊不一样大,右侧大腿根部鼓起来一个鹌鹑蛋大小的包,摸起来软软的,孩