jsp基础
jsp注释
jsp注释(不会发送到客户端):<%--注释内容--%>
html注释(会发送到客户端);<!--注释内容-->
jsp声明
jsp声明用于声明变量和方法,会转换成对应Servlet的成员变量或成员方法。所以jsp声明部分定义的变量和方法可以使用private、public等访问控制符修饰,也可使用static修饰,将其变成类属性和类方法。但不能使用abstract修饰方法,因为抽象方法将导致jsp对应的Servlet变成抽象类,从而导致无法实例化。
jsp声明语法格式:<%! 声明部分 %>
jsp输出表达式
jsp输出表达式语法格式:<%=表达式%>
会被转换成Servlet里的输出语句。
jsp脚本
jsp脚本将转换成Servlet里_jspService方法的可执行性代码。所以jsp脚本里声明的变量是局部变量,不能使用访问控制符修饰,也不可使用static修饰。jsp脚本不能定义方法。jsp页面里的其他所有静态内容都将由_jspService方法里输出语句来输出(out.write("");)。jsp脚本不要求强制处理异常,即使该异常是checked异常。如果jsp页面在运行中抛出未处理的异常,系统将自动跳转到errorPage属性指定的页面;如果没有指定错误页面,系统则直接把异常信息呈现给客户端浏览器。
jsp脚本中的9个内置对象
request和response是_jspService()方法的形参,其他的是局部变量,所以可以直接在Jsp脚本中调用这些对象,无须创建它们。
(1)application:javax.servlet.ServletContext的实例,代表JSP所属的Web应用本身,可用于JSP页面,或者在Servlet之间交换信息。
常用方法:
--》getInitParameter(String paramName):获取Web应用的配置参数
--》setAttribute
--》getAttribute
(2)config:javax.servlet.ServletConfig的实例,该实例代表该JSP的配置信息。
事实上,JSP页面通常无须配置,也就不存在配置信息。因此,该对象更多地在Servlet中有效。
常用方法:
--》getServletName()
--》getInitParameter(String paramName)
--》getInitParameternames()
(3)exception:java.lang.Throwable的实例,该实例代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令page的isErrorPage属性为true时,该对象才可以使用(初始化该对象的代码:Throwable exception=org.apache.jasper.runtime.JspRuntimeLbrary.getThrowable(request);)。
JSP脚本和静态HTML部分都将转换成_jspService()方法里的执行性代码,而它们已经处于try块中,一旦try块捕捉到JSP脚本的异常,并且_jspx_page_context不为null,就会调用
_jspx_page_context.handlePageException(t)来处理该异常。_jspx_page_context对异常的处理也非常简单:如果该页面的page指令指定了errorPage属性,则将请求forward到errorPage属性指定的页面,否则使用系统页面来输出异常信息。
常用方法:
--》getMessage()
--》printStackTrace()
(4)out:javax.servlet.jsp.JspWriter的实例,该实例代表JSP页面的输出流,用于输出内容,形成HTML页面。out可使用输出表达式来代替,<%=...%>表达式的本质就是out.write(...)。
(5)page:代表该页面本身,即Servlet中的this。
(6)pagecontext:javax.servlet.jsp.PageContext的实例,该对象代表该JSP页面上下文,使用该对象可以访问page、request、session、application范围的变量(访问方法为:getAttribute(String name,[int scope]),没有第二个参数的话表示page范围)。pagecontext可以获取其他内置对象,常用的方法有getServletContext()和getServletConfig()等。
(7)request:
javax.servlet.http.HttpServletRequest
的实例,该对象封装了一次请求,客户端的请求头和请求参数都被封装在该对象里。服务器端负责解析请求头、请求参数的就是JSP或Servlet,而JSP和Servlet取得请求参数的途径就是request。
常用方法:
1.访问请求参数:
--》String getParameter(String paramName)
--》String[] getParameterValues(String paramName)当该请求参数有多个值时,该方法将返回多个值所组成的数组。
--》Map getParameterMap()获取所有请求参数名和参数值所组成的Map对象。
2.访问请求头:
--》String getHeader(String name)
--》java.util.Enumeration<String> getHeaderNames()获取所有请求头名。
--》java.util.Enumeration<String> getHeaders(String name)获取指定请求头的多个值。
--》int getIntHeader(String name)获取指定请求头的值,并将该值转为整数值。
3.访问request范围的属性
--》void setAttribute(String attrName,Object attrValue)
--》Object getAttribute(String attrName)
4.设置解码方式:
--》setCharacterEncoding(String env)
5.执行forward或include:
--》getRequestDispatcher(String path)注意:path可以使用相对路径,ServletContext也有这个方法,但其URL只能使用绝对路径
6.获取本站在客户端上保存的所有Cookie:
--》Cookie[] getCookies()
(8)response:javax.servlet.http.HttpServletResponse的实例,代表服务器对客户端的响应。通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符响应(out是JspWriter的实例,JspWriter是Writer的子类,Writer是字符流,无法输出非字符内容)。而response对象常用于重定向,以及用于向客户端增加Cookie。
常用的方法:
(1)返回响应输出字节流:getOutputStream()
(2)重定向:sendRedirect(java.lang.String.location)
(3)Cookie:
void addCookie(Cookie cookie)
创建Cookie对象:1.通过Cookie(String name,String value)构造器创建实例;2.设置Cookie的生命期限;3.向客户端写入
(9)session:Javax.servlet.http.HttpSession的实例,该对象代表一次会话。当客户端浏览器与站点建立连接时,会话开始;当客户端关闭浏览器时,会话结束。由于通常需要将信息保存到Web服务器的硬盘上,所以要求session里的属性值必须是可序列化的。常用的方法有:getAttribute(String attrName)、setAttribute(String attrName,Object attrValue)等。
3个主要的编译指令
jsp的编译指令是通知JSP引擎的消息,它不直接生成输出。编译指令都有默认值。
使用编译指令的语法格式:<%@ 编译指令名 属性名="属性值"……%>
(1)page:针对当前页面的指令。
page指令的语法格式:
<%@page
[language="Java"]声明脚本语言的种类,默认是java[extends="package.class"]指定JSP页面编译所产生的java类所继承的父类或接口[import="package.class|package.*,..."]导入包。默认导入的包有:java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*[session="true|false"]设定是否该页面是否需要HTTPSession。[buffer="none|8KB|size Kb"]指定输出缓冲区的大小。输出缓冲区的jsp内部对象:out用于缓存jsp页面对客户浏览器的输出,默认值为8KB,可以设置为none,单位为Kb。[autoFlush="true|false"]当输出缓冲区即将溢出时,是否需要强制输出缓冲区的内容。设置为true时为正常输出;false时会在buffer溢出时产生一个异常。[isThreadSafe="true|false"][info="text"]jsp程序的信息,可通过Servlet.getServletInfo()方法获取该值。[errorPage="relativeURL"]指定错误处理页面。如果本页面产生了异常或者错误,而该jsp页面没有对应的处理代码(拦截和处理了相应的异常),则会自动调用该属性所指定的jsp页面。[contenType="mimeType[;charset=characterSet]"|"text/html;charSet=ISO-8859-1"]设定生成页面的文件格式和编码字符集,即MIME类型(默认为text/html)和页面字符集类型(默认为ISO-8859-1)[pageEncoding="ISO-8859-1"]指定编码字符集[isErrorPage="true|false"]设置本jsp页面是否为错误处理程序,错误处理页面通常无须指定errorPage属性
%>
(2)include(静态include):用于将一个外部文件嵌入到当前JSP文件中(因此被包含的页面可以是不完整的页面),同时解析这个页面中的JSP语句(如果有的话)。这是个静态的include语句,它会把目标页面的其他编译指令也包含进来,但动态include则不会。
include编译指令的语法格式:<%@include file="relativeURLSpec"%>
(3)taglib:用于定义和访问自定义标签。
7个动作指令
动作指令与编译指令的区别:编译指令是通知Servlet引擎的处理消息,而动作指令只是运行时的动作。编译指令在将JSP编译成Servlet时起作用;而动作指令通常可替换成JSP脚本,它只是jsp脚本的标准化写法。
(1)jsp:forward:执行页面转向,将请求的处理转发到下一个页面。执行forward指令转发请求时,用户请求的地址依然没有发生改变,但页面内容却完全变为被forward目标页的内容。因为并没有重新向新页面发送请求,只是完全采用了新页面来对用户生成响应--请求依然是一次请求,所以请求参数和属性都不会丢失。forward指令使用_jspx_page_context的forward()方法来引入目标页面。
语法格式:<jsp:forward page="{relativeURL|<%=expression%>}">{<jsp:param name="属性名" value="属性值"/>}通过getParameter()方法获取属性值</jsp:forward>
(2)jsp:param:用于传递参数,必须与其他支持参数的标签一起使用(jsp:include、jsp:forward、jsp:plugin)。
语法格式:<jsp:param name="参数名" value="参数值"/>
(3)jsp:include(动态include):用于动态引入一个jsp页面。它不会导入被Include页面的编译指令,仅仅将被导入页面的body内容插入本页面。在Servlet中会被替换成:org.apache.jasper.runtime.JspRuntimeLibrary.include(request,response,"被包含的页面",out,false);
语法格式:<jsp:include page="{relativeURL|<%=expression%>}" flush="true">flush属性用于指定输出缓存是否转移到被导入文件中。指定为true时,则包含在被导入文件中;指定为false则包含在原文件中。{<jsp:param name="属性名" value="属性值"/>}通过getParameter()方法获取属性值</jsp:include>
静态导入和动态导入的区别:
1.静态导入是将被导入页面的代码完全融入,两个页面融合成一个整体Servlet;而动态导入则在Servlet中使用include方法来引入被导入页面的内容。
2.静态导入时被导入页面的编译指令会起作用;而动态导入时被导入页面的编译指令则失去作用,只是插入被导入页面的body内容。
3.动态包含还可以增加额外的参数。
(4)jsp:plugin:用于下载服务器端的javaBean或Applet到客户端执行。因此客户端必须安装虚拟机。
(5)jsp:useBean:创建一个JavaBean的实例。
语法格式:<jsp:useBean id="name" class="classname" scope="page|request|session|application"/>
id属性是JavaBean的实例名,class属性确定javaBean的实现类。scope属性用于指定JavaBean实例的作用范围,该范围有4个值(page:仅在该页面有效、request:在本次请求有效、session:在本次session内有效、application:在本应用内一直有效)。
(6)jsp:setProperty:设置javaBean实例的属性值。
语法格式:<jsp:setProperty name="JavaBean实例名" property="属性名" value="属性值"/>
当页面使用setProperty和getProperty标签时,系统底层就是调用set+属性名()和get+属性名()方法来设置属性。所以要求对应的Bean提供这些方法。
(7)jsp:getProperty:输出javaBean实例的属性值。
语法格式:<jsp:getProperty name="JavaBean实例名" property="属性名"/>
jsp 2特性
如果需要使用JSP2语法,其web.xml文件必须使用Servlet 2.4以上版本的配置文件。
(1)配置jsp属性:JSP属性定义使用<jsp-property-group/>元素配置。
--》格式:
<web-app...>
<!--关于JSP的配置信息-->
<jsp-config>
<jsp-property-group>
<!--满足指定URL规则的JSP才应用以下的配置-->
<url-pattern>/path/*</url-pattern>
<!--是否允许使用表达式语言,默认值为false-->
<el-ignored>true|false</el-ignored>
<!--是否允许使用JSP脚本,默认值为false-->
<scripting-invalid>true|false</scripting-invalid>
<!--声明JSP页面的编码,可以代替每个页面里page指令contentType属性的charset部分-->
<page-encoding>GBK</page-encoding>
<!--隐式导入页面头-->
<include-prelude>/inc/top.jsp</include-prelude
<!--隐式导入页面尾-->
<include-coda>/inc/bottom.jsp</include-coda>
</jsp-property-group>
<jsp-property-group>
...
</jsp-property-group>
</jsp-config>
</web-app>
(2)表达式语言(Expression Language):表达式语言是一种简化的数据访问方式,可以方便地访问JSP的隐含对象和JavaBeans组件。
语法格式:${expression}
如果需要在支持表达式语言的页面中正常输出“$”符号,则在“$”符号前加转义字符“\”
--》表达式语言支持的算术运算符和逻辑运算符:+、-、*、/、mod、div、三目运算符、< | lt、、> | gt、== | eq、>= | ge、<= | le、!= | ne(表达式语言把所有数值都当成浮点数处理,先执行运算,再进行比较)
--》表达式语言的11个内置对象
1.pageContext:代表该页面的pageContext对象
2.pageScope:用于获取page范围的属性值
3.requestScope:用于获取request范围的属性值
4.sessionScope:用于获取session范围的属性值
5.applicationScope:用于获取application范围的属性值
6.param:用于获取请求的参数值
7.paramValues:与param的区别在于该对象获取属性值为数组的属性值
8.header:用于获取请求头的属性值
9.headerValues:与header的区别在于该对象获取属性值为数组的属性值
10.initParam:用于获取请求Web应用的初始化参数
11.cookie:用于获取指定的Cookie值
--》表达式语言的自定义函数:提供一种语法允许在EL中调用某个类的静态方法。
步骤:
a.开发函数处理类:包含若干个静态方法,每个静态方法都可定义成一个函数。可以直接使用JDK或其他项目提供的类作为函数处理类,只要这个类包含静态方法即可。
b.使用标签库定义函数:
<taglib xmlns=""
xmlns:xsi=""
xsi:achemaLocation=""
version="">
<tlib-version>1.0</tlib-version>
<short-name>crazyit</short-name>
<!--定义该标签库的URI-->
<!--定义第一个函数-->
<function>
<!--定义函数名-->
<name>reverse</name>
<!--定义函数的处理类-->
<function-class>pwd.Functions</function-class>
<!--定义函数的实现方法-->
<function-signature>java.lang.String reverse(java.lang.String)</function-signature>
</function>
</taglib>
3.在JSP页面的EL中使用之前导入标签库。
导入:<%@taglib prefix="crazyit" uri="http://www.crazyit.org/tags"%>
使用:${crazyit:reverse(param["name"])}
(3)tag file支持:tagFile是自定义标签的简化,使用TagFile可以无须定义标签处理类和标签库文件。TagFile的格式类似于JSP,最终会编译成标签处理类。TagFile的主文件名就是标签名,文件名的后缀必须是tag。将该文件放在Web应用的某个路径下,这个路径相当于标签库的URI名(若放在WEB-IF/tags目录下,则URI为"/WEB-IF/tags")。
导入:<%@taglib prefix="tagPrefix" tagdir="path"%>tagdir指定的路径下存放多个TagFile,每个TagFile对应一个标签。

浙公网安备 33010602011771号