JSP---Java Server Pages
拥有servlet的特性与优点(本身就是一个servlet)
直接在HTML中内嵌JSP代码
JSP程序由JSP Engine先将它转换成Servlet代码,接着将它编译成类文件载入执行
只有当客户端第一次请求JSP时,才需要将其转换,编译
像html一样使用它就行,html能放在什么位置,jsp就能放在什么位置。
可以放在webapps的根目录下面,可以放在webapps的子目录下面,不可以放在WEB-INF下面,不用配置直接可以使用,和
html一样。
优点:
优良的性能:
优于CGI,PHP,ASP
平台无关性:
操作系统无关,Web服务器无关
可扩展性:
tag的扩展机制,简化页面开发
JSP传统语法(目录):
Declaration:声明
Scriptlet:小程序段
Expression:表达式
Comment:注释
Directives:编译指令
Action:动作指令
内置对象:对象
JSTL
JSF
其他taglib(如:struts)
<%= ...... %>:把中间的值原封不动地输出出来
JSP传统语法详解:
脚本元素包括:小程序段,声明,表达式,JSP2.0增加了EL表达式,作为脚本元素的另一个选择。
1 Declaration:声明
用于声明在其他脚本元素中可以使用的变量,方法和类,必须是完整的声明语句,遵循java语言的语法
基本语法:
<%! %>或<% %>
说明:<%! %>这里声明的变量是成员变量(实例变量,类变量static)。一个jsp页面仅保存一份。方法都会被保留成唯一的一份,
直到服务器停止执行。线程不安全。
<% %>这里声明的变量是局部变量,每次jsp被客户端访问或者刷新都会被重置。线程安全。
例:
<%!
int i;
public void setName(){... ...}
%>
2 Scriptlet 小程序段:
基本语法:
<% 程序代码区 %>
可以放入任何的Java程序代码
例:
<%
for(int i=0;i<10;i++){
... ....
}
%>
3 Comment 注释:
<%--... ...--%>//客户端看不见
<%//... ...%>
<%/*... ...*/%>
<!--... ...-->//客户端可以看见
4 Expression 表达式:
基本语法:<%=... ...%>
=后面必须是字符串变量或者可以转换成字符串的表达式
不需要以;结束
只有一行
例:
<%="hello world"%>
<%=i+1%>
<%=request.getParameter("name")%>
5 Directive 编译指令,相当于在编译期间的命令,程序还没有开始运行,不包含控制逻辑,不会产生任何可见的输出:
格式:
<%@ 指令类别 属性1=“属性值1” ... 属性n=“属性值n” %>
<%@Directive 属性="属性值"%>
常见的Directive:
page:用来设定页面的属性和相关的功能,可以用来进行导入需要类、指明jsp输出内容的类型、指明处理异常的错误页面等操作,一般将page指令放在JSP文件顶部
基本格式:
<%@page language="script language" //现在只有java
extends="className"| //一般非常少用
import="importList"| //引入哪些包或类,相当与java中的import语句,引入多个类用,隔开。
buffer="none|kb size"| //none不缓冲,默认8k,即先把页面写入内存缓冲,然后一次性地显示整个页面,指定out对象使用缓冲区的大小。
session="true|false"| //是否可以使用session,默认true
autoFlush="true|false"| //缓冲器是否自动清除,默认true,这个页面从服务器创建完了是否自动输出到客户端
isThreadSafe="true|false"| //默认false,不需要指定,
info="infoText"| //任何字符,相关的描述信息,通过servlet接口的getServletInfo()方法来得到。
errorPage="errorPageURL"| //页面出错以后显示的页面,如果一个页面通过该属性定义了错误页面,那么在web.xml文件中定义的任何错误页面将不
会被使用
isErrorPage="true|false"| //当前页面是不是一个显示错误的页面
contentType="contentTypeInfo"| //用于指定响应的JSP页面的MIME类型和字符编码,一般写text/html;charset=gb2312,如:contentType="MIME类
型;charset=字符编码",此处设置字符编码和下面的pageEncoding属性作用相同
pageEncoding="peinfo"|//指定JSP页面使用的字符编码,和contentType指定的字符编码共用时优先使用这个属性定义的字符编码
isELIgnored="true|false"//定义在JSP页面中是否执行或忽略EL表达式
%>
include:将指定的JSP程序或者HTML文件包含进来
格式:<%@include file="fileURL"%>
JSP Engine会在JSP程序的转换时期(即在编译前)先把file属性设定的文件包含进来,然后开始执行转换及编译的工作。
一般用于包含非动态的代码,不接受参数的代码。
file属性的值被解释为相对于当前JSP文件的URL。
获取父页面的变量参数:这种包含页面的方式可以直接获取父页面声明的变量的值。
限制:不能向fileURL中传递参数,不能:abc.jsp?user=aaa
原文件和被包含的文件可以互相访问彼此定义的变量和方法。
taglib:允许页面使用用户定制的标签
格式:<%@taglib (uri="tagLibraryURI"|tagdir="tagDir") prefix="tagPrefix" %>
属性:
uri:定位标签库描述符的位置,可以是绝对或相对的uri
6 Action 动作指令,在运行期间的指令,本质上是一段java代码:
在页面被转换为servlet期间,当JSP遇到这个标签,就用预先定义的对应于该标签的java代码来代替它。
常见的有:
jsp:useBean 通过jsp:useBean,可以在JSP中使用定义好的Bean
Bean的基本要素:
必须要有一个不带参数的构造器,在JSP元素创建Bean时会调用空构造器
Bean类应该没有任何公共实例对象,也就是说,不允许直接访问实例变量,变量名称首字母必须小写
通过getter/setter方法来读/写变量的值,并且将对应的变量首字母改为大写
在jsp里面使用javabean,要求这个bean应该放在包里面,不要写裸体类。
基本用法:
<jsp:useBean id="beanName" scope="page|request|session|application" class="package.BeanClass"
type="typeName" /
//id:指用class所指的javabean类new出来的javabean对象。相当于<@ page import="package.*"><% BeanClass
beanName = new BeanClass() %>
//scope:默认是page,这个bean new出来之后就是一个局部变量,页面一没有了,方法就结束了,局部变量就消
失了,其他的页面访问不了,只对这个jsp有
效。
//request指在request范围之内有效。session指在用户整个连接过程中有效。application指把javabean放在了
servletContext里面,在整个servletContext生存
期间内有效,即对整个网站均有效,只要程序不退出,永远存在,客户端共享。
//type:指把new出来的javabean当成什么对象来用,Bean类实例类型,可以是本类,或其父类,或其实现的接
口,默认为本类。如:<% Object cb = new
BeanClass() %>,这里将javabean当成Object来用。 相当于<jsp:useBean id="beanName" class="package.beanClass"
type="java.lang.Object" />
//class:Bean类名称
<jsp:useBean id="couneterBean" scope="request" scope="requset" class="bean.CounterBean">对于scope为
request中的jsp:useBean相当于:
<%--
bean.CounterBean CounterBean =
(counterBean)request.setAttribute("counterBean");
if(counterBean == null) {
counterBean = new bean.CounterBean();
request.setAttribute("counterBean",counterBean);
}
--%>
<jsp:useBean id="counterBean" scope="session" class="bean.CounterBean" />对于scope为session的
jspL:useBean相当于:
<%--
bean.CounterBean counterBean = (counterBean)session.getAttribute("counterBean");
if(counterBean == null) {
couneterBean = new bean.CounterBean();
session.setAttribute("counterBean",counterBean);
}
--%>
jsp:setProperty
例如:<jsp:setProperty name="beanName" property="propertyName" value=""/>//首先必须把这个javabean初始化
了,这句话相当于:<%
beanName.setProperty(value) %>
name属性:bean实例的名字,它必须是已经在<jsp:useBean>元素中通过id属性定义的名字
property属性:被设置的属性的名字,可以设置为*
param属性:通过param指定表单元素的名称,通过property指定bean属性的名称,由此建立这两个变量的关联,可以
写在要使用<jsp:getProperty>的时候。
<jsp:setProperty name="entry property="itemID" param="itemID" />相当于<jsp:setProperty name="entry property="itemID" value="
<%=request.getParameter(itemID)%>" />
注意:指定请求对象的名字。在设置bean属性时,如果请求参数的名字和bean属性的名字不同,可以用param来
指定参数的名字,如果没有使用param,那
么就认为请求参数的名字和bean属性的名字相同。
value属性:指定要赋给bean属性的值,可以使用一个请求时属性表达式作为value的值,不能同时出现value和param
通过*来设置所有属性和输入参数之间的关联。
例如:<jsp:useBean id="hello" class="bean.HelloBean" scope="request">
<jsp:setProperty name="hello" property="*" />
</jsp:useBean>
//用于前一个页面提交到这个页面时可以这样用,scope为request,前面一个页面表单提交的 name属性的表单项 为对
应request的参数,用于设置javabean对象
里面所有的关于提交的属性的值
jsp:getProperty
例如:<jsp:getProperty name="beanName" property="propertyName" />//相当于<%=beanName.getProperty()%>或<%
out.write(beanName.getProperty()) %>
<jsp:useBean ...>
<jsp:setProperty...>
<jsp:getProperty...>
</jsp:useBean>
jsp:include
用于动态包含JSP程序或HTML文件等除非这个指令被执行到,否则它(被包含进来的jsp代码或html代码)是不会被Tomcat等JSP Engine编译的
对应于servlet的javax.servlet.RequestDispatcher类的include()方法
属性:
page:指定被包含资源的相对路径,该路径是相对于当前JSP页面的URL
flush:
格式:
<jsp:include page="URLSpec" flush="true"/>//flush默认为true,不要改为false,flush指另外一个网页的内容赶快输出
<jsp:include page="URLSpec" flush="true">
<jsp:param name="ParamName" value="paramValue"/>
</jsp:include>
request对象包含了原始的参数和用<jsp:param>指定的新参数。可以使用getParameter()返回参数。
和编译指令include的区别:
include编译指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入,然后再编译执行,而include指令在
转换时期是不会被编译的,只有在客户端请
求时期如果被执行到才会被动态的编译载入
include不能带参数,而<jsp:include>可以
jsp:param
用来设定include文件时的参数和对应的值,它和<jsp:include>,<jsp:forward>和<jsp:plugin>一起使用。
属性:
name:给出参数的名字
value:给出参数的值,可以是一个表达式
例如:
<jsp:include page="divide.jsp" flush="true">
<jsp:param name="v1" value="<%=value1%>">
<jsp:param name="v2" value="<%=value2%>">
</jsp:include>
//这里被包含的页面divide.jsp这个页面里面可以通过request.getParameter("v1")获得参数的值。
jsp:forward
jsp:param
用于将当前的请求转发给一个静态的的资源,JSP页面或者servlet。这个动作的作用同RequestDispatcher接口的forward()方法作用是一样的。
page:是相对于当前JSP页面的URL
格式:
<jsp:forward page="urlSpec" flush="true"/>
<jsp:forward page="urlSpec">
<jsp:param name="paramName" value="paramValue"/>
</jsp:forward>
对应的servlet代码:<% pageContext.forward("abc.jsp"); %>
<jsp:param>用于指定参数和其对应的值
forward的页面和forward到的页面是同一个request
与此相对应的是
reponse.sendRedirect//也用于转发页面
jsp:forward与response.sendRedirect的区别:
jsp:forward转发页面:转发完成后浏览器看到的还是第一个转发前的页面,转发发生在服务器端,所以请求的
request与转发给 转发页面的request是同一个
request
response.sendRedirect转发页面:转发完成后浏览器看到的是转发到的页面,第一个页面收到转发请求后先是返
回浏览器,然后浏览器在重新发起一个
request给第二个转发后的页面,所以第一次请求的request与第二次转发给转发页面的request不是同一个request
jsp:plugin
applet