1 JSP引入
基本概念
JSP(Java Server Pages )即Java服务器端页面,主要用于实现JavaWeb应用中的客户端界面部分,它是Servlet更高级别的扩展
在JSP文件中,HTML代码与Java代码共同存在, 其中,
HTML代码用来实现网页中静态内容的显示,
Java代码用来实现网页中动态内容的显示。
特征
1.跨平台
JSP是基于Java语言的,使用JSP开发的Web应用是跨平台的
2.业务代码相分离
界面的开发与应用程序的开发分离开,使用HTML设计界面,使用JSP标签和脚本动态生成页面上的内容
3.预编译
预编译就是在用户第一次通过浏览器访问JSP页面时,服务器将对JSP页面代码进行编译,并且仅执行一次编译
JSP运行原理
在hello.jsp页面中可以使用”<% %>“标签,其中可以编写常规Java代码
当浏览器输入地址“http://localhost:8080/jsp/hello.jsp”访问到页面,中间发生了什么?
JSP的工作模式是请求/响应模式
客户端首先发出HTTP请求,JSP程序收到请求后进行处理并返回处理结果。
一个JSP文件第一次被请求时,JSP容器把该JSP文件转换成为一个Servlet,而这个容器本身也是一个Servlet。

1.客户端发出请求,请求访问JSP文件
2.JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果发现JSP文件中存在任何语法错误,则中断转换过程,并向服务端和客户端返回出错信息。
3.如果转换成功,则JSP容器将生成的Java源文件编译成相应的字节码文件*.class。 该class文件就是一个Servlet,Servlet容器会像处理其他Servlet一样来处理它。
4.由Servlet容器加载转换后的Servlet类(.class文件)创建一个该Servlet(JSP页面的转换结果)的实例,并执行Servlet的jspInit()方法完成初始化。jspInit()方法在Servlet的整个生命周期中只会执行一次。
5.JSP容器执行jspService()方法处理客户端的请求。对于每一个请求,JSP容器都会创建一个新的线程来处理它。如果多个客户端同时请求该JSP文件,则JSP容器会创建多个线程,使得每一个客户端请求都对应一个线程。
6.当请求处理完成后,响应对象由JSP容器接收,并将HTML格式的响应信息发送回客户端。
JSP的本质
JSP就是一个Servlet,因此在JSP中可以使用Servlet的全部技术,不过JSP的一些技术不能在Servlet中使用。
将HTML的代码部分,以out.wrtie()方法进行输出,而JSP的部分,则被直接转换为Java代码
2 JSP基本语法
2.1JSP脚本元素
JSP脚本元素是指嵌套在“<%”和“%>”之中的一条或多条Java程序代码。
通过JSP脚本元素可以将Java代码嵌入HTML页面中,所有可执行的Java代码,都可以通过JSP脚本执行。
1.JSP脚本元素的三种类型:
1. JSP Scriptlets
JSP Scriptlets 是一段代码片段。
所谓代码片段,就是在JSP页面中嵌入的Java代码或脚本代码。
代码片段将在页面请求的处理期间被执行,通过Java代码可以定义变量或流程控制语句等;而脚本代码可以应用JSP的内置对象在页面输出内容、处理请求和访问session会话等。
JSP Scriptlets的语法格式如下所示
<% java 代码(变量、方法、表达式等)%>

还可以将JSP脚本和HTML代码穿插使用
<% for (int i = 0; i < 10; i++) { %> <a href="#">循环产生的链接</a> <%} %>
2. 声明标识
声明标识用于在JSP页面中定义全局变量或方法,它以“<%!”开始,以“%>”结束。通过声明标识定义的变量和方法可以被整个JSP页面访问,所以通常使用该标识定义整个JSP页面需要引用的变量或方法。
声明标识的语法格式如下所示:
<%! 定义变量或方法等 %>
<%!
private String name = "zhangsan";
public String getName(){
return this.name;
}
%>
姓名是:<%=getName() %>
JSP Scriptlets和声明标识
“<%!”和“%>”是用来定义属性和方法的,“<%”和“%>”主要是用来输出内容的,因此如果涉及到了成员变量的操作,那么就应该使用<%!和%>,而如果是涉及到了输出内容的时候,就使用<%和%>。
3. JSP表达式
JSP表达式(expression)用于向页面输出信息,它以“<%=”开始,以“%>”结束,其基本的语法格式如下所示:
<%= expression %>
参数expression可以是任何Java语言的完整表达式,该表达式的最终运算结果将被转换成一个字符串。
注意: “<%=”是一个完整的符号,“<%”和“=”之间不能有空格,且JSP表达式中的变量或表达式后面不能有分号(;)。
JSP表达式的原理就是翻译成out.print(变量或表达式运算结果);通过该方法向浏览器写出内容。
<body>
<%
int number = 10;
String message = "这是一个普通的Java字符串";
Random rand = new Random(); // 普通的Java注释
int number2 = rand.nextInt(100);
%>
定义的变量number的值是:<%=number%> <br>
产生的随机数值是:<%=number2%> <br>
它们的和值是:<%=number+number2 %> <br>
<% for (int i = 0; i < 10; i++) { %>
<a href="#">循环产生的第<%=i %>个链接</a>
<%} %>
</body>
2.2 JSP注释
JSP注释的语法:<%-- 注释内容 --%>
JSP中可以编写HTML代码,因此也可以使用HTML的注释,
在JSP脚本中可以使用Java语言的单行注释和多行注释。
注意: JSP注释在被翻译成Java文件时会被忽略,是不会被翻译或执行的,而HTML的注释被翻译成Java文件时依然会带入,如果HTML注释中存在JSP的脚本或表达式,将依然会被执行
<!-- 这是一个HTML注释 -->
<%--这是JSP注释 --%>
<!-- 这是一个嵌入JSP的HTML注释<%=10+20%> -->
翻译后的文件内容是:
out.write("<!-- 这是一个HTML注释 -->\r\n");
out.write("\r\n");
out.write("<!-- 这是一个嵌入JSP的HTML注释");
out.print(10+20);
out.write(" -->\r\n");
访问页面后,查看该页面的源代码可以看到

