Java 笔记(8)

JSP 技术

day8 JSP语法 + EL + JSTL

day9 案例 2-3 个 综合小案例

day10 Servlet+JSP 综合练习

为什么sun推出 JSP技术 ?

Servlet 生成网页比较复杂,本身不支持HTML语法,html代码需要通过response输出流输出,JSP支持HTML语法,生成HTML方便。

JSP技术与Servlet 技术区别和关系?

JSP和Servlet技术都是用来动态生成网页的,Servlet不支持HTML语法,生成网页麻烦,JSP支持HTML语法,生成网页方便,JSP运行时翻译Servlet 执行的。JSP 就是 Servlet 。

JSP运行原理是怎样的 ?

客户端访问编写JSP文件,服务器读取JSP文件,根据JSP生成Servlet ,Servlet编译运行 生成网页。

JSP <%! %> <%= %> <% %>

<%! %> 声明:定义翻译后Servlet程序的 全局变量或全局方法、内部类

<%= %> 表达式 输出内容到浏览器 效果out.print

<% %>  脚本代码块,嵌入java运行代码 ---- 不翻译

JSP翻译Servlet 存放tomcat/work 目录

* JSP翻译Servlet 页面当前所有HTML 翻译为 out.write 输出

JSP的注释 支持三种注释

1、JSP注释  <%-- --%>  只存在JSP文件源码中,在JSP翻译Servlet时,这类注释消失了

* 该类注释得不到执行

2、Java注释 /** */文档注释 /* */多行注释 // 单行注释

文档注释 /** */ 生成javadoc 主要用来注释 包、类、成员变量、成员方法  ------ 代码功能使用者

多行注释 和 单行注释 不会生成javadoc,注释代码实现逻辑 用于在方法内  ------ 程序员本身,读懂代码进行注释

* Java注释 在JSP翻译为Servlet时存在,在Servlet程序执行时,会被忽略,生成HTML网页源代码中不存在

* 在Servlet执行过程中被忽略

3、HTML注释 <!-- -->

* 在JSP翻译为Servlet时 会被翻译 out.print 在生成HTML页面源代码中该类注释 也是存在的

结论:JSP注释在翻译阶段消失,Java注释在Servlet运行阶段消失,HTML注释不消失

思考题:

<%

String s = "abcd";

%>

<!-- 用HTML注释 注释 JSP或者java代码  <%=s%> -->

在页面结果中 <!-- 用HTML注释 注释 JSP或者java代码  abcd -->

结论: HTML注释 无法阻止 JSP或者 Java代码执行的

JSP 指令 (JSP Directive)

page指令

include指令

taglib 指令

语法:<%@ 指令名称 属性=值 属性=值 ... %>

page指令用来定义JSP文件的全局属性 <% page 属性=值 %>

1、language 只能为java

2、extends JSP翻译后Servlet 继承父类,这个属性一般不设置 ,如果非要设置,继承类必须是Servlet实现类

3、session 定义JSP中是否可以直接使用Session隐含对象

如果属性设置为true在JSP翻译Servlet时 生成以下两句代码

HttpSession session = null;

session = pageContext.getSession();

* 如果jsp中想使用HttpSession对象,使用session属性默认值true

4、import 完成 JSP翻译后 Servlet 导包

jsp在翻译为Servlet 默认导包

import javax.servlet.*;

import javax.servlet.http.*;

import javax.servlet.jsp.*;

jre默认导入 java.lang

* 在jsp中如果使用类 不属于以上四个包,需要导包

5、buffer autoFlush 设置 out隐含对象属性

buffer 设置缓冲区大小

autoFlush 设置当缓冲区满后,自动刷出

6、isELIgnored 设置JSP是否执行EL表达式

isELIgnored="false" 不忽略---执行解析

isELIgnored="true" 忽略 ---- 不解析

* 一般就是默认值false

7、通过contentType和pageEncoding 设置 JSP页面编码

