本文共 8400 字,大约阅读时间需要 28 分钟。
3.1. 什么是 jsp? *
sun 公司制订的一种服务器端劢态页面生成技术规范。
**********JSP生命周期包括以下阶段:
解析阶段:Servlet容器解析JSP文件代码,如果有语法错误,就会向客户端返回错误信息 翻译阶段:Servelet容器把JSP成Servelet源文件 编译阶段:Servelet容器编译Servelet源文件,生成servelet累阶段:加载与JSP对应的Servelet类,创建其实例,并调用它的方法 运行时阶段:调用与JSP对应的Servelet实例的服务方法 销毁阶段:调用与JSP对应的Servelet实例的销毁方法,然后销毁Servelet实例3.2. jsp 的组成? *
1) html(html,css,javascript)
2) java 代码
第一种形式:java 代码片断 <% %>
第二种形式:jsp表达式<%= %>
第三种形式:jsp声明<%! %>
3) 指令
page指令
import属性
pageEncoding 属性
contentType 属性
session属性:true(缺省)/false。如果值为 false,则对应的 servlet 代码 当中不会生成声明和创建 session 的代码。也就是说, 不能够使用 session 隐含对象了
isELIgnored 属性:true(缺省)/false,是否忽略 el 表达式,如果是 true,忽略。
isErrorPage 属性:true/false(缺省),当前 jsp 是否是一个错误处理页面,如 果是 true,是错误处理页面
errorPage 属性:用于指定错误处理页面。
include指令
file 属性
taglib 指令:用于导入标签
uri属性:标签文件的命名空间
prefix属性:命名空间的前缀
4) 隐含对象(9 个)
out
request responsesession
applicationexception:
当一个页面设置了<%@page isErrorPage="true"%>,则可 以 在该页面当中,使用该隐含对象读取错误信息。
config:就是 ServletConfig,可以读取 jsp 的配置参数。
pageContext:是 PageContext 类的实例,服务器会为每一个 jsp 实例(指的是 jsp 对应的那个 servlet 对象创建唯一的一个 PageContext 实例。作用主要有两个:绑订数据:setAttribute,getAttribute,removeAttribute;获得其它几个隐含对象:即在获得了 pageContext 实例之后,可以通过该实例,获得其它 8 个隐含对象。
page:表示 jsp 实例本身。
5) 活动元素
在 jsp 实例已经运行了,告诉 jsp 引擎做一些处理。
<jsp:forward page=""/>转发,page 属性指定转发的地址。
<jsp:include></jsp:include page="">一个 jsp 在运行过程当中,调用另外一个 jsp。
<jsp:param name="" value=""/>设置参数 name 指定参数名 value 指定参数值
<jsp:useBeanid="user" scope="request'" class="类"/>在指定的范围绑订一个对象。范围指的是四个对象 pageContext,request,session,servletContext。也就是说 scope 的值可以是"page","request","session","application"。
<jsp:getProperty/>
<jsp:setProperty name="user" property="user对应类的属性" value="属性值"/>
<jsp:setProperty name="" property="" param=""/>//依据请求参数给属性赋值
<jsp:setProperty name="" property="*"/>使用"自省机制"给属性赋值。
6) 注释
<!-- <%=new Date()%> -->注释中的代码会执行,但丌会在页面上输出。
<%--xxxx--%>注释中的代码丌会执行,也丌会在页面上输出。
7) jsp 源文件如何转换成.java 文件? *
html----> service(),使用 out.write()输出。
<% %>----> service(),照搬。
<%=%>----> service(),使用 out.print()输出。
指令----> 会影响源代码的生成,比如导包。
<%! %>----> jsp 声明中定义的变量会变为对应的 servlet 类的属性,
定义的方法会变成对应的 servlet 类的一个方法。
context和request的生命周期:
pageContext:只有对应的JSP实例自己可以访问,生命周期从对应的JSP对象创建到JSP 对象消亡。一般用于数据库连接。
request:一次请求能访问,生命周期在一次请求和响应期间。一般存放错误处理。
session:一次会话期间能访问,多次请求和响应期间都存在。一般存放个人信息,如购物车信息。
ServletContext:整个应用内部所有组件都能访问,除非服务器关闭,否则一直存在。
***jsp 模板设置:
Preferences==》Web==》JSP Files==》Editor==》Templates选择New JSP FILE(xhtml)
1. jstl 与 el 表达式
1.1. jstl 是什么? *
java standard taglib(java 标准标签库)。
1.2. 标签是什么? *
sun 公司制订的一种技术规范,用来将 jsp 页面中的 java 代码使用类似于 html 当中的标记来替换 的一种技术。这样做的目的,是为了使 jsp 页面更好维护以及更好的测试。
1.3. el 表达式是什么? *
sun 制订的一种用于计算的一种规则,早期只能用于给标签的属性赋值,现在也可以直接输出。
EL 表达式是干什么用的?
EL 表达式把数据从四个范围(pageContext、request、session、application)中取出来显示戒 者计算。
EL 表达式解决了 Java 代码和 HTML 的丌匹配问题(让 html 页面中丌再有 java 代码)。EL 表达式用字符串表达式替换 Java 代码,用来表示对数据的获取或计算。
*****jsp(java server page)和servlet一样是在服务器端执行的;jsp中可以写html内容和Java的内容。
jsp的运行原理:先把jsp翻译成servlet,-》编译-》访问。 jsp编译后会在服务器的work目录下生成一个文件夹,在最里层的文件夹中会有xx.class(编译后的类)和一个xx.java类(有jsp文件转换来的)。jsp中的脚本元素:
<%! %>定义类,变量,方法等。不常用 <%=“hello” %>输出语句,输出到页面,不能有分号,=号后面跟输出的内容。 <% %>最长用的。EL:
获取域对象中的内容:${XX}
jsp中的注释:
jsp的页面注释:<%-- XXX --%>存在jsp文件阶段,转化阶段消失(jsp转化成Java的servlet后消失),只能被开发人员看到; Java注释://、/**/、/***/jsp文件阶段存在,翻译成Java文件也存在,编译阶段消失; HTML注释:<!-- XX -->,不会消失,在页面也能看到;jsp的指令元素:
语法格式:<% @指令 属性=属性值 %> 指令的分类: ******page指令:设置jsp的全局属性,注意:只有import属性可以出现多次,其他属性只能出现一次; *page的属性: language:jsp文件允许嵌入的语言,目前只允许java; extends:jsp翻译servlet文件;servlet继承的类; session:默认值为true,可以直接使用,false的不能直接使用个,但可以获取到再使用; import:引入jar包;(j的自动sp中的自动导包的快捷键是ALT+/) buff:设置缓冲区大小,默认是8kb; aotoFlush:是否默认刷新缓冲区,默认为true; errorPage:指定一个错误的页面(这个优先级高,如果配置了全局的错误页面,就不要配置这个页面);也可以在web.xml中配置全局的错误页面, <error-page><error-code>500</error-code><location>XX</location></error-page> isErrorPage:设置值后,可使用exception对象,可以获取exception中的信息; comntentType:设置服务器输出内容的编码方式,浏览器打开后的编码; pageEncoding:jsp翻译成servlet时采用的编码; isELignore:jsp 页面默认是可以使用EL语言,如果是true的话,就忽略EL表达式,就不能使用EL。*****include指令:包含页面
语法:<%@ include file="文件地址(静态包含)" %>静态包含就是把所有的文件复制到一起,然后翻译成servlet,再一起编译。 taglib指令:引入标签库 语法:<%@ taglib uri="标签库文件的地址" prefix="标签库名"%>设置jsp文件的打开方式,可以提高打开速度:preference -General-Editor--文件关联---*jsp----选择myeclipse JSP Editor def
设置jsp文件的编码:preference--搜索jsp--选择UTF-8; JSP的内置对象:-----真实对象 request---------HttpServlet response--------HttpResponse session --------HttpSession application ------------ServletContext out ----------------JspWrite输出,out对象缓冲区的东西会先输出到response的缓冲区,然后再输出,同时存在out.printhe resposne.getWrite().print()时,先输出后者。 pageContext------------PageContext只对jsp当前页面有效,可以获取其他8个域对象。可以自己存取值,也可以向其他域中存取值。 jsp的四个域对象:servletContext(整个web应用) session(一次会话) request(一次请求) pageContext(当前页面)page -------------Object,由jsp生成的当前的Java类的对象。
config----------ServletConfig exception--------------Throwable,使用前提,要设置isErropage="true"JSP动作标签:
<jsp:forward page="转发的路径" >转发 <jsp:param name="username参数名" value="lambo参数值"> </jsp:forward><jsp:include page="动态包含的路径">页面包含,动态包含,把包含翻译成.java文件,然后编译成.class文件,最后把所有的.class等结果文件一起显示。
<jsp:param>传递参数 javaBean:一个javaBean对应数据库一张表; 下面的标签是把数据封装到javaBean中,在jsp页面完成 <jsp:useBean id="u" class="web.userjavaBean的类"></jsp:useBean> <jsp:setProperty property="username" name="u对应前面的id"/> <jsp:getProperty property="username" name="u"/> <jsp:setProperty> <jsp:getProperty>内省的技术实现数据封装:要自己实现
beanutils工具包:Apache开发的一组工具包,BEanutils.populate(javabean的对象,要绑定的数据); Date类型需要自己手动实现。 把字符串转换成日期:编写一个类,实现converter接口, 实现接口方法public void convert(Class clazz,Object obj){ 把输入的字符串转换成日期类型:String dDate=(String)obj; 把字符串转换成日期:SimpleDateFormat sdf=new SimpleDateFormat ("yyyy-MM-dd"); Date dat=sdf.parse(dDate);},
在封装之前完成注册:CoverUtils.register(new MyDateConvert(),Date.class);EL表达式:${}
1.获取域对象中的值; ${} 2.执行运算 3.获取web开发中的对象; 请求的参数${param.usernam} 请求头${header。referer} 获取全局初始化参数${initpParam.username} 获取cookie${cookie.last.name}last是cookie的名称,name是cookie存储的名称,value是cookie存储的值。 ${pageContext}4.调用Java方法
JSTL:jsp的标准标签库:和el一起取代<% %>来写java代码;
需要一个标签库即JSTL。需要引入它的库,将jstl.jar和standard.jar考到WEB-INF/lib下,然后采用tablib指令引入标签库。
各套框架(还没有学习,比如struts,SpringMVC等)都有自己的标签库,这时JSTL可以作为公共、通用的,横行于各框架中。
下载地址:,、里面有四个jar包,全部复制到lib文件夹下。参考、
导入jar包,引入核心标签库; <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 输出标签: <c:out value="hello"></c:out> <c:out value="${username}" default="取不到前面value的值,就显示这里的默认值" escapXml="true,默认的,表示转义"></c:out>向web'域中存入数值,修改对象和javaBean的属性值;
<c:set var="变量" value="变量的值" scope="request,可以是其他的域">
<c:set trget="${user对象}" property="属性" value="属性值">用set改变属性的值删除属性:
<c:remove var="删除的属性" scope="域" >捕获异常:捕获的异常保存在变量e中。
<c:catch var="e"> 代码 </c:catch> ${e.message}获取异常 <c:if test=${这里可以是表达式表示true和false} var="把前面test中计算的结果保存在这个变量中" scope=""> 这里写代码 </c:if>下面这个类似if else
<c:choose> <c:when test="${}"></c:when>
<c:when test="${}"></c:when>
<c:otherwise></c:otherwise>
</c:choose>
<c:forEach var="s" items=${arr}>
var要遍历的数据类型,items要遍历的内容 </c:forEach><c:forEach var =“i” begin=“1” end=“10” step=“2” varStatus="stu遍历后的结果放在这个属性中" >
迭代数据,varStatus有count,last,first属性; </c:forEach> <c:import url=“/jstl/choose.jsp” context="/Firest" var="i页面的内容存在var中">包含页面 url引入的页面 context虚拟路径 va引入的页面存到这个里面 scope域<c:param name="名称" value="值"> 传递参数
</c:import><c:url var="i" value="/jsp/choose.jsp" scope="request" context="/First">
var申明属性,i就是整个url地址,包含虚拟路径和value的值 context虚拟路径 ${i}获取url地址 <c:redirect url="/jstl/choose.jsp" scope="reuest" context="/First">重定向 <c:param name="" value="">参数 </c:redirect><c:forTokens items="分,割,的,字,符串" delims="," var=“x”>字符串分割,
items要分割的字符串 delims以什么分割 var分割后的内容存到var中在使用el的函数前导入<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
自定义el函数的步骤: 1.编写一个java类,方法必须是静态方法; 2.在WEB-INF目录下闯进一个tld文件 3.在tld中配置: <tlib-vertion>1.0</tlib-version> <short-name>myfn</short-name> <uri>http://xxxx/myfn</uri> <function> 配置方法名称,这里的名称可以和类中的方法名不一样,这个是只代类中的方法<name>sayHi<name> 方法所在的类<function-class>包名.类名A</function-class> 配置方法签名,按照类中方法的格式,多个参数用逗号隔开<function-signature>java.lang.String sayHelo(参数类型java.lang.String)</signature> </function> 使用自定义的el函数: 首先引入标签库: <%@ taglib uri="http://xxxx/myfn" prefix="myfn"%>uri和prefix就是tld中配置的;自定义标签:
1.自定义一个类,实simpleTag接口,继承simpleTagsupport就可以; 几个方法的执行顺序: *setJspContext()将jsp页面的pageContext对象传给标签处理器对象 setParent()将父标签的对象传给当前标签处理器对象 setter() setJspBody()把标签体(两个标签之间的内容)传过来 *doTag()执行标签 getParent() setter()2.在WEB-INF中创建一个tld文件,配置;类似自定义el函数;
<tag> 配置标签名称<name>print</name> 配置标签类<tag-class>包名.自定义的标签类</tag-class> 标签主体可选值:scriptless,empty,tagdepent <body-content> </body-contnt> </tag>MVC模式:
model-----javaBean view----jsp controller------servlet