java后端开发每天遇到的jsp

一、JSP基础语法

1、JSP模板元素

JSP页面中的HTML内容称之为JSP模版元素。

JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观。

2、JSP脚本片段

JSP脚本片断(scriptlet)用于在JSP页面中编写多行Java代码(在<%%>不能定义方法)。语法:<%多行java代码 %>

例如:
java后端开发每天遇到的jsp_第1张图片
注意:

1、JSP脚本片断中只能出现java代码,不能出现其它模板元素, JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的_jspService方法中。

2、JSP脚本片断中的Java代码必须严格遵循Java语法,例如,每执行语句后面必须用分号(;)结束。

3、在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。

4、多个脚本片断中的代码可以相互访问

3、JSP表达式

JSP脚本表达式(expression)用于将程序数据输出到客户端,语法:<%=变量或表达式 %>

例如:
java后端开发每天遇到的jsp_第2张图片
4、JSP声明

JSP页面中编写的所有代码,默认会翻译到servlet的service方法中, 而Jsp声明中的java代码被翻译到_jspService方法的外面。语法:<%!java代码 %>

JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法。

例如:
java后端开发每天遇到的jsp_第3张图片
5、JSP注释

在JSP中,注释有显式注释, 隐式注释,JSP自己的注释:

java后端开发每天遇到的jsp_第4张图片

区别:

HTML的注释在浏览器中查看源文件的时候是可以看得到的,而JAVA注释和JSP注释在浏览器中查看源文件时是看不到注释的内容的。

二、JSP原理

1、Web服务器是如何调用并执行一个jsp页面的?

浏览器向服务器发请求,不管访问的是什么资源,其实都是在访问Servlet,所以当访问一个jsp页面时,其实也是在访问一个Servlet,服务器在执行jsp的时候,首先把jsp翻译成一个Servlet,所以我们访问jsp时,其实不是在访问jsp,而是在访问jsp翻译过后的那个Servlet。

例如下面的代码:
java后端开发每天遇到的jsp_第5张图片
当我们通过浏览器访问index.jsp时,服务器首先将index.jsp翻译成一个index_jsp.class,在Tomcat服务器的work\Catalina\localhost\项目名\org\apache\jsp目录下可以看到index_jsp.class的源代码文件index_jsp.java
java后端开发每天遇到的jsp_第6张图片

2.jsp在服务器的执行流程
第一次执行:

