动态网页开发技术之JSP(Java Server Pages),惊喜

}

%>

浏览器输出为:

在这里插入图片描述

4.3 注释


1)HTML注释

html注释会被翻译到java 源代码中。在_jspService 方法里,以out.writer 输出到客户端。

2)Java注释

<%

// 单行java 注释

/* 多行java 注释*/

%>

java 注释会被翻译到java 源代码中。

3)Java注释

<%-- 这是jsp 注释–%>

jsp 注释可以注掉,jsp 页面中所有代码。

示例

接下来,我们利用真实的代码来示例。

示例:我们在web目录下新建一个script.jsp的文件,在其中写下如下的代码,其中分别写上了三种不同的注释方法。

<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

Title

<%//这是Java注释%>

<%–这是JSP注释–%>

然后,我们打开翻译后的Java源代码,可以看到三种注释方法在翻译后的状态与如上描述一致:

在这里插入图片描述

5 JSP的九大内置对象

===============================================================================

JSP中的内置对象,是指Tomcat在翻译JSP页面成为Servlet 源代码后,内部提供的九大对象。此时翻译而来的Java源代码就是由这九大内置对象组合而成的。

| 内置对象 | 功能 |

| — | — |

| request | 请求对象 |

| response | 响应对象 |

| pageContext | JSP的上下文对象 |

| session | 会话对象 |

| application | ServletContext对象 |

| config | ServletConfig对象 |

| out | JSP输出流对象 |

| page | 指向当前JSP的对象 |

| exception | 异常对象 |

打开上一章中翻译由JSP翻译而来的Java源代码如下所示,可以看到JSP的九大内置对象分别处于下图的位置:在这里插入图片描述

6 JSP的四大域对象

==============================================================================

域对象是可以像Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围。首先说明这四大域对象是属于九大内置对象的,四个域对象分别为:

| 域对象 | 所属类 | 作用域 |

| — | — | — |

| pageContext | PageContextImpl类 | 只在当前JSP页面范围内有效 |

| request | HttpServletRequest类 | 一次请求内有效 |

| session | HttpSession类 | 一个会话范围内有效(即打开浏览器访问服务器到关闭浏览器) |

| application | ServletContext类 | 整个web 工程范围内都有效(只要web工程不停止,数据都在) |

接下来,我们书写代码来说明以上表格。现在,我们在web目录下新建两个JSP文件,分别命名为scope1.jsp与scope2.jsp,代码分别为:

scope1.jsp

<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

Title

scope1.jsp页面

<%

//首先是在各个域中存放数据

pageContext.setAttribute(“key”,“pageContext”);

request.setAttribute(“key”,“request”);

session.setAttribute(“key”,“session”);

application.setAttribute(“key”,“application”);

%>

pageContext域是否有值:<%=pageContext.getAttribute(“key”)%>

requset域是否有值:<%=request.getAttribute(“key”)%>

session域是否有值:<%=session.getAttribute(“key”)%>

application域是否有值:<%=application.getAttribute(“key”)%>

<%

//这一段代码表示的是请求转发

//其中的"/“代表的是表示为"http://ip:port/工程路径/” 即映射到代码的web目录

request.getRequestDispatcher(“/scope2.jsp”).forward(request,response);

%>

scope2.jsp

<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

Title

scope1.jsp页面

pageContext域是否有值:<%=pageContext.getAttribute(“key”)%>

requset域是否有值:<%=request.getAttribute(“key”)%>

session域是否有值:<%=session.getAttribute(“key”)%>

application域是否有值:<%=application.getAttribute(“key”)%>

此时,我们运行Tomcat服务器。

操作一:当scope1.jsp中不加入请求转发时,通过浏览器网址打开/scope1.jsp,发现控制台输入四个域对象。

在这里插入图片描述

操作二:在/scope1.jsp中加入请求转发后,通过浏览器网址打开/scope1.jsp,发现控制台输入三个域对象(pageContext没有了,因为其仅在JSP页面范围内有效。那为什么request还有呢,因为此时是请求转发,算是一次请求)。

在这里插入图片描述

操作三:直接通过浏览器网址打开/scope2.jsp,发现控制台只输出如下二个域对象,这是因为这是第二次请求,所以request域中也不存在值了。

在这里插入图片描述

操作四:此时把浏览器一关,再通过浏览器网址打开/scope2.jsp,就会发现session的域也不见了。

操作五:重新部署后,通过浏览器网址打开/scope2.jsp会发现application也没了

虽然四个域对象都可以存取数据。在使用上它们是有优先顺序的。四个域在使用的时候,优先顺序分别是,他们从小到大的范围的顺序。这是为了减轻运存。

7 out输出对象与response.getWriter输出对象的区别

======================================================================================================

7.1 out与response.getWriter的选择


首先说明,这两大对象也是属于九大对象的。

如果在代码中out.write后不加入out.flush()的操作,那么无论out.write放在代码中的什么位置,其都是在最后输出的。原因如下图所示(看图片左下角):

在这里插入图片描述

接下来,我用一段代码来说明这个问题,新建JSP文件,敲入代码如下:

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

Insert title here

<%

// out 输出

