作者:whisper
链接:http://proprogrammar.com:443/article/9
声明:请尊重原作者的劳动,如需转载请注明出处
1.概述
JSP是一种基于文本的程序,其特点是HTML代码与JAVA程序共同存在。执行时JSP会被TOMCAT自动编译,这个过程对开发者是透明的、不需要关注的。编译后的JSP跟HttpServlet一样,都是javax.servlet.Servlet接口的子类,因此JSP是另一种形式的Servlet。
一般意义上,在提到JSP与Servlet时,Servlet一般是指HttpServlet。如果不特别指明,本书中的Servlet一般是指HttpServlet而不是Servlet接口。
它的出现是为了克服Servlet的弱点。
JSP包括很多技术,包括Java Bean,自定义标签(Custom Tags),EL表达式(Expression Language),JSTL标准标签类库(Java Standard Tag Library)等。这些强大成熟的技术使得JSP在视图层(View Tier)有很大的优势。
2.工作原理
JSP是一种Servlet,但是与HttpServlet的工作方式不太一样。JSP是先部署后编译:JSP会在客户端第一次请求JSP文件时被编译为HttpJspPage类(接口Servlet的一个子类)。该类会被服务器临时存放在服务器工作目录里面。
TOMCAT能够自动检测到JSP程序的改动。如果检测到改动,下次请求到达TOMCAT会重新编译JSP,而不需要重启TOMCAT。
3.JSP生命周期
JSP也是Servlet,运行时只会有一个实例。跟Servlet一样,JSP实例初始化、销毁时也会调用Servlet的init()与destory()方法。另外,JSP还有自己的初始化方法与销毁方法_jspInit()与_jspDestory().
4.JSP语法
JSP代码可以包括两部分,模板数据与元素
模板数据:JSP中的HTML代码。
元素:就是JSP中的JAVA部分,包括脚本、JSP指令与JSP标签。
脚本即JAVA代码部分,用<% %>括起来。JSP声明方法或者全局变量时使用 <%! %>,注意声明的方法不要覆盖了已有的方法,否则会引起错误。
JSP输出用out.println()
JSP注释除了JAVA,HTML的注释外,还可以用<%-- --%>
可以通过JAVA代码控制HTML代码。如在if块中包含html达到一定条件下展示HTML的效果。或通过循环达到展示表格数据的效果。
因为JSP本质上就是JAVA,所以如果在JSP中有return,则return后面的代码不会被执行。
5.JSP指令
常见的指令有page, taglib, include。
page指令的多个属性可以写在多个page指令中。
page指令的常见属性 language,extends,import,session,autoFlush,buffer,isThreadSafe,idErrorPage,errorPage,contentType,info,trimDirectiveWhitespaces,其它还有isXml,isELEnabled,isScriptingEnabled
include指令只有一种形式:<%@include file="relativeURL" %>。可以用来包含页面均有的统一风格的导航栏head.jsp与foot.jsp等。还可以在web.xml文件中通过配置来包含文件。
taglib指令用来指明JSP页面内使用的JSP标签库。如<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
6.JSP行为
JSP行为是一组JSP内置的标签。包括两种,自定义行为与标准JSP行为。标准的JSP行为格式为<jsp:elements {attribute="value"} * />
6.1 <jsp:include />
语法为<jsp:include page="relativeURI" flush="true" />
6.2 Java Bean(POJO),包括一组行为,useBean,setProperty,getProperty行为等。
e.g.
<jsp:useBean id="person" class="..." scope="page" />
属性从request中自动取得,表示所有属性
<jsp:setProperty name="person" property="" />
<jsp:getProperty name="person" property="name" />
6.3 <jsp:plugin />
plugin行为包括<=<jsp:plugin />, <jsp:params />, <jsp:param />, <jsp:fallback />
e.g.
jsp:plugin运行会生成object,embed等
6.4 <jsp:forward />
即request.getRequestDispatcher("someServlet").forward(request, response)的一个封装。
同Servlet一样,跳转动作发生之前不能有任何输出到达客户端浏览器,否则会抛出IllegalStateException
6.5 <jsp:directive />
相当于JSP指令,有,<jsp.directive.page /> <jsp.directive.include /> <jsp.directive.taglib />
7.JSP隐藏对象,总共有9个,out,request,response,config,session,application,page,pageContext,exception
7.1 out
是javax.servlet.jsp.JspWriter类的实例。客户端输出字符内容。
常用方法有
append(CharSequence) 向缓存中扩展字符类输出
clear() 清空要输出的内容
flush() 将缓存内容flush到客户端浏览器
println(String) 向客户端输出内容
isAutoFlush() 返回缓存满时是否自动flush。如果为false,缓存满时会抛出异常
getBufferSize() 返回缓存大小
getRemaining() 返回缓存剩余大小
7.2 request
是javax.servlet.ServletRequest类的实例,代表着客户端的请求。
常用方法有
setAttribute(String,Object)
getAttribute(String)
getMethod()
getParameter(String)
Enumeration getParameterNames()
String[] getParameterValues(String)
Cookie[] getCookies()
getContextPath()
getRequestURI()
setCharacterEncoding(String)
getHeader(String)
getHeaderNames()
getRequestDispatcher()
getSession()
7.3 response
是javax.Servlet.ServletResponse类的实例。代表着客户端的响应。
常用方法有
clear()
addCookie(Cookie)
OutputStream getOutputStream()
sendRedirect(String)
setContentType(String)
PrintWriter getOut();
setHeader(String, String)
setStatus(int)
7.4 config
是javax.servlet.ServletConfig类的实例。可以获取web.xml中初始化的JSP的参数
常用方法有
getInitParameter(String)
Enumeration getInitParameterNames()
ServletContext getServletContext()
getServletName()
7.5 session
是javax.servlet.http.HttpSession类的实例。session与cookie是记录客户访问信息的两种机制。session用于在服务器端保存用户信息,cookie用于在客户端保存用户信息。在JSP页面可以配置<%@page session="false" %>来禁止页面使用session。
常用方法有
getId()
getAttribute(String)
Enumeration getAttributeNames()
getCreationTime()
getLastAccessedTime()
getMaxInactiveInterval()
setAttribute(String,Object)
setMaxInactiveInterval(long)
7.6 application
是javax.servlet.ServletContext类的实例。封装了JSP所在的WEB应用程序的信息。例如web.xml中配置的全局初始化信息。
getAttribute(String)
Enumeration getAttributeNames()
setAttribute(String,value)
removeAttribute(String)
getInitParameterNames()
getMimeType(String) 返回文件的文档类型
getRealPath(String)
7.7 page页面对象
是javax.servlet.jsp.HttpJspPage类的实例。代表当前JSP页面。相当于普通的JAVA类中的关键字this。
7.8 pageContext页面上下文对象
是javax.servlet.jsp.PageContext类的实例。通过pageContext能够获取到JSP中的资源。
常用方法有
findAttribute(String) 在JSP页面中查找变量
forward(url) forward到另一个页面
getAttribute(String)
getAttribute(String, scope)
getOut()
getPage()
getRequest()
getResponse()
getSession()
7.9 exception
是java.lang.Exception的实例
封装了JSP中抛出的异常信息。要使用exception隐藏对象,需要设置<%@page isErrorPage="true" %>
一个页面设置<%@page errorPage="error.jsp" %>
另一个error.jsp页面设置<%@page isErrorPage="true" %>
8 JSP配置
8.1 <jsp-config>标签
支持对JSP的批量操作。包括两个标签<taglib>与<jsp-property-group>
e.g.
9 EL表达式
EL(Expression Language),用${}
括起来的脚本,
9.1 EL表达式
EL表达式提供了获取对象以及属性的的简单方式。
如session中有个bean对象person,那么可以${person},${person.age},${person.sex}
,
可以级联,${person.city.province.country}
9.2 隐藏对象
param,paramValues,header,headerValues,cookie,initParam,pageScope,requestScope,sessionScope,
applicationScope,pageContext
EL还可以不带任何前缀的,如${person.age}
,会先在request中查找,如果没有,再在session中查找。
9.3 EL表达式运算
算术运算:+,-,*,/(div),%(mod),?:
关系运算:>(gt),<(lt),==(eq),!=(ne),>=(ge),<=(le)
逻辑运算:&&(and),||(or),!(not)
empty 判断集合或数组是否为空
亲爱的读者:有时间可以点赞评论一下
全部评论