pageEncoding 是 JSP文件源代码在硬盘上编码集

contentType 在Servlet生成HTML 传递浏览器采用编码

8、通过errorPage 和 isErrorPage 控制 JSP页面发生错误时跳转

设置错误友好页面  ---- 当页面发生错误,不应该给用户看到含有代码错误页面,看到一个友好页面

通过errorPage指定 在页面发生错误跳转到哪个页面

* IE 浏览器默认好友页面 ,如果想看到自己编写友好页面,关闭IE默认友好页面

IE 工具栏 --- Internet选项 ----- 高级 -----显示友好HTTP错误信息  将钩去掉

在错误友好页面中,可以通过设置isErrorPage属性,获得错误原因

*在实际开发中,一般不使用上面讲解错误处理方式

错误页面第二种处理方式: 不仅可以处理500 ,还可以处理404

配置web.xml

<error-page>

<error-code>500</error-code>

<location>/demo5/500.jsp</location>

</error-page>

include指令 ,用来静态包含页面 ----- 将页面公共部分提取出来,通过include完成页面布局

语法:<%@ include file="文件路径" %>

include包含目标页面整个内容,被包含页面,不需要是一个完整HTML,只要编写HTML片段就可以了

静态include 原理

*在 JSP翻译为Servlet时,完成包含动作,Servlet程序并没有执行,包含路径不能用变量、不能含有?拼接参数,目标文件必须存在

* 存在特殊案例:被包含页面存在错误,只要包含后Servlet没有错误,就可以执行

taglib指令 ,用来在jsp页面引用标签库文件

* 定义标签作用为了简化 jsp页面开发

* 通过taglib 指令引入 jstl标签库 ,语法: <%taglib uri="" prefix="" %>

uri ---- 定义标签 唯一命名空间

prefixt ---- 命名空间前缀

引用jstl时,在导入jstl.jar中 META-INF/c.tld

<short-name>c</short-name>   -------- 就是prefix属性

<u r i > h t t p:  // j a v a . s un . co m / j s p/ j s t l/ c o r e </uri> ----- 就是uri属性

JSP的九个内置对象分别是什么?

什么是内置对象? JSP翻译为Servlet代码时,有些对象默认已经创建好的,这类对象可以直接在jsp中使用,内置对象

page、request、session、application、response、pageContext、out、config、exception

request        HttpServletRequest  ---- 请求对象

response HttpServletResponse  ---- 响应对象

session        HttpSession     ------- 会话对象

application        ServletContext   ------ web应用全局唯一对象

config        ServletConfig    ------ 初始化数据

page        this (HttpServlet)

pageContext        PageContext

exception        Throwable (所有异常父类)  ----- 当页面是一个错误页面,用exception获得异常信息

* Throwable 是 exception 类 父类

out        JspWriter

page 代表当前jsp生成Servlet对象

* page 是 Object类型,只能使用Object中方法 ---- 这个对象在开发中不建议 使用

* 可以将page强制转换 HttpServlet对象的

Servlet有几种数据范围? 三种: request、session、servletcontext

JSP 在 Servlet三种数据范围基础上,新添加page数据范围 ---- JSP 四种数据范围: page request session application

* page数据范围存放数据 只在当前jsp内有效

pageContext代表当前页面上下文

1、向page范围存取数据

findAttribute 依次在 page 、request 、session 、 application 四个数据范围进行数据查找

EL 中 ${name} 调用 findAttribute 在四个范围中依次查找数据

2、pageContext 用来 获得其它八个隐含对象

* pageContext封装八个隐含对象意义:框架编写,得到PageContext对象 相当于得到 JSP九个内置对象

out对象

out功能向浏览器输出信息,是JspWriter类型,内部使用PrintWriter实现,拥有独立缓冲区。

out创建 ,out对象通过pageContext对象获得,创建pageContext对象时,指定out缓冲区大小以及是否自动flush

