JSP介绍
1、 JSP概述:
JSP全名为Java Server Pages,其根本是一个简化的Servlet设计。它是在传统的网页HTML文件中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件。
JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。
2、JSP处理过程:
- 就像其他普通的网页一样,您的浏览器发送一个HTTP请求给服务器。
- Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
- JSP引擎从磁盘中载入JSP文件,然后将它们转化为servlet。这种转化只是简单地将所有模板文本改用println()语句,并且将所有的JSP元素转化成Java代码。
- JSP引擎将servlet编译成可执行类,并且将原始请求传递给servlet引擎。
- Web服务器的某组件将会调用servlet引擎,然后载入并执行servlet类。在执行过程中,servlet产生HTML格式的输出并将其内嵌于HTTP response中上交给Web服务器。
- Web服务器以静态HTML网页的形式将HTTP response返回到您的浏览器中。
- Web浏览器处理HTTP response中动态产生的HTML网页,就好像在处理静态网页一样。
3、JSP运行环境:
由于JSP根本上是一个简化的Servlet设计,所以JSP的运行环境与Servlet相同。
<%@page language="java" contentType="text/html; charset=UTF-8"%>
<html>
<title>Insert the title here</title>
<body>
当前访问时间是:
<%
out.print(new java.util.Date().toLocaleString());
%>
</body>
</html>
刷新浏览器访问时间也刷新
在浏览器中查看源文件——
发现每次内容都不一样——jsp是一个动态网页,它的动态效果实际上是服务器程序实现的(如果是一个静态网页那么每次查看源代码时内容都是一样的)
4、JSP基本语法:
4.1、JSP模版元素
JSP页面可以按照编写HTML页面的方式来编写,其中可以包含HTML文件的所有内容,在静态的HTML中嵌套JSP的其他各种元素来产生动态内容和执行业务逻辑。
JSP页面中的HTML内容称之为JSP模版元素。
JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观。
4.2、JSP表达式
JSP脚本表达式(expression)用于将程序数据输出到客户端
语法:<%= 变量或表达式 %>
举例:当前时间:<%= new java.util.Date() %>
JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,(插入到JSP页面输出结果的相应位置处)然后在相应位置用out.print(…) 将数据输给客户端;有时候表达式也能作为其他JSP元素的属性值。
JSP脚本表达式中的变量或表达式后面不能有分号(;)。
4.3、JSP脚本片段
JSP脚本片段(scriptlet)用于在JSP页面中编写多行Java代码。即是指嵌套在<%和%>之中的一条或多条Java程序代码。
语法:
<%
多行java代码
%>
注意:JSP脚本片断中只能出现java代码,不能出现其它模板元素, JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的_jspService方法中。
JSP脚本片断中的Java代码必须严格遵循Java语法,例如,每执行语句后面必须用分号(;)结束。
在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。并且这些脚本片段中的代码可以相互访问。
举例:
<% int x = 10; %>
<p>这是JSP页面文本</p>
<% out.println(x); %>
上面的JSP内容定义的变量可以在下面的JSP中输出
多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。
单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句
<%
for (int i=1; i<5; i++)
{
%>
<h<%=i %>>zxy</h<%=i %>> 表达式
<%
}
%>
4.4、JSP声明
让jsp拥有自己的方法,除了jsp内部已有的对象.(这个极少有人用).
JSP页面中编写的所有代码,默认会翻译到servlet的——jspService方法中,.这时JSP脚本片段中定义的变量都将成为——jspService()方法中的局部变量,而定义的方法都将插入jspService()方法中,从而会出现程序的方法中在定义方法,这样的语法是错的。
而Jsp声明中的java代码被翻译到_jspService方法的外面。语法:
<%!
java代码
%>
所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法 。
多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。
JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。
4.5、JSP注释
JSP注释的格式:
<%-- 注释信息 --%>
JSP引擎在将JSP页面翻译成Servl et程序时,忽略JSP页面中被注释的内容,不会将注释信息发送到客户端
例:
<%@page language="java" contentType="text/html; charset=UTF-8"%>
<html>
<title>Insert the title here</title>
<body>
<%--这个是注释 --%>
</body>
</html>
5.JSP指令
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。在JSP 2.0规范中共定义了三个指令:
page指令
Include指令
taglib指令
5.1、page指令
用于定义JSP页面的各种属性
可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号分隔:
<%@ page import="java.util.Date,java.sql.*,java.io.*"%>
上面的语句也可以改写为使用多条page指令的import属性来分别引入各个包或类:
<%@ page import="java.util.Date"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.io.*"%>
JSP 引擎自动导入下面的包:
java.lang.*
javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*
JSP 2.0规范中定义的page指令的完整语法:
<%@ page
[ language="java" ] 指定语言为java
[ extends="package.class" ] 指定继承的类,当指明继承普通类时需要实现Servlet接口的相应方法
[ import="{package.class | package.*}, ..." ] //指定引入的包
[ session="true | false" ] //默认session为true,表示内置存在session对象,可以直接调用,如果没有,也可以通过request.getSession()获取
[ buffer="none | 8kb | sizekb" ] //缓存默认为8kb
[ autoFlush="true | false" ] //缓存默认自动清空
[ isThreadSafe="true | false" ] //是否是线程安全的,默认是true,就是是否支持多线程调用.
[ info="text" ] //提示信息,热字符串
[ errorPage="relative_url" ] errorPage 的意思是设置当前页面要引入错误页面。也就是浮面当前页面如果出现错误就会跳转到errorPage所指定的页面。
[ isErrorPage="true | false" ] //当前页面是否是错误页面,默认为false
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] //设置页面内容编码
[ pageEncoding="characterSet | ISO-8859-1" ] //当前页面编码
[ isELIgnored="true | false" ] //是否支持EL表达式
%>
contentType的用法——如何解决JSP引擎翻译JSP页面时的中文乱码问题 ?
如下图:
输出响应正文时出现的中文乱码问题、读取浏览器传递的参数信息时出现的中文乱码问题、JSP引擎将JSP页面翻译成Servlet源文件时也可能导致中文乱码问题
JSP引擎将JSP源文件翻译成的Servlet源文件默认采用UTF-8编码,而JSP开发人员可以采用各种字符集编码来编写JSP源文件,因此,JSP引擎将JSP源文件翻译成Servlet源文件时,需要进行字符编码转换。
如果JSP文件中没有说明它采用的字符集编码,JSP引擎将把它当作默认的ISO8859-1字符集编码处理。
那么,如何解决JSP引擎翻译JSP页面时的中文乱码问题——
通过page指令的contentType 指定的是JSP页最终 Browser(客户端)所见到的网页内容的编码.
page指令的pageEncoding属性说明JSP源文件的字符集编码,指定JSP编写时所用的编码
5.2、Include指令
include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
语法:
<%@ include file="relativeURL"%>
其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。
细节:
被引入的文件必须遵循JSP语法。
例:
<%--include.jsp--%>
<%@page language="java" contentType="text/html; charset=UTF-8"%>
<html>
<title>Insert the title here</title>
<body>
欢迎你,当前访问时间是:
<%@include file="date.jsp" %>
</body>
</html>
<%--date.jsp--%>
<%@page language="java" contentType="text/html; charset=UTF-8"%>
<html>
<title>Insert the title here</title>
<body>
<%out.print(new java.util.Date().toLocaleString());%>
</body>
</html>
5.3、taglib指令
Taglib指令用于在JSP页面中导入标签库
6、JSP隐式对象
在JSP页面中,有一些对象需要频繁使用,如果每次创建这些对象则会非常麻烦。为此JSP提供了九个隐式对象,它们是JSP默认创建的,可以直接在JSP页面使用。
pageContext对象:
pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,提供了一系列用于获取其他隐式对象的方法。
它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。
一:获取其他隐式对象的方法:
getException方法返回exception隐式对象
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象
pageContext获取其它8大内置对象的意义,这个主要用于自定义标签.
在后面的标签的学习中,需要将Java代码从jsp页面移除,这时,JSP隐式对象也需要传递给Java类中定义的方法。
通常情况下,为了方便,只传递一个pageContext对象,然后通过该对象来获取其他隐式对象。
二:存储数据功能的操作属性方法:
public void setAttribute(String name,Object value)设置pageContext对象的属性
public Object getAttribute(String name)获取pageContext对象的属性,在page范围内
public void removeAttribute(String name)删除所有范围内名称为Name的属性
pageContext对象中还封装了访问其它域的方法
public Object getAttribute(String name,int scope)获取pageContext对象的属性
public void setAttribute(String name, Object value,int scope)设置pageContext对象的属性
public void removeAttribute(String name,int scope)删除指定范围内名称为name的属性
public Object findAttribute(String name)查找名称为name的属性 从小到发一次查找与getAttribute作用范围不同
pageContext对象的作用范围有四个值:
PageContext.APPLICATION_SCOPE 表示web应用程序范围
PageContext.SESSION_SCOPE 表示会话范围
PageContext.REQUEST_SCOPE 表示请求范围
PageContext.PAGE_SCOPE 表示页面范围
作用范围从小到大进行排序为pageContext(作用范围为:
page)--->request域(请求时)--->session(整个会话都有頝)--->application/servletContext(应用上下文都有頝),findAttribute(name)查找时也按改顺序依次查找,为查找到返回Null。
7、JSP标签:
JSP页面可以嵌套一些Java代码来完成某种功能,但是这种Java代码会是JSP页面很乱,不利于美工调试和维护,为了减少JSP页面中的Java代码——利用标签完成各种通用的JSP页面功能。
7.1、<jsp:include>
<jsp:include>标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。
语法:
<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。
flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。
<jsp:include>标签是动态引入, <jsp:include>标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。
而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。优点是页面的执行速度快。
7.2、<jsp:forward>
用于把请求转发给另外一个资源。(RequestDispatcher接口的forward()方法也可以)
语法:
<jsp:forward page="relativeURL | <%=expression%>" />
page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。
该路径是相对于当前JSP页面的URL。
注意浏览器页面转向后,URL地址仍然显示转向前jsp页面的URL表示。
查看翻译后的Servlet源文件
会发现<jsp:forward>标签被翻译成了调用pageContext.forwad()方法的语句,并在调用后使用return语句结束了service()方法的执行流程,从而不再执行<jsp:forward>标签后的语句。
注意:如果哦在JSP页面中直接调用pageContext.forwad()方法,当forward()方法后还有语句需要执行时,程序会发生IllegalStateException异常。但是使用<jsp:forward>标签,由于<jsp:forward>标签翻译的servlet程序会使用return语句终止执行后面的语句,因此,程序会避免报错。
7.3、<jsp:param>
以“名字-值”对的形式为其他标记提供附加信息。
该标签不能单独使用,只能与jsp:include\jsp:forward\jsp:plugin标记作为他们的子标记一起使用。
与include标记一起使用时可以将param标记中的值传递到include指定加载的文件中去
也就是说,JSP页面在使用jsp:include标签加载文件时,可以动态的想所加载的文件传递数据。
被加载的文件可以i使用request内置对象获取param子标记中name属性的值.