2.3 JSP指令
在JSP页面中还可以通过指令来设置JSP页面相关属性,例如网页的编码格式、脚本中导入的类等。
JSP页面中使用指令的语法是:
<%@ %>。
JSP有三大指令
1.page指令: <%@ page . . . %>,用来定义当前页面的属性
page指令的作用是告诉Tomcat服务器如何翻译JSP文件,具体的操作是在page指令中设置多个属性来描述。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
page指令中常用的属性有:
language="java" :告诉服务器使用什么动态语言来翻译jsp文件,本来设计成翻译成任何语言,但是现在只支持Java import="java.util.*, java.io.File" :告诉服务器Java文件使用了什么包,导入多个包使用逗号分隔
contentType="text/html; charset=UTF-8" :服务器发送给浏览器的数据类型和内容的编码,翻译时会被填充到response.setContentType("")中,可以省略,如果不写,则response.setContentType中编码值将会参考pageEncoding值
pageEncoding="UTF-8":告诉服务器使用什么编码表翻译jsp文件,jsp文件被编译成Java源文件时采用的解码表,如果和jsp文件编码不一致会乱码
errorPage="error.jsp":指定当前JSP页面发生错误时的错误处理页面
isErrorPage="false":指定当前页面是否为错误处理页面,默认值为false,需要显式的设置为true,好处在于当设置为true时,发生错误进入错误处理页面时,所有的异常信息会被封装到一个exception内置对象中,可以使用exception.getMessage()获取异常信息
buffer="8kb":JSP页面的缓冲区大小
session="true":是否开启session功能,如果值指定为false,则不可以使用内置对象session,值为true则可以使用session对象
isELIgnored="false":是否忽略EL表达式
关于错误页
如何统一配置项目中所有的页面的错误处理页面
在项目的web.xml文件中配置以下内容
<!-- 全局错误处理页面配置全局错误处理页面配置 -->
<error-page>
<error-code>500</error-code>
<location>/common/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/common/404.html</location
</error-page>
2.include指令:<%@ include . . . %>,用来包含其他的页面
作用:用于包含其他页面。
很多的网站模板比较固定,顶部有网站栏目、logo,中间内容会有变化,底部有版权等信息。每一个页面除了中间变化,上和下基本不变,而每一个页面都要重复写头部和底部,比较麻烦。此时就可以把公共的部分抽取出来,例如放到common\header.jsp和common\footer.jsp,然后通过include指令进行包含。
<%@include file="common/header.jsp" %>
使用include指令时需要注意:
1)include指令把被包含的页面(common/header.jsp)的内容翻译到包含页面中,合并翻译成一个Java源文件,再编译运行。这种包含叫静态包含(源码包含);(相应的还有动态包含,使用的是jsp:include标签)。
2)使用静态包含方式,被包含的页面中不需要出现全局的HTML标签(html、head、body),只需要body标签内的内容即可。
静态包含过程


动态包含与静态包含主要区别:
<jsp:include>是动态包含,而<%@ include%>是静态包含。
动态包含可以给被包含的页面传递参数。静态包含不能给被包含的页面传递参数。
动态包含的地址可以是变量,静态包含的地址是常量。
<jsp:include page=“file” flush=“true” />它总是会检查所含文件中的变化,而<%@include file=“file”%>不会检查所含文件的变化,适用于包含静态页面
3.taglib指令: <%@ taglib . . . %>,用来导入标签库
JSP页面中还可以使用标签来完成一些动作,有内置的动作标签,还有标准标签库,还可以使用用户自定义的标签库,关于标签的使用,后续会有专门的课程内容。
在JSP页面中如果要使用标签库,需要通过tablib指令来引入,例如引入标准标签库(需要引入相关依赖jar包):
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 其中,uri为标签库的资源标识名称,prefix为在JSP页面中引用的前缀名。
1538

被折叠的 条评论
为什么被折叠?