* 通过 page指令 buffer autoFlush 设置out 缓存区大小 以及是否自动 flush

out向浏览器输出内容,response.getWriter 向浏览器输出内容 , 区别?

out.println("aaa");

response.getWriter().println("bbb");

out.print("ccc");

response.getWriter输出内容,在out输出内容之前

page request session application response out config pageContext exception

JSP指令和JSP标签 区分?

JSP 指令 Directive

JSP 标签 Action

jsp中六个动作标签

<jsp:useBean> <jsp:setProperty> <jsp:getProperty> ----- 与 JavaBean操作相关 明天学习

<jsp:include> <jsp:forward> <jsp:param >

<jsp:include> 效果 等价于 request.getRequestDispatcher().include

<jsp:forward> 效果 等价于 request.getRequestDispatcher().forward

<jsp:include> 标签 功能 等价于 <%@ include %>

原理:动态包含

语法:<jsp:include page="文件路径" />

被包含页面不需要完整html,只需要编写html片段

jsp:include 和 @include 区别

@include include指令, 静态包含,在jsp翻译为Servlet时,执行包含动作,包含结果是目标页面翻译Servlet源代码 ,翻译为一个Servlet一起执行

jsp include 标签,动态包含, 在index servlet执行时 完成包含动作,包含结果是目标jsp翻译Servlet生成 html页面结果,每个被包含jsp翻译单独Servlet进行执行

<jsp:forward page="/demo11/b.jsp"></jsp:forward> 等价于 request.getRequestDispatcher("/demo11/b.jsp").forward(request,response);

<jsp:forward page="/demo11/b.jsp">

<jsp:param value="itcast" name="name"/>

</jsp:forward>

上面写法用jsp传递一个参数,用jsp如果向传递参数,直接通过setAttribute

EL 表达式语言,来自民间 ,Servlet2.4 之后 EL 被纳入官方规范

功能:

1、EL 获得 JSP四个范围中保存数据 (访问JavaBean的属性)

2、EL 表达式支持运算

3、EL 内置 11个对象 --- web开发常用对象

4、EL 调用 java的方法

EL是从javaee1.4版本才被纳入规范,javaee1.3 及以前版本,默认对EL不进行解析

* 如果想 javaee1.3 以及之前版本解析 EL ------ 设置 page 属性 isELIgnored = false

1、使用EL 获得 jsp四个范围数据

使用EL指定查找四个范围数据 ${pageScope.属性名称} ${requestScope.属性名称} ${sessionScope.属性名称} ${applicationScope.属性名}

如果不执定查找数据范围 ${属性名称} ---- 调用pageContext.findAttribute 在四个范围依次查找

如果查找属性不存在,返回是一个 "" 空串,而不是null

获得数组、List、Map时 有些情况使用 [] 获得属性值

. 和 [] 有什么区别 ?

答案:. 和 [] 都可以用来取得EL 属性值,.可以实现功能 [] 都可以!

例如: ${pageScope.user.name} 也可以写为 ${pageScope.user["name"]}  (获得对象后,访问对象属性时才可以用 [] 取代.效果 )

[]  可以使用特殊标识信息,但是. 不可以

例如:

pageContext.setAttribute("0","itcast");

pageContext.setAttribute("aa.bb","春生泰克");

只能通过[] 进行访问 ----- 注意:在使用[] 进行属性取值时,加"" , 不加"" 认为是一个变量

在使用EL进行取值时,如果含有特使字符属性,尽量使用[] , 否则都使用. 就可以了

2、在EL 中执行 算术、比较、逻辑运算

在EL 执行运算时,运算语句必须写入 ${}中

* 在EL 获得属性值 执行算术运算,自动类型转换 ---- 执行算术运算时,进行运算参数,必须都是数字

${"a"+"b"} ---- 发生数字格式化错误

empty运算符

1) 判断一个属性是否存在 , 通常empty运算符都是结合c:if 一起使用

