Java web基础总结八之—— jsp基础
Java web基础总结八之—— jsp基础
一.什么是jsp?
JSP是Java ServerPages的缩写,它和servlet一样,都是用于开发动态web资源的技术。在servlet中拼凑输出html代码时,非常麻烦。而JSP的最大的特点在于,写jsp就像在写html,但是html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,开发动态资源。
现在随着前端越来越重要,很多的公司都会采取前后端分离的开发模式。即后端只提供返回json等格式的接口,而前端开发人员则通过对后端接口的请求处理json数据,做相应的展示。这样jsp就几乎很少用到。但是学习java web,不能不学习jsp。
JSP和Servlet,都可以用于开发动态web资源。但在实际的开发中中,通常把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。即servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。
二.jsp的原理
首先需要明确的是,JSP也是一个servlet,所以它的运行原理和servlet类似。每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet),然后按照servlet的调用方式进行调用。
由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
当然,jsp也可以配置为web应用启动加载。而且jsp也可以像servlet一样在web.xml中进行配置映射路径,但是通常都是通过servlet来访问相应的jsp。
例如:
<servlet>
<servlet-name>HelloWorldJspServlet</servlet-name>
<jsp-file>/jsp/hello.jsp</jsp-file>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name> HelloWorldJspServlet</servlet-name>
<url-pattern>/hello.html</url-pattern>
</servlet-mapping>
三.Jsp的语法简介
1. JSP元素
JSP元素就是JSP页面中的HTML内容。Jsp页面中可以定义html的标签。所以它定义了网页的基本骨架,定义了页面的结构和外观。例如head, body。
2. JSP脚本表达式
JSP脚本表达式(expression)用于将程序数据输出到客户端,简单的说就是输出表达式所嵌套的java变量的值。语法是:<%= 变量或表达式 %>。例如,当前时间:<%= new java.util.Date() %> 。JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…)方法将数据输给客户端。需要注意的是JSP脚本表达式中的变量或表达式后面不能有分号。
3. JSP脚本片断
JSP脚本片断(scriptlet)就是在JSP页面中编写多行Java代码,虽然通常我们并不会在一个jsp文件中嵌套太多的java代码。语法是:<% java代码%>
需要注意的是,JSP脚本片断中只能出现java代码,不能出现其它模板元素,这是因为 JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的_jspService方法中。所以JSP脚本片断中的Java代码必须严格遵循Java语法,和JSP脚本表达式不同的是,每一个执行语句后面必须用分号结束。
在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。
例如:
<%
String s1 = "hello";
out.println(s1);
%>
<p>hello world!</p>
<%
String s2 = "world!";
out.println(s1+s2);
%>
多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。如:out.println(s1+s2);所以单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句。
4. JSP声明
JSP声明和JSP脚本片断不同,JSP脚本片断中的java代码,默认会翻译到servlet的service方法中,而Jsp声明中的java代码被翻译到_jspService方法的外面。语法:
<%! java代码 %>
所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。 多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。例如:
<%!
static
{
System.out.println("helloworld!");
}
%>
5.JSP注释
JSP注释的语法是:<%-- 注释信息 --%>。JSP引擎在将JSP页面翻译成Servlet程序时,JSP页面中被注释的内容。
6. JSP指令简介
JSP指令的基本语法格式:<%@ 指令属性名="值" %>
举例:<%@page contentType="text/html;charset=UTF-8" language="java"%>
下面是几个比较常用的jsp指令。
(1).page
page指令的作用是定义JSP页面的各种属性,它作用的是整个JSP页面,所以为了保持程序的可读性和遵循良好的编程习惯,一般把page指令放在整个JSP页面的起始位置。
JSP 2.0规范中定义的page指令的完整语法:
<%@ page
[ language="java"]
[extends="package.class" ]
[import="{package.class | package.*}, ..." ]
[ session="true |false" ]
[ buffer="none | 8kb |sizekb" ]
[ autoFlush="true |false" ]
[ isThreadSafe="true |false" ]
[ info="text" ]
[errorPage="relative_url" ]
[ isErrorPage="true |false" ]
[contentType="mimeType [ ;charset=characterSet ]" | "text/html ;charset=ISO-8859-1" ]
[pageEncoding="characterSet | ISO-8859-1" ]
[ isELIgnored="true |false" ]
%>
(2). Include
include指令的作用是引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
语法:<%@include file="xx.jspf"%>
其中的file属性用于指定被引入文件的相对路径。需要注意的是file属性的值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突。
(3). taglib
taglib指令用于在JSP页面中导入标签库。例如:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
四.jsp的9个内置对象以及其中的4个域对象。
JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。需要特别注意的是:JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。
1. jsp的9个内置对象
request:这个对象就是HttpServletRequest,不多叙述
response:这个对象就是HttpServletResponse。
config:就是ServletConfig,在servlet中已经介绍过,作用是为servlet配置一些初始化参数,作用范围是一个servlet。
application:就是ServletContext, 前面也介绍过,作用范围是整个web应用。
exception:异常相关,用于处理异常。
session: 就是HttpSession,也不多说。
page:就是this对象,代表当前的页面。
out:out隐式对象用于向客户端发送文本数据。 out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与 ServletResponse.getWriter方法返回的PrintWriter对象非常相似。 JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
pageContext: pageContext对象是JSP的一个非常重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐 式对象的引用,它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作。 它有个非常重要的方法:findAttribute方法,作用是查找各个域中的属性。EL表达式就是通过它实现的。EL表达式语句在执行 时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相 应的对象,找到则返回相应对象,找不到则返回空字符串,而不是null,可以避免异常。
2. java web 的4个域对象:
这四个域中都可以保存一些属性,并且可以通过名字取出属性的值。
pageContext(称为page域):作用的范围最小,就是当前的jsp页面
request(称为request域):作用的范围为一个请求。
session(称为session域):就是session,作用范围是一个客户端浏览器。
servletContext(称为application域):作用域最大,为整个web应用。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。