版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JavaWeb开发技术与案例教程第4章JSP基本语法第4章知识结构4.1JSP语法基础•4.1.1特点与优势•4.1.2与其他技术的关系•4.1.3JSP页面的基本构成4.2JSP页面元素•4.2.1静态内容•4.2.2表达式•4.2.3声明•4.2.4Scriptlet•4.2.5JSP指令•4.2.6JSP动作•4.2.7注释•4.2.8语句4.3页面包含4.4页面跳转•4.4.1浏览器跳转•4.4.2服务端跳转4.5JSP隐式对象•4.5.1request、response、out•4.5.2pageContext、session、application•4.5.3page、config、exception4.6JSP作用域4.7Cookie•4.7.1创建Cookie•4.7.2获取Cookie4.8session•4.8.1创建session•4.8.2获取session•4.8.3删除session•4.8.4session有效期•4.8.5session和Cookie的关系4.9JSTL与EL•4.9.1JSTL标签库•4.9.2EL表达式4.10本章小结1第4章课程导入
JSP是由SunMicrosystems主导的动态网页技术标准,部署于网络服务器,可响应客户端请求并动态生成HTML、XML等格式的Web页面返回。其核心在于结合Java代码与静态HTML,实现内容与逻辑分离。本章重点学习以下内容:JSP语法基础与页面元素构成;页面处理机制(包含与跳转);数据管理技术(隐式对象、作用域);会话跟踪(Cookie、session);以及标签库JSTL与表达式语言EL的应用。这些内容共同构建了JSP开发的关键技术体系,涵盖从页面设计到数据交互、会话管理的全流程,是掌握JavaWeb开发的重要基础。◆本章要点•理解JSP的执行原理,即JSP页面如何被编译为Servlet。•掌握JSP的页面元素,特别是Scriptlet(<%...%>)、表达式(<%=...%>)和声明(<%!...%>)的区别。•理解JSP的九个隐式对象,重点掌握request、response、session和application。•掌握Cookie的创建和读取,以及session的基本用法。•掌握JSTL核心标签(特别是<c:if>、<c:forEach>)和EL表达式(${...})的使用,以替代Scriptlet。2第4章课程导入◆素养目标•深化MVC分层理念,明确角色定位:通过JSP隐式对象使用,区分“视图层”与“控制层”职责边界,培养架构思维。•强化会话管理责任,保障数据安全:在Cookie与Session机制学习中,强调会话ID保密性要求,树立“数据全生命周期保护”意识。•提升代码可维护性,践行简约美学:通过JSTL标签库替代Scriptlet,倡导“逻辑与表现分离”原则,减少代码冗余。•培养全局视野,理解应用上下文:结合ServletContext对象学习,建立“从单点到全局”的系统级思考能力。34.1JSP语法基础
JSP(JavaServerPages)是一种基于Java技术的服务器端编程技术,它允许在HTML页面中嵌入Java代码,从而生成动态的Web页面,这些页面将作为网页响应给客户端浏览器。当用户请求一个JSP页面时,服务器会执行一系列步骤生成并返回HTML页面。具体过程包括将JSP页面翻译成一个Servlet源文件,编译器将Servlet源文件编译成字节码文件(.class文件),服务器加载并实例化这个Servlet类,然后调用Servlet的service()方法处理请求,生成动态内容并将其插入到HTML页面中,最后将生成的HTML页面发送回客户端。44.1.1特点与优势(1)
JSP技术使用Java编程语言编写类XML的Tags和Scriptlets,以封装产生动态网页的处理逻辑。网页还能通过Tags和Scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。JSP是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。
JavaServlet是JSP的技术基础,而且大型的Web应用程序的开发需要JavaServlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向Web的所有特点。
JSP主要应用于Web应用的开发中,特别是需要与数据库进行交互的动态Web页面。它也可以与其他企业级Java技术相互配合,实现分层开发。它的应用场景例如:•JSP提供了丰富的功能支持Web应用的开发。例如,通过JDBC访问数据库,获取数据并展示在页面上。•接收用户输入的数据,进行验证和处理,并将结果返回给用户。•实现用户的登录、注册等功能,确保只有合法用户才能访问受保护的资源。•读取、写入和删除文件,实现文件上传和下载等功能。•跟踪用户的会话状态,实现购物车、在线聊天等功能。•根据用户的语言和地区设置,显示不同的内容和格式等。54.1.2与其他技术的关系
JSP可以看作是一个简化的Servlet设计。JSP页面在运行时会被其编译器转换成更原始的Servlet代码,然后执行。这种转换使得JSP能够利用Servlet的强大功能,同时简化了开发过程。
JSP可以使用JavaBean实现Web页面的更加强大的功能。JavaBean是一种可重用的Java组件,它封装了业务逻辑和数据,使得JSP页面可以更加专注于页面的设计和展示。64.1.3JSP页面的基本构成在JSP文件中,可以使用HTML标记创建网页的结构。使用JSP标签和表达式插入Java代码和动态内容。例如,可以使用<%@page%>指令指定页面的语言、内容类型和编码方式,使用<%%>脚本编写Java代码,使用<%=%>表达式输出Java变量的值到页面上。结合前面课程学习的内容,在IntelliJIDEA中创建一个Web项目ch04。在新建项目的webapp目录下,创建一个名称为home.jsp的JSP文件,文件内容如清单4-1所示。74.1.3JSP页面的基本构成(清单4-1home.jsp)<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"import="java.util.Date"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>MyFirstWeb</title></head><body>你好JSP。<br><%=newDate()%></body></html>84.1.3JSP页面的基本构成上述代码中:◆首行是JSP的page指令,contentType表示该文件为HTML文档,编码为UTF-8,JSP页面编码为UTF-8,作用是通知浏览器以UTF-8进行中文解码。import是引入Java包,当前页面使用了java.util.Date类,因此需要引入java.util.Date。◆“你好JSP”为HTML文档内容,这些文字将直接在页面显示。◆“<%=newDate()%>”为JSP表达式,利用Java编写,显示当前日期,相当于在Servlet中使用response.getWriter()进行输出,相当于如下代码所示的功能:response.getWriter().println(newDate());94.1.3JSP页面的基本构成如图4-1所示,在浏览器地址栏中输入地址以访问home.jsp页面。http://localhost:8080/ch04/home.jsp图4-1JSP页面的浏览器渲染效果【注意】在Tomcat默认设置的情况下支持热部署,因此修改JSP页面不需要重启Tomcat,只需要在浏览器刷新页面即可看到修改的页面。104.2.1静态内容在JSP页面中,静态内容是指那些不需要经过服务器端处理即可直接呈现给客户端的内容。这些内容通常包括HTML标签、纯文本、CSS样式、JavaScript代码、静态图像等。下面实例演示JSP页面中的静态内容。◆HTML清单4-2所示的代码中,<h1>标签和<p>标签内的内容都是静态的,它们不需要经过服务器端逻辑处理,直接由浏览器解析和显示。114.2.1静态内容(清单4-2html.jsp)<%@pagecontentType="text/html;charset=UTF-8"language="java"%><!DOCTYPEhtml><html><head><title>静态内容</title></head><body><h1>这是一个静态的H1标题</h1><p>这是一段静态的文本内容。</p></body></html>124.2.1静态内容上述代码显示结果如图4-2所示。http://localhost:8080/ch04/html.jsp图4-2JSP中嵌入HTML代码的显示结果134.2.1静态内容◆CSS清单4-3所示的代码中,<style>标签内的CSS样式是静态的,它们定义了页面元素的外观和布局。并且分别采用了类选择器设置div的样式。144.2.1静态内容(清单4-3css.jsp)<%@pagecontentType="text/html;charset=UTF-8"language="java"%><!DOCTYPEhtml><html><head><style>body{font-family:宋体;background-color:#f0f0f0;}.static-content{color:black;font-size:18px;font-weight:bold;}</style><title>静态CSS样式</title></head><body><divclass="static-content"><p>这是一段应用了静态CSS样式的文本。</p></div></body></html>154.2.1静态内容上述代码显示结果如图4-3所示。http://localhost:8080/ch04/css.jsp图4-3在JSP中使用CSS样式164.2.1静态内容◆JavaScript清单4-4所示的代码中,<script>标签内的JavaScript代码是静态的,它定义了一个函数,当用户单击“点击我”按钮时会触发一个警告框。174.2.1静态内容(清单4-4javascript.jsp)<!DOCTYPEhtml><html><head><title>静态JavaScript</title><script>functionshowAlert(){alert('这是一个静态的JavaScript函数。');}</script></head><body><buttononclick="showAlert()">点击我</button></body></html>184.2.1静态内容上述代码运行结果如图4-4所示。http://localhost:8080/ch04/javascript.jsp图4-4在JSP中嵌入JavaScript代码的运行结果194.2.1静态内容(清单4-5img.jsp)◆静态图像清单4-5所示的代码中,<img>标签用于嵌入一个静态的图像文件,该文件存储在Web主目录的images子目录下。<%@pagecontentType="text/html;charset=UTF-8"language="java"%><!DOCTYPEhtml><html><head><title>静态图像</title></head><body><h3>这是一个包含静态图像的页面</h3><imgsrc="images/tuotuo.jpg"alt="宠物:坨坨"width=300></body></html>204.2.1静态内容上述代码显示结果如图4-5所示。图4-5在JSP中显示静态图像【注意】虽然上述内容在JSP页面中都是静态的,但JSP页面的强大之处在于它能够将静态内容和动态内容结合在一起。例如,可以使用JSP表达式、脚本片段、JSTL标签等将服务器端的数据嵌入到静态的HTML内容中,从而创建动态交互的Web页面。然而,这些动态内容部分并不属于纯静态内容的范畴。214.2.2表达式
JSP表达式是一种在JSP页面中嵌入Java代码的方式,通常用于输出Java表达式的值。表达式被放在<%=和%>标记之间。下面实例演示如何在JSP页面使用JSP表达式。◆输出字符串清单4-6所示的代码中,<%=newjava.util.Date()%>用于输出当前的日期和时间。<%@pagecontentType="text/html;charset=UTF-8"language="java"%><!DOCTYPEhtml><html><head><title>JSP表达式</title></head><body><h3>JSP输出字符串</h3><p>当前的日期和时间为:<%=newjava.util.Date()%></p></body></html>224.2.2表达式上述代码显示结果如图4-6所示。http://localhost:8080/ch04/expression.jsp图4-6在JSP中输出字符串234.2.2表达式◆输出变量值清单4-7所示的代码中,<%=greeting%>用于输出变量greeting的值,即"Hello,World!"。<%@pagecontentType="text/html;charset=UTF-8"language="java"%><!DOCTYPEhtml><html><head><title>JSP表达式</title></head><body><h3>JSP输出字符串</h3><p>当前的日期和时间为:<%=newjava.util.Date()%></p></body></html>244.2.2表达式上述代码运行后,页面成功解析JSP表达式,动态输出了服务器当前的系统日期和时间,显示结果如图4-7所示。http://localhost:8080/ch04/variable.jsp图4-7在JSP中输出变量的显示结果254.2.2表达式(清单4-8math.jsp)◆数学运算清单4-8所示的代码中,<%=5+3%>用于输出数学运算5+3的结果,即页面显示“5+3=8”。<%@pagecontentType="text/html;charset=UTF-8"language="java"%><%Stringgreeting="Hello,World!";%><!DOCTYPEhtml><html><head><title>JSP表达式</title></head><body><h3>JSP数学运算</h3><p>5+3=<%=5+3%></p></body></html>264.2.2表达式上述代码显示结果如图4-8所示。http://localhost:8080/ch04/math.jsp图4-8在JSP中进行数学运算的显示结果274.2.3声明在JSP中,声明(Declaration)是用来定义和初始化类成员变量或方法的部分。这些声明在JSP页面被编译成Servlet时,会被放置在Servlet类的顶部,作为类的成员变量或方法。声明部分使用<%!...%>标记包围,例如:<%!声明内容%>284.2.3声明◆声明变量定义类成员变量,这些变量在JSP页面生命周期内都是可用的,并且可以被页面中的其他部分(如Scriptlet、表达式或标签)访问。例如:<%!privateintcounter=0;%>294.2.3声明这个变量counter在整个JSP页面生命周期内都是可用的,并且可以在页面的其他部分被修改和访问。◆声明方法可以在JSP页面中定义辅助方法,辅助方法可以在页面的其他部分被调用,以执行特定的任务,如数据库操作、字符串处理等。例如:<%!publicStringgetGreeting(Stringname){return"Hello,"+name+"!";}%>304.2.3声明上例方法getGreeting()可以在JSP页面的其他部分被调用,以生成一个问候字符串。注意事项◆声明部分的内容会被编译到Servlet类中,因此它们具有与Servlet类成员相同的生命周期和访问权限。◆由于声明部分的内容在Servlet类中,所以它们不能访问JSP页面的局部变量或表达式语言(EL)变量。314.2.4Scriptlet在JSP页面中,Scriptlet是一种嵌入到HTML中的Java代码片段。它允许在JSP页面中直接编写Java代码,以动态生成网页内容。Scriptlet通常用于处理业务逻辑、访问数据库、操作JavaBean等。◆基本语法
Java代码在<%...%>这两个标签之间,基本上可以编写任何有效的Java代码。在JSP中嵌入Java代码的语法如下所示:<%//Java代码%>324.2.4Scriptlet(代码示例)用法实例◆打印输出到网页<%out.println("Hello,World!");%>334.2.4Scriptlet(代码示例)◆声明和初始化变量
下面示例代码用于在网页上显示变量值和字符串拼接结果。<%intnumber=10;Stringmessage="Thenumberis:"+number;out.println(message);%>344.2.4Scriptlet◆访问和操作JSP内置对象
JSP内置对象如request、response、session、application、out、config、pageContext、page和exception可以直接在Scriptlet中使用。例如:<%StringclientIP=request.getRemoteAddr();out.println("YourIPaddressis:"+clientIP);%>35上述实例代码可以获取客户端信息,运行后可以在网页上显示访问用户的IP地址。4.2.4Scriptlet◆简单的条件判断和循环
下面示例代码使用了循环语句,用于在网页上生成并显示带HTML格式的数字列表。<%for(inti=1;i<=5;i++){out.println("Number:"+i+"<br>");}%>364.2.5JSP指令
JSP指令是JSP页面中的特殊标记,它们为JSP页面提供全局指令,包括页面设置、包含其他文件、引入标签库等。JSP指令在JSP页面被转换为Servlet之前由JSP引擎处理,因此它们对最终生成的Servlet代码有直接的影响。◆基本语法
JSP指令的通用语法格式如下所示。<%@directiveattribute1="value1"attribute2="value2"...attributeN="valueN"%>37上述代码用于设置JSP页面的全局属性和行为。其中,directive是指令的名称,attribute1,attribute2,...,attributeN是指令的属性,它们用于提供指令所需的参数。4.2.5JSP指令常用的指令及其用法◆page指令
page指令用于定义与整个页面相关的配置信息,如导入Java类、设置页面编码、设置错误页面等。例如:<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.util.*,com.example.MyClass"%><%@pageerrorPage="error.jsp"%>38•language:指定页面中使用的脚本语言,默认是Java。•contentType:指定MIME类型和字符编码。•pageEncoding:设置页面中字符的编码方式。•import:导入Java类,与Java中的import语句类似,如果需要引入多个类,中间利用半角逗号“,”分隔。•errorPage:指定处理页面错误的JSP页面。4.2.5JSP指令◆include指令
include指令用于在JSP页面中包含另一个文件的内容。该指令在JSP页面被转换为Servlet之前就被处理,因此包含的文件内容会直接插入到包含指令的位置。例如:<%@includefile="header.jsp"%>39
file属性指定要包含的文件路径,可以是相对路径或绝对路径。4.2.5JSP指令◆taglib指令
taglib指令用于引入自定义标签库(TagLibrary),这样就可以在JSP页面中使用自定义标签了。例如:<%@tagliburi="jakarta.tags.core"prefix="c"%>40•uri:标签库的URI,用于唯一标识标签库。•prefix:在JSP页面中引用标签库时使用的前缀。4.2.5JSP指令注意事项◆JSP指令不区分大小写,但为了确保代码的可读性和一致性,建议按照惯例使用小写字母。◆指令在JSP页面中的位置没有严格要求,但通常放在页面的顶部,以便更容易阅读和维护。有些指令可以有多个属性,并且属性的顺序并不重要。◆通过使用JSP指令,可以灵活地配置JSP页面的行为,提高代码的可维护性和可读性。◆随着JSP技术的发展和最佳实践的形成,建议将业务逻辑和表现层分离,使用JSP作为视图层,配合Servlet、JavaBeans、JSP标准标签库(JSTL)等组件构建更健壮、可维护的Web应用程序。414.2.6JSP动作
JSP动作标签是JSP技术中用于在JSP页面中嵌入Java代码和控制服务器端行为的标签。这些标签由JSP标准标签库(JSTL)和其他自定义标签库提供,用于简化JSP页面的开发和管理。下面是常用的JSP动作标签及其用途。◆<jsp:include>在当前JSP页面中包含另一个资源(如JSP文件、Servlet、HTML文件等)。例如:<jsp:includepage="header.jsp"/>424.2.6JSP动作(代码示例)◆<jsp:forward>将请求转发到另一个资源(如JSP文件、Servlet等)。例如:<jsp:forwardpage="anotherPage.jsp"/>434.2.6JSP动作(代码示例)◆<jsp:param>用于向包含或转发的页面传递参数。常与<jsp:include>或<jsp:forward>一起使用。例如:<jsp:includepage="anotherPage.jsp"><jsp:paramname="user"value="Fu"/></jsp:include>444.2.6JSP动作(代码示例)◆<jsp:useBean>在JSP页面中声明和初始化一个JavaBean对象。例如:<jsp:useBeanid="user"class="com.example.User"scope="session"/>454.2.6JSP动作(代码示例)◆<jsp:setProperty>设置JavaBean对象的属性。例如:<jsp:setPropertyname="user"property="name"value="JohnDoe"/>464.2.6JSP动作(代码示例)◆<jsp:getProperty>获取JavaBean对象的属性值并输出到浏览器。例如:<jsp:getPropertyname="user"property="name"/>474.2.6JSP动作◆<jsp:plugin>生成用于在浏览器中嵌入JavaApplet或JavaBean的HTML<OBJECT>或<EMBED>标签。例如:<jsp:plugintype="applet"code="MyApplet.class"codebase="."width="300"height="300"><jsp:paramname="param1"value="value1"/></jsp:plugin>484.2.6JSP动作◆<jsp:element>和<jsp:attribute>动态创建XML/HTML元素(JSTL1.2引入),并设置其属性和内容。这些标签不常用于传统的JSP页面开发,但在动态生成复杂标记时非常有用。例如:<jsp:elementname="div"><jsp:attributename="class"value="myClass"/><jsp:body>Thisisadynamicallycreateddivelement.</jsp:body></jsp:element>494.2.6JSP动作
JSP动作标签使得JSP页面开发更加灵活和模块化,通过将逻辑和显示分离,提高了代码的可维护性和可读性。然而,随着JavaEE技术的发展,越来越多的开发者倾向于使用Servlet、MVC框架(如SpringMVC)和JSP标准标签库(JSTL)替代或扩展传统的JSP动作标签,以实现更加清晰和高效的Web应用开发。504.2.7注释◆注释类型在JSP中,注释是开发者用来在代码中添加说明或备注而不影响程序执行的重要工具。JSP支持三种类型的注释,每种类型都有其特定的用途和语法。◆HTML注释
HTML注释在生成的HTML页面中可见,它们同样会被服务器原样发送到浏览器。虽然在浏览器渲染时不可见,但用户通过“查看网页源代码”可以看到此注释内容。因此,绝不能在HTML注释中保存敏感信息。例如:<!--这是一个HTML注释-->514.2.7注释◆JSP注释
JSP注释被服务器处理,但不会被发送到浏览器。这意味着浏览器无法看到这些注释。JSP注释通常用于在JSP页面中添加说明,这些说明有助于程序员维护和理解代码。例如:<%--这是一个JSP注释--%>524.2.7注释◆Java注释当在JSP页面中嵌入Java代码时(例如在脚本元素<%...%>中),可以使用Java的注释规则。Java支持单行注释和多行注释。◆单行注释
JSP中的Java单行注释的语法格式如下所示,用于在脚本代码中添加说明文字。<%//这是一个Java单行注释%>534.2.7注释(代码示例)◆多行注释
JSP中的Java多行注释的语法格式如下所示,用于在脚本代码中添加说明文字。<%/*这是一个Java多行注释,并且可以跨越多行*/%>544.2.7注释◆应用场景•HTML注释:用于注释发送到浏览器的HTML元素或结构,辅助前端开发人员理解代码。•JSP注释:用于服务器端代码或混合HTML/JSP代码中的注释,这些注释不会被发送到浏览器。•Java注释:用于JSP页面中的Java代码部分(即Scriptlet),根据注释的类型(单行、多行)提供不同级别的说明。注意事项◆安全性:虽然JSP注释不会被发送到浏览器,但应谨慎使用,避免在注释中泄露敏感信息。◆可读性:合理使用注释可以提高代码的可读性和可维护性,但过多的注释可能会使代码变得难以阅读。◆一致性:在项目中保持一致的注释风格和实践,有助于提高团队协作效率和代码质量。554.2.8语句◆输出语句表达式<%="hellojsp"%>就相当于输出语句<%out.println("hellojsp");%>,其中out是jsp的隐式对象,可以直接使用。例如:<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"import="java.util.*"%><%="hellojsp"%><br><%out.println("hellojsp");%>【注意】<%=%>不需要分号结尾,而<%%>和Java代码一样,需要以分号结尾。另外,JSP一共有9种隐式对象,具体用法请参考“JSP隐式对象”小节的内容。564.2.8语句◆循环语句结合循环语句for在JSP里输出HTML是常见的做法。只是初学者可能会感觉写法比较复杂。类似地,在JSP中,还可以嵌入Java的if-else语句。清单4-9所示的代码是一个使用循环语句的实例。574.2.8语句(清单4-9for.jsp)<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"import="java.util.*"%><%
//初始化一个字符串列表用于存储单词List<String>words=newArrayList<String>();
//向列表中添加单词words.add("I");words.add("like");words.add("Java");words.add("Web");%><tablewidth="200px"align="center"border="1"cellspacing="0"><%for(Stringword:words){%><tr><td><%=word%></td></tr><%}%></table>584.2.8语句上述代码显示结果如图4-9所示。http://localhost:8080/ch04/for.jsp图4-9在JSP中使用循环语句的显示结果594.3页面包含访问包含统一底部的网站首页,如图4-10所示,每个网页的底部都有版权声明等信息。如果不使用页面包含语句,那么每个网页都需要单独编写,如果版权声明要修改,则需要很大的工作量。使用include的办法,只需要准备一个footer.jsp,然后在其他页面包含footer.jsp即可。如果需要对声明信息进行修改的时候,只需要修改footer.jsp页面,降低维护成本。图4-10包含版权页脚的网站首页604.3页面包含(清单4-10footer.jsp)创建一个底部版权信息JSP页面footer.jsp,代码如清单4-10所示。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.util.*"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>网页版权信息</title></head><body>©.Allrightsreserved.</body></html>614.3页面包含上述代码显示结果如图4-11所示。http://localhost:8080/ch04/footer.jsp图4-11样例网站底部版权信息624.3页面包含(清单4-11body.jsp)然后,创建一个网页主体信息的JSP页面,代码如清单4-11所示。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"import="java.util.*"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title></title></head><body><div>学者网主体信息</div></body></html>634.3页面包含上述代码显示结果如图4-12所示。http://localhost:8080/ch04/body.jsp图4-12样例网站主体信息【注意】在实际项目中,被包含的JSP片段应省略结构标签,以避免产生不规范的嵌套HTML。644.3页面包含下面分别使用include指令(directive)和include动作(action)两种方式,将footer.jsp中的内容,插入到body.jsp中,并且分别保存到新的JSP文件中,文件名为body_directive.jsp和body_action.jsp。◆include指令通过指令<%@includefile="footer.jsp"%>引入,代码如清单4-12所示。654.3页面包含(清单4-12body_directive.jsp)<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title></title></head><body><div>学者网主体信息</div><%@includefile="footer.jsp"%></body></html>664.3页面包含上述代码显示结果如图4-13所示。http://localhost:8080/ch04/body_directive.jsp图4-13include指令显示效果674.3页面包含(清单4-13body_action.jsp)◆include动作通过动作<jsp:includepage="footer.jsp"/>引入,代码如清单4-13所示。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title></title></head><body><div>学者网主体信息</div><jsp:includepage="footer.jsp"/></body></html>684.3页面包含上述代码显示结果如图4-14所示。http://localhost:8080/ch04/body_action.jsp图4-14include动作显示效果694.3页面包含◆两者区别通过上节的实例,include指令和include动作从显示效果上看不到区别,但是实际上这两者是有以下区别:指令<%@includefile="footer.jsp"%>,footer.jsp的内容会被嵌入到body_directive.jsp转译成的body_directive_jsp.java中,最后只会生成一个body_directive_jsp.java文件。这一特点存在一个问题,如果的包含和被包含的两个页面中,存在同一变量名的变量,如果这两个页面被编译成同一个Java文件,则相当于重复定义了一个变量,这在语法上是不允许的,因为访问该页面时,会发生错误。704.4页面跳转在JSP中,页面跳转是指将用户从一个JSP页面重定向到另一个页面。这通常是通过发送一个HTTP重定向响应给浏览器实现的,或者在某些情况下,可以通过服务器端转发实现。下面是JSP页面跳转的两种主要方法。首先准备redirect_client.jsp和redirect_server.jsp,分别演示浏览器跳转和服务端跳转到前面小节创建的hello.jsp文件。714.4.1浏览器跳转(清单4-14redirect_client.jsp)
JSP的浏览器跳转的机制与Servlet相同,代码如清单4-14所示。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>浏览器跳转</title></head><body><%response.sendRedirect("home.jsp");%></body></html>724.4.1浏览器跳转
如图4-15所示,可以通过浏览器的调试工具观察到访问redirect_client.jsp返回302(重定向),然后进行了第二次请求返回200(请求成功),直接转到页面home.jsp,而且浏览器地址栏也显示成了http://localhost:8080/ch04/home.jsp。图4-15开发者工具中的HTTP重定向记录http://localhost:8080/ch04/redirect_client.jsp734.4.2服务端跳转(清单4-15redirect_server.jsp)
JSP可以使用清单4-15所示的代码实现服务器跳转。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>服务器跳转</title></head><body><%request.getRequestDispatcher("home.jsp").forward(request,response);%></body></html>744.4.2服务端跳转上述代码显示结果如图4-16所示。http://localhost:8080/ch04/redirect_server.jsp图4-16服务器跳转过程状态754.4.2服务端跳转(代码示例)在该实例中,跳转的语句也可以改为动作的方法,简化代码。例如:<jsp:forwardpage="home.jsp"/>764.5JSP隐式对象
JSP的隐式对象指的是不需要显示定义,直接就可以使用的对象,比如前面所述的request和response。JSP一共有9个隐式对象,分别是:request、response、out、pageContext、session、application、page、config和exception。774.5.1request、response、out(1)◆request
request代表请求,request对象是jakarta.servlet.http.HttpServletRequest类的实例。每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的request对象代表这个请求。request对象提供了一系列方法获取HTTP头信息,Cookie,HTTP方法等。◆response
response代表响应,response对象是jakarta.servlet.http.HttpServletResponse类的实例。当服务器创建request对象时会同时创建用于响应这个客户端的response对象。response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的Cookie,时间戳,HTTP状态码等。784.5.1request、response、out(2)◆out
out代表输出,out对象是jakarta.servlet.jsp.JspWriter类的实例,用来在response对象中写入内容。最初的JspWriter类对象根据页面是否有缓存进行不同的实例化操作。可以在page指令中使用buffered='false'属性轻松关闭缓存。JspWriter类包含了大部分java.io.PrintWriter类中的方法。不过,JspWriter新增了处理缓存的方法。另外,JspWriter类会抛出IOException异常,而PrintWriter则不会。794.5.2pageContext、session、application◆pageContext
pageContext代表当前页面作用域。pageContext对象是jakarta.servlet.jsp.PageContext类的实例,用来代表整个JSP页面。这个对象主要用来访问页面信息,同时过滤掉大部分实现细节。这个对象存储了request对象和response对象的引用。application对象,config对象,session对象,out对象可以通过访问这个对象的属性导出。
pageContext对象也包含了传给JSP页面的指令信息,包括缓存信息,ErrorPageURL,页面scope等。PageContext类定义的字段包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE,APPLICATION_SCOPE。804.5.2pageContext、session、application
pageContext也提供了40余种方法,有一部分继承自jakarta.servlet.jsp.JspContext类。其中一个重要的方法就是removeAttribute(),它可接受一个或两个参数。比如,pageContext.removeAttribute("attrName")移除四个scope中相关属性,但是还可以只移除特定scope中的相关属性,例如:pageContext.removeAttribute("attrName",PAGE_SCOPE);814.5.2pageContext、session、application◆session
session代表当会话作用域。session对象是jakarta.servlet.http.HttpSession类的实例。和Javaservlet中的session对象有相同的行为。session对象用来跟踪在各个客户端请求之间的会话。在后续内容中,本书将详细介绍session的用法。◆application
application代表当全局作用域。application对象直接包装了servlet的ServletContext类的对象,是jakarta.servlet.ServletContext类的实例。这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestroy()方法的调用而被移除。通过向application中添加属性,则所有组成Web应用的JSP文件都能访问到application的属性。824.5.3page、config、exception◆page
page对象即表示当前对象,JSP会被编译为一个Servlet类,运行的时候是一个Servlet实例。page即代表this。例如:<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"import="java.util.*"%>page:<%=page%><br>this:<%=this%>834.5.3page、config、exception◆config
config对象是jakarta.servlet.ServletConfig类的实例,直接包装了servlet的ServletConfig类的对象。config可以获取在web.xml中初始化的参数。这个对象允许开发者访问Servlet或者JSP引擎的初始化参数,比如文件路径等,例如:config.getServletName();844.5.3page、config、exception◆exception
exception对象只有当前页面的<%@page>指令设置为isErrorPage="true"的时候才可以使用。同时,在其他页面也需要设置page指令的errorPage属性指定一个专门处理异常的页面。
编写try.jsp文件,设置errorPage="catch.jsp",表示有异常产生的话,就交给catch.jsp处理,在里面编写数组越界异常的代码。代码如清单4-16所示。854.5.3page、config、exception(清单4-16try.jsp)<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageerrorPage="catch.jsp"%><%int[]a=newint[10];a[20]=5;%>864.5.3page、config、exception(清单4-17catch.jsp)
编写catch.jsp文件,设置isErrorPage="true",表示当前页面可以使用exception对象。代码如清单4-17所示。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"isErrorPage="true"%><%=exception%>874.5.3page、config、exception访问try.jsp时,代码a[20]=5;会故意触发一个ArrayIndexOutOfBoundsException(数组越界异常)。由于page指令设置了errorPage="catch.jsp",JSP容器会捕获这个异常,并自动将请求转发到catch.jsp页面。catch.jsp页面因为设置了isErrorPage="true",所以它可以使用隐式对象exception来获取并显示try.jsp抛出的具体异常信息,从而实现自定义的错误展示。884.6JSP作用域在JSP中,作用域是指变量的可见范围和存储位置。JSP中有四种作用域,它们的名称和相关特点如下。◆页面作用域页面作用域(PageScope)只在当前JSP页面内部可见,因此适合存储只在单个页面中使用的数据。在JSP页面内定义的变量默认是PageScope作用域。这些变量可以通过隐式对象pageContext访问。代码如清单4-18所示。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%--下面的代码可以设置一个页面作用域的属性。--%><%pageContext.setAttribute("PI",3.14F);%><%--下面的代码可以获得实例中页面作用域的属性。--%><%=pageContext.getAttribute("PI")%>894.6JSP作用域上述代码显示结果如图4-17所示。http://localhost:8080/ch04/scope_page.jsp图4-17页面作用域实例904.6JSP作用域(1)◆请求作用域请求作用域(RequestScope)是在一次HTTP请求中有效的作用域,适合存储在一次请求的多个页面或组件中需要共享的数据。在请求Servlet或JSP中定义的变量可以存储在RequestScope中。这些变量可以通过隐式对象request访问。◆会话作用域会话作用域(SessionScope)是在一次会话中有效的作用域,适合存储需要在多个请求之间共享的数据。这些数据可通过Session对象或JSP页面的session作用域进行存储,并且可以通过隐式对象session访问。914.6JSP作用域(2)◆应用作用域应用作用域(ApplicationScope)是在整个Web应用程序生命周期中有效的作用域,适合存储全局数据。这些属性和变量可通过ServletContext对象或JSP页面中的隐式对象application进行存储,并能统一通过隐式对象application进行访问。在实际开发中,开发者应该根据变量的作用范围和生命周期,选择合适的作用域存储变量,避免出现数据错误或性能问题。924.7Cookie
Cookie是存储在浏览器的小型文本文件,通过Cookie,Web应用可以跟踪各种信息。比如在网页登录账号是,用户名、密码等信息就是Cookie。如图4-18所示,Cookie可以保存客户端的信息,比如用户在某个页面登录的相关信息可以保存在Cookie里面,当用户再次请求访问这个页面时,浏览器直接查找是否存在保存该用户信息的Cookie,如果有直接读取,从而避免再次访问服务器的繁琐过程。在用户登录新账号时,浏览器会弹出是否记住该账号,如果记住,直接修改对应Cookie的存活时间就可以了。某些网站,登录的时候,会出现一个选项,提问是否需要一段时间内保持登录状态。如果选择是,则在指定的时间内,不需要输入账号密码,这种功能就是利用Cookie实现的。
Cookie是一种浏览器和服务器交互数据的方式。Cookie是由服务器端或者客户端创建的“小型数据库”,但是不会保存在服务器。创建之后,发送给浏览器。浏览器保存在用户本地,下一次访问网站的时候,就会把该Cookie发送给服务器。934.7.1创建Cookie(清单4-19cookies_set.jsp)在ch04项目的webapp目录下创建cookies_set.jsp文件,代码如清单4-19所示。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="jakarta.servlet.http.Cookie"%><%Cookiec=newCookie("name","Fu");c.setMaxAge(24*60*60);c.setPath("/");response.addCookie(c);%><ahref="cookies_get.jsp">跳转到获取cookie的页面</a>944.7.1创建Cookie◆Cookiec=newCookie("name","Fu")创建了一个Cookie,名字是"name"值是"Fu"。c.setMaxAge(24*60*60)表示这个cookie可以保留一天,如果是0或者不设置,表示浏览器关闭时即销毁。◆c.setPath("/")表示访问该域名下的所有路径都会提交这个Cookie,如果是c.setPath("/scholat"),那么就表示访问/scholat路径的时候才会提交Cookie。◆response.addCookie(c)通过response把这个Cookie保存在浏览器端。◆如图4-19所示,访问JSP页面,可以通过调试工具可以在“网络→Cookie栏”观察到。http://localhost:8080/ch04/cookies_set.jsp图4-19在浏览器开发者工具中查看Cookie代码解析:954.7.2获取Cookie在JavaWeb开发中,JSP和JavaScript是两种常用的技术,它们都可以用来获取客户端的Cookie。不过,两者的工作方式有所不同。◆JSPScriptlet获取方法
JSP可以通过request.getCookies()方法获取所有的Cookie,然后遍历这些Cookie找到特定的Cookie。在ch04项目的webapp目录下创建cookies_get.jsp文件,代码如清单4-20所示。964.7.2获取Cookie(清单4-20cookies_get.jsp)<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="jakarta.servlet.http.Cookie"%><%Cookie[]cookies=request.getCookies();if(null!=cookies){for(intd=0;d<=cookies.length-1;d++){out.print(cookies[d].getName()+":"+cookies[d].getValue()+"<br>");}}%>974.7.2获取Cookie
Cookie[]cookies=request.getCookies()表示获取所有浏览器传递过来的Cookie,这里读取时,需要对cookies判空,否则会因为Cookie为null而程序出错。984.7.2获取Cookie然后访问cookies_get.jsp,可以看到name:Fu,这个在cookies_set.jsp中设置的Cookie。也可以通过浏览器看到在请求信息里提交了这个Cookie。如图4-20所示,JSESSIONID不是开发时设置的Cookie,这是Tomcat设置的Cookie。http://localhost:8080/ch04/cookies_get.jsp图4-20获取Cookie运行结果(含JSESSIONID)994.7.2获取Cookie◆JavaScript获取方法在JavaScript中,可以通过document.cookie属性获取所有的cookies,但document.cookie是一个字符串,它包含了所有Cookie,并且这些Cookie之间用分号和空格“;”分隔。每个Cookie通常包括名称、等号、值和可能的其他属性(如路径、域、过期时间等),但这些额外属性在通过document.cookie获取时通常不会以易读的方式呈现。由于document.cookie返回的是一个包含所有Cookie的字符串,并且没有直接的方法将其解析为一个对象或数组,因此需要编写代码解析这个字符串。清单4-21所示的代码演示了如何解析document.cookie字符串并获取特定的Cookie值,读取
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026事业单位工勤技能-湖南-湖南食品检验工一级(高级技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-湖南-湖南机械冷加工二级(技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-湖南-湖南假肢制作装配工三级(高级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-湖北-湖北水土保持工一级(高级技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-湖北-湖北农机驾驶维修工一级(高级技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-海南-海南热处理工三级(高级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-新疆-新疆计算机操作员一级(高级技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-四川-四川林木种苗工二级(技师)历年参考题库含答案详解3套试卷
- 2026年11月小雪知识课堂 初雪与诗意生活
- 2026年9月教师节 教师的光荣使命
- 2026年全国保安员资格考试全真模拟试卷及答案(共七套)
- 电商仓库拣货作业规范
- 期末综合模拟卷-2025-2026学年五年级数学下册(人教版)含答案
- 山东环保发展集团校招面笔试题及答案
- 2026年光大银行招聘考试题库与答案解析
- 大数据处理-第6章 图计算
- 内脚手架搭设专项方案
- 纤维艺术与编织
- 2026年湖南生物机电职业技术学院单招职业技能测试题库汇编
- 2025年度IT运维保障及系统故障清零工作总结
- 第25课《文言文二则:曹冲称象》课件 统编版语文六年级上册
评论
0/150
提交评论