2) 使用empty 判断List 或者 Map是否为空 (size==0)

二元表达式:${user!=null?user.name:""}  ----- 三元运算符

3、EL 11个内置对象

pageScope requestScope sessionScope applicationScope 四个数据范围,用来取值

pageContext 当前jsp上下文 ----- ${pageContext.request.contextPath }

${param.name} 等价于 request.getParameter("name")

${paramValues.hobby} 等价于 request.getParameterValues("hobby")

${header.referer} 等价于 request.getHeader("referer")

${headerValues["Accept-Encoding"]} 等价于 request.getHeaders("Accept-Encoding")

${initParam.name} 等价于 getServletContext().getInitParamter("name")

必须掌握cookie隐含对象写法

Cookie[] cookies = request.getCookies();

if(cookies==null){

out.println("cookie不存在!");

}else{

for(Cookie cookie : cookies){

if(cookie.getName().equals("address")){

out.println(cookie.getValue());

}

}

}

使用EL : ${cookie.address.value }

4、EL获取数据值,经常需要对取得数据值进行处理 ----- EL函数

步骤:

第一步:编写java类,提供static方法

第二步:编写tld文件 ,在tld文件中对函数进行定义描述

sun在jstl中提供一套EL函数库,这套函数在导入jstl的jar包后,可以直接使用

1) 导入jstl.jar

2) 在JSP页面内,引入函数库名称空间

<%@ taglib u r i = " h t t p : / /  j a v  a. s u  n.  c o m / j sp / j s t l / f u n c t i o n s "  p r e f i x = " f n" %>

* 在jstl.jar 存在 META-INF/fn.tld 当中定义EL函数库

3) sun提供EL函数库主要对字符串进行操作 提供16个函数

语法:${fn:toUpperCase(‘asdasDSFSDF‘)}

外包项目,jsp内部不允许定义脚本元素 <%%>  ----- 必须用标签库和表达式语言 实现<%%> 代码效果

使用jstl步骤

1、去官网上下载jstl的jar  1.0 1.1 1.2

1.1和1.2 基本一样 Servlet2.4(javaee1.4 ) 以后提出的

1.0 在 javaee1.3 之前提出的

* EL 在 javaee1.4 这个版本 纳入规范的 , jstl1.0 时 EL还没有纳入规范,所有1.0标签默认不支持EL 的

2、jar包导入

jstl1.1 两个jar jstl.jar standard.jar ----- jstl.jar 接口API standard.jar 代码实现

将两个jar包 复制工程/WebRoot/WEB-INF/lib 目录中

3、在jsp页面内 通过taglib指令 引入jstl 标签库对应uri

JSTL分为五类:core核心标签 fmt国际化标签 sql数据库标签 xml操作xml标签 fn是EL函数库

因为数据库操作和xml操作,都将代码编写Servlet中 ,所以 sql标签库和xml标签库不学习了

每个标签库在jar/META-INF/ 对应一个tld文件

例如:c.tld 是jstl1.1版本的 c-1_0.tld 是 jstl1.0 版本标签库

<%@taglib u r i = " h t t p : / /j a  va  .s u n . c o m / j s p /  js t l / c o re  " prefix="c" %>  导入1.1

<%@taglib u r i = " h t t p : //  ja v a . s u n . c  om /j s t l / c o r e "    pr e f i x ="c" %> 导入1.0  不支持EL

<%@taglib u r i = " h t t p: / / j a v a. s u n . c o m / j s t l / c o re _ r t "   p r e f i x =  "c "   % >  导入1.0 支持EL

*  /jstl/demo.jsp(15,0) According to TLD or attribute directive in tag file, attribute test does not accept any expressions

12个核心标签库标签

1、c:out 用于将内容输出到页面上 -------  输出EL值、提供默认值、HTML转义输出功能

2、c:set 用于设置一个变量或者属性 ----  向四个数据范围保存一个数据,对四个数据范围一个已经存在对象修改其属性值