客户端通过电脑连接服务器,因为是请求是动态的,所以所有的请求交给WEB容器来处理
在容器中找到需要执行的*.jsp文件
之后.jsp文件通过转换变为.java文件
.java文件经过编译后,形成`.class文件
最终服务器要执行形成的*.class文件
第二次执行:

因为已经存在了*.class文件,所以不在需要转换和编译的过程
修改后执行:

源文件已经被修改过了,所以需要重新转换,重新编译。

三、JSP指令
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。

1、Page指令

page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。

import属性

可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号(,)分隔.
在这里插入图片描述
备注:

在Jsp页面中,Jsp引擎会自动导入下面的包
java后端开发每天遇到的jsp_第7张图片
errorPage属性

使用errorPage属性指明出错后跳转的错误页面,errorPage属性的设置值必须使用相对路径,如果以"/“开头,表示相对于当前Web应用程序的根目录,否则,表示相对于当前页面。
java后端开发每天遇到的jsp_第8张图片
比如index.jsp页面有如下的代码:
java后端开发每天遇到的jsp_第9张图片
在index.jsp中,page指令的errorPage属性指明了出错后跳转到”/error.jsp",error.jsp页面代码如下:
java后端开发每天遇到的jsp_第10张图片
运行结果如下:

在这里插入图片描述
我们也可以在web.xml中使用标签为整个web应用设置错误处理页面,web.xml的代码下:
java后端开发每天遇到的jsp_第11张图片
error.jsp页面代码同上

当访问一个不存在的web资源时,就会跳转到在web.xml中配置的404错误处理页面error.jsp,如下图所示:
java后端开发每天遇到的jsp_第12张图片
一个jsp页面是作为系统的错误处理页面,那么建议将page指令的isErrorPage属性(默认为false)设置为"true"来显式声明这个Jsp页面是一个错误处理页面。
在这里插入图片描述
将error.jsp页面显式声明为错误处理页面后,Jsp引擎在将jsp页面翻译成Servlet的时候,在Servlet的 _jspService方法中会声明一个exception对象,然后将运行jsp出错的异常信息存储到exception对象中,由于Servlet的_jspService方法中声明了exception对象,那么就可以在error.jsp页面中使用exception对象。源码如下:
java后端开发每天遇到的jsp_第13张图片
2、include指令

在JSP中对于包含有两种语句形式:

@include指令

include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。

语法:<%@ include file=“relativeURL”%>

file属性用于指定被引入文件的路径。路径以"/"开头,表示代表当前web应用。

注意细节:

被引入的文件必须遵循JSP语法。
被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments(片段))作为静态引入文件的扩展名。
由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。
标签

标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。

语法:” flush=“true|false” />

page属性:用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。

flush属性:指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。

标签与include指令的区别

标签是动态引入,标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。 而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。

四、JSP中的九个内置对象
java后端开发每天遇到的jsp_第14张图片
java后端开发每天遇到的jsp_第15张图片
1、page

page对象表示当前一个JSP页面,可以理解为一个对象本身

2、out

out对象用于向客户端发送文本数据。

3、pageContext

pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象(容器),可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。

通过pageContext获得其他对象:
java后端开发每天遇到的jsp_第16张图片
pageContext作为域对象

pageContext对象可以作为容器来使用,因此可以将一些数据存储在pageContext对象中。

pageContext对象的常用方法:
java后端开发每天遇到的jsp_第17张图片
当使用findAttribute查找某个属性时,findAttribute方法按照查找顺序"page→request→session→application"在这四个对象中去查找,只要找到了就返回属性值,如果四个对象都没有找到要查找的属性,则返回一个null。

五、JSP属性范围
JSP中提供了四种属性范围,如下:

当前页(pageContext):一个属性只能在一个页面中取得,跳转到其他页面无法取得

一次服务器请求(request):一个页面中设置的属性,只要经过了服务器跳转,则跳转之后的页面可以继续取得。

一次会话(session):一个用户设置的内容,只要是与此用户相关的页面都可以访问(一个会话表示一个人,这个人设置的东西只要这个人不走,就依然有效)

上下文中(application):在整个服务器上设置的属性,所有人都可以访问

1、page属性范围(pageContext)

在一个页面设置的属性,跳转到其他页面就无法访问了。但是在使用page属性范围的时候必须注意的是,虽然习惯上将页面范围的属性称为page范围,但是实际上操作的时候是使用pageContext内置对象完成的。

例如:
java后端开发每天遇到的jsp_第18张图片
运行结果如下:
在这里插入图片描述
使用标签进行服务器跳转到index2.jsp

Index.jsp
java后端开发每天遇到的jsp_第19张图片
Index2.jsp
java后端开发每天遇到的jsp_第20张图片
运行结果如下:
java后端开发每天遇到的jsp_第21张图片
使用了服务器端跳转,但是发现内容并不能取得,证明page范围的属性只能在本页中取得,跳转到其他页面之中不能取得。

2、request属性范围

request属性范围表示在一次服务器跳转中有效,只要是服务器跳转,则设置的request属性可以一直传递下去。

例如:

Index.jsp
java后端开发每天遇到的jsp_第22张图片
java后端开发每天遇到的jsp_第23张图片
3、Session属性范围

session设置的属性不管如何跳转,都可以取得的(session只针对一个用户)。

例如:

Index.jsp

java后端开发每天遇到的jsp_第24张图片
java后端开发每天遇到的jsp_第25张图片
4、application属性范围

application属性范围是在服务器上设置的一个属性,所以一旦设置之后任何用户都可以浏览到此属性(服务器上设置了过多的application属性,则会影响到服务器的性能)。

例如:

Index.jsp
java后端开发每天遇到的jsp_第26张图片
java后端开发每天遇到的jsp_第27张图片
六、JSP标签

JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。

常用标签有以下三个:

1、标签

标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。

语法:” flush=“true|false” />
java后端开发每天遇到的jsp_第28张图片
标签与include指令的区别:

标签是动态引入,标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。 而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。

2、标签

标签用于把请求转发给另外一个资源(服务器跳转,地址不变)。

语法:” />
在这里插入图片描述
3、标签

在使用和标签引入或将请求转发给其它资源时,可以使用标签向这个资源传递参数。value属性用于指定参数值。在和标签中可以使用多个标签来传递多个参数。

语法1:
java后端开发每天遇到的jsp_第29张图片
java后端开发每天遇到的jsp_第30张图片

你可能感兴趣的:(web阶段)