Web服务端:JSP技术基础

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页面中引用的前缀名。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值