3、c:remove 用于移除四个数据范围的数据

4、c:catch 相当于try -- catch代码块  ----- 捕获异常,将异常对象保存page指定属性中

5、c:if 取代页面if 条件判断

6、c:choose c:when c:otherwise 实现if -- else if -- else效果 --- 实现 switch 效果

7、c:forEach 实现 foreach循环效果  ----- 遍历数组、List、Map、控制指定循环次数求和、在特殊次数进行操作

8、c:forTokens 完成字符串切割

9、c:param 不能单独使用,通常与url相关标签一起使用 ,与c:url一起使用完成中文编码

10、c:import 导入目标页面,将目标页面内容保存起来,再进行使用

11、c: u r l  完成URL重写 (客户端禁用cookie ,URL重写拼接jSessionId),结合param对中文进行u r  l编码

12  c:redirect 标签用于实现请求重定向

常用:c:set c:if c:forEach c:url进行中文url编码 c:redirect

总结:

1、JSP 和Servlet关系

2、JSP运行原理

3、JSP 脚本元素三种 <%! %> <%=%> <% %>

4、JSP三种注释

5、page指令 contentType和pageEncoding区别

6、错误友好页面 web.xml 配置

7、<%@include %> 与 <jsp:include> 原理区别

8、<jsp:forward>转发 <c:redirect>重定向

9、EL 获取数据 . []用法

10、empty not 使用

11、${pageContext.request.contextPath } 取得工程名 /day08  ----- ${cookie.name.value } 快速获得cookie值

12、EL 使用 JSTL提供EL函数库

13、JSTL 区分1.0 和 1.1

14、常用core标签

c:set 、c:if 、c:forEach 、c:  u r l和c:param编码、 c:redirect

Java 笔记(8),布布扣,bubuko.com

时间: 2024-12-25 06:36:13

Java 笔记(8)的相关文章

15.1-全栈Java笔记:Java事件模型是什么?事件控制的过程有哪几步??

应用前边两节上一章节的内容,大家可以完成一个简单的界面,但是没有任何的功能,界面完全是静态的,如果要实现具体功能的话,必须要学习事件模型. 事件模型简介及常见事件模型 对于采用了图形用户界面的程序来说,事件控制是非常重要的. 一个源(事件源)产生一个事件并把它(事件对象)送到一个或多个监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接收,监听器将处理这些事件. 一个事件源必须注册监听器以便监听器可以接收关于一个特定事件的通知. 每种类型的事件都有其自己的注册方法,一般形式为: v

13.1-全栈Java笔记:打飞机游戏实战项目|AWT技术|MyGameFrame

简介和项目目标 通过游戏项目学习整个Java基础知识体系,我们做了精心的设计,让每一章知识都能获得应用. 比如:多线程用来实现动画效果.容器实现对于多发炮弹的存取和处理.常用类等等的应用. 寓教于乐,让大家迅速入门,更希望通过喜闻乐见的小游戏,让大家爱上编程,爱上"程序员". 老鸟建议 很多朋友会疑惑:"游戏项目,又不能拿到企业面试中,为什么要讲?" 这是一种太过于功利的想法.就像,我们说:"今天吃个馒头,又不是长高,为什么要吃呢?" 游戏项目的

Java笔记---部署 JavaWeb 项目到云服务器

一.前言 前面我们已经尝过了在云服务器上部署代码的甜头了,现在主菜就要上场了,那就是将我们的 JavaWeb 项目部署到云服务器上.兴奋吧?淡定淡定~ 二.项目部署 我们对于 Java Web 项目在本地机器(无论是 Windows 还是 Linux)上的部署已经了然于心了,那么对于在云服务器上部署 Java Web 项目又是如何操作的呢? 其实很简单,还是离不开 Web 项目部署的那三点: ① 基础的 JDK 环境 ② 一个 Web 服务器.如 Tomcat.JBoss ③ 一款数据库.如:m