out.write(“这是out 的第一次输出
”);

// out flush 之后。会把输出的内容写入writer 的缓冲区中

out.flush();

// 最后一次的输出,由于没有手动flush,会在整个页面输出到客户端的时候,自动写入到writer缓冲区

out.write(“这是out 的第二次输出
”);

// writer 的输出

response.getWriter().write(“这是writer 的第一次输出
”);

response.getWriter().write(“这是writer 的第二次输出
”);

%>

会发现浏览器页面的输出如下所示,验证了上述结论。

在这里插入图片描述

7.2 out.write()与out.print()的选择


在JSP的%~%中输入out,可以看到out是JspWriter抽象类的方法,所以,我们在src中输入JspWriter,然后右键选择Generator,查看它的实现类,开始阅读它的源代码。

会发现,其中的out.write()输出的是字符串,如果参数不是字符串,则会强制转化为字符串,这就造成了一个问题,因为Java的字符串强制转化是根据ASCII码来的,参数1强制转化后并不是字符串1,而是对应ASCII码中的值。

这会对我们的代码产生影响,结论为:

| 方法 | 输出 |

| — | — |

| out.write() | 输出字符串没有问题 |

| out.print() | 输出任意数据都没有问题(都会转换成为字符串后,再调用的write输出) |

所以,未防止出现错误,在jsp 页面中,应该统一使用out.print()来进行输出。

8 JSP的常用标签

=============================================================================

8.1 包含


为什么要使用包含?

因为,一个JSP页面上会有成千上万条代码,如果不加入包含的话,想要修改某些代码,就需要在这么多代码里面寻找,可想而知工作量是多么巨大。包含就像是将某一个固定功能代码 抽离出去,这样,在这些特定时刻就只要修改这些代码就可以了。

在这里插入图片描述

8.2 静态包含与动态包含


静态包含的代码为:<%@ include file="/include/include2.jsp"%>

动态包含的代码为:<jsp:include page="/include/include2.jsp"></jsp:include>

我在web/include下建立两个include1.jsp与include2.jsp文件,分别如下所示:

include1.jsp

<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

Title

<%–

<%@ include file=“”%> 就是静态包含

file 属性指定你要包含的jsp页面的路径

地址中第一个斜杠 / 表示为http://ip:port/工程路径/ 映射到代码的web目录

静态包含的特点:

1、静态包含不会翻译被包含的jsp页面。

2、静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出。–%>

<%@ include file=“/include/include2.jsp”%>

<%–

<jsp:include page=“”></jsp:include> 这是动态包含

page 属性是指定你要包含的jsp页面的路径

动态包含也可以像静态包含一样。把被包含的内容执行输出到包含位置

动态包含的特点:

1、动态包含会把包含的jsp页面也翻译成为java代码

2、动态包含底层代码使用如下代码去调用被包含的jsp页面执行输出。

JspRuntimeLibrary.include(request, response, “/include/footer.jsp”, out, false);

3、动态包含,还可以传递参数

–%>

<jsp:include page=“/include/include2.jsp”>

<jsp:param name=“username” value=“sharm”/>

<jsp:param name=“password” value=“123456”/>

</jsp:include>

include2.jsp

<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

Title

hello, Sharm!

you password is <%request.getParameter(“password”);%>

这个时候,当我们仅运行include1.jsp文件时,依然会出现如下所示的页面:

在这里插入图片描述

总结:

| 作用 | 静态包含 | 动态包含 |

| — | — | — |

| 是否生成java文件 | 不生成 | 生成 |

| service方法中的区别 | 把包含的内容原封拷贝到service中 | 变成JspRuntimeLibrary.include 方法 |

| 是否可以传递参数 | 不能 | 可以 |

| 编译次数 | 1 | 包含的文件+1 |

| 适用范围 | 适用包含纯静态内容(如CSS,HTML,JS)或没有大量java代码的jsp | 包含需要传递参数,含有大量java代码的jsp |

在这里需要补充说明一点:我们在工作中,几乎都是使用静态包含。理由很简单。因为jsp页面虽然可以写java 代码,做其他的功能操作。但是由于jsp在开发过程中被定位为专门用来展示页面的技术。也就是说。jsp页面中,基本上只有html,css,js以及一些简单的EL、表达式脚本等输出语句。

8.3 页面转发


小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性

Java面试宝典2021版

最常见Java面试题解析(2021最新版)

2021企业Java面试题精选

11101169295)]
[外链图片转存中…(img-m3rWPPfR-1711101169296)]
[外链图片转存中…(img-5amrlyuB-1711101169296)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-oUe8afjR-1711101169297)]

最后

光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性

Java面试宝典2021版

[外链图片转存中…(img-YIhNJ3Ss-1711101169297)]

[外链图片转存中…(img-QT2eZYEP-1711101169298)]

最常见Java面试题解析(2021最新版)

[外链图片转存中…(img-pr78uBF9-1711101169298)]

[外链图片转存中…(img-Su2hRTXi-1711101169298)]

2021企业Java面试题精选

[外链图片转存中…(img-dWstoHuH-1711101169299)]

[外链图片转存中…(img-MvEBU3Wq-1711101169299)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值