}
%>
浏览器输出为:
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” %>
<%//这是Java注释%>
<%–这是JSP注释–%>
然后,我们打开翻译后的Java源代码,可以看到三种注释方法在翻译后的状态与如上描述一致:
===============================================================================
JSP中的内置对象,是指Tomcat在翻译JSP页面成为Servlet 源代码后,内部提供的九大对象。此时翻译而来的Java源代码就是由这九大内置对象组合而成的。
| 内置对象 | 功能 |
| — | — |
| request | 请求对象 |
| response | 响应对象 |
| pageContext | JSP的上下文对象 |
| session | 会话对象 |
| application | ServletContext对象 |
| config | ServletConfig对象 |
| out | JSP输出流对象 |
| page | 指向当前JSP的对象 |
| exception | 异常对象 |
打开上一章中翻译由JSP翻译而来的Java源代码如下所示,可以看到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” %>
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” %>
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输出对象的区别
======================================================================================================
首先说明,这两大对象也是属于九大对象的。
如果在代码中out.write后不加入out.flush()的操作,那么无论out.write放在代码中的什么位置,其都是在最后输出的。原因如下图所示(看图片左下角):
接下来,我用一段代码来说明这个问题,新建JSP文件,敲入代码如下:
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%
// 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()来进行输出。
=============================================================================
为什么要使用包含?
因为,一个JSP页面上会有成千上万条代码,如果不加入包含的话,想要修改某些代码,就需要在这么多代码里面寻找,可想而知工作量是多么巨大。包含就像是将某一个固定功能代码 抽离出去,这样,在这些特定时刻就只要修改这些代码就可以了。
静态包含的代码为:<%@ 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” %>
<%–
<%@ 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” %>
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、表达式脚本等输出语句。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最后
光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性
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)]