JAVA 笔记 七

JAVA笔记七 this:就代表本类的对象,this代表它所在函数所属对象的引用简单说:那个对象在调用this所在的函数,this就代表那个对象静态:static 用法:是一个修饰符,用于修饰成员(成员变量,成员函数)当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用.类名.静态成员static特点1.随着类的加载而加载2.优先于的对象存在3.被所有对象所共享4.可以直接被类名所调用实例变量和类变量的区别:1.存放位置. 类变量随着类的加载而存在与方法区中. 实例

JAVA笔记六

JAVA笔记总结六 把大象放入冰箱的几步: 面向对象的三个特征:封装,继承,多态 JAVA开发实际上就是找对象使用,没有对象就创建一个对象 找对象,建立对象,维护对象的关系 类和对象的关系:类是对现实生活中实物的描述: 对象就是这类事物,实实在在存在的个体 匿名对象:匿名对象可以作为参数进行传递也可以作为对象方法进行一次调用

java 笔记 String 和Stringbuffer

String 是一个类,而不是java中的基本数据类型. String s = "abc";  "abc"是一个对象,存放在常量池中.一旦被初始化就不能被更改了. s = "cde";  这里并没有改变字符串,而是使对象引用指向字符串cde: String s1 = new String("abc"); String s2 = "abc"; 这两者有什么不同,第一个有两个对象,一个是"abc&qu

14.5-全栈Java笔记:java.awt这些布局怎么写?|流式|边界|网格

布局管理器 读者会发现,如果使用坐标定位法(空布局),在一个比较复杂的界面上定位每个控件的坐标是一个非常麻烦的工作,而且在界面大小发生改变时,控件的绝对位置也不会随之发生改变.那么如果我们想让用户界面上的组件可以按照不同的方式进行排列怎么办?例如:可以依序水平排列,或者按网格方式进行排列等,其实每种排列方案都是指组件的一种"布局",要管理这些布局,就需要本节学习的布局管理器. 管理布局的类由java.awt包来提供,布局管理器是一组实现java.awt.LayoutManager接口的

14.4-全栈Java笔记: javax.swing常用控件有哪些?怎么用?

常用基本控件 javax.swing.JButton 在图形界面程序中,按钮可能是使用量最大的控件之一,javax.swing包中JButton类就是用来创建按钮的.如表1所示,为JButton常用的构造方法.  javax.swing.JLabel JLabel控件是最简单的Swing组件之一,用于在窗体上显示标签, JLabel既可以显示文本,也可以显示图像.如表3所示,为JLabel常用的构造方法. 注意: JLabel只能用于显示文本和图标信息,用户不能对其进行修改. javax.swi

13.3-全栈Java笔记:打飞机游戏实战项目|PaintThread|launchFrame

多线程和内部类实现动画效果 1)增加绘制窗口的线程类 前三个版本,我们步步为营,每个小版本都有功能的突破.但是,目前为止我们的窗口仍然是静态的,并没有像真正的游戏窗口那样"各种动.各种炫".本节我们结合多线程实现动画效果. 我们在MyGameFrame类中定义"重画窗口线程PaintThread类",为了方便使用MyGameFrame类的属性和方法,我们将PaintThread定义成内部类. [示例1]MyGameFrame类:增加PaintThread内部类 pu

4.6-全栈Java笔记:THIS关键字和STATIC关键字

this关键字 对象创建的过程和this的本质 构造方法是创建java对象的重要途径,通过new关键字调用构造器时,构造器也确实返回了该类的对象,但这个对象并不是完全由构造器负责创建的.创建一个对象分为如下四步: 1. 分配对象空间,并将对象成员变量初始化为0或空 2. 执行属性值的显示初始化 3. 执行构造方法 4. 返回对象的地址给相关的变量 this的本质就是"创建好的对象的地址"!  由于在构造方法调用前,对象已经创建.因此,在构造方法中也可以使用this代表"当前对