JSP基础语法与内置对象
基本语法
概述
浏览器请求JSP页⾯之后Web服务器做了什么:
⽤户发送HTTP请求之后Web服务器识别出是对JSP⽂件的请求,将请求交给JSP引擎
翻译阶段:JSP引擎将⽂件翻译为Servlet⽂件,这⼀步主要是将JSP⽂件中的模板语句加上println(),并将所有的JSP元素改为JAVA 代码
编译阶段:JSP引擎将Servlet⽂件翻译为字节码⽂件.class,然后编译为可执⾏⽂件`.exe’
请求阶段:服务器将请求和可执⾏⽂件交给Servlet引擎,Servlet引擎执⾏可执⾏⽂件,此过程中产⽣的HTML输出内嵌于HTML response,将最后的HTML response以静态HTML页⾯形式交给浏览器
当多个客户请求⼀个JSP页⾯时,服务器为每个客户启动⼀个线程,负责执⾏常驻内存的字节码⽂件来响应相应客户的请求
常⽤Java Web服务器:Tomcat
编译标识
⼜称指令标识,会在编译阶段被JSP引擎处理,不会显⽰在浏览器中,是为JSP引擎设计的,描述整个页⾯的信息。
语法格式:<%@ 指令符属性1=“值1” 属性2=“值2”.....%>
page指令
有15个属性,包括contentType、import、language、session、buffer、auotFlush 、isThreadSafe、pageEncoding
import:为JSP页⾯引⼊Java运⾏环境提供的包中的类,默认引⽤java.lang.*``javax.servlet.*
contentType:JSP页⾯响应的媒体格式和JSP页⾯字符的编码,⽐如有时候点击某链接跳转结果为执⾏⼀个下载。如果是请求HTML页⾯⼀般取contentType="text/html; charset=UTF-8",charset:设置服务器发送给客户端时的内容的编码
language:定义JSP页⾯使⽤的脚本语⾔,只能取java,JSP⽂件默认有此page指令
include指令
使⽤include指令后,会在该⾏代码的位置嵌⼊相应的JSP⽂件,包含的⽂件就好像是原JSP⽂件的⼀部分,会被同时编译执⾏
<%@include file="tmp.jsp"%>
脚本标识
<%= %>JSP表达式,其中的内容会输出到页⾯上,其实相当于<% out.println()%>,<%和=之间不可以有空格
<%! %>声明标识,定义全局变量和⽅法
<% %>代码⽚段,⾥⾯是JAVA代码或脚本代码,在页⾯请求的处理期间被执⾏。
对⽐<%! %>声明的全局变量与<% %>中声明的局部变量,代码⽚段中声明的变量称为JSP页⾯的局部变量,仅在当前线程有效,多个线程请求同⼀个JSP时,分别有不同的变量,多个客户请求⼀个JSP页⾯时 , Java程序⽚将被执⾏多次,分别在不同的线程中执⾏,⽽⽤<%! %>声明的变量为全局变量,仅在类加载时初始化⼀次,对于多个线程会⽤同⼀个。(类⽐C嘉嘉类中的类成员和实例成员)
<%! int sum = 1;%>
sum = <%= ++sum%>
上⾯这种情况下,刷新页⾯会导致sum的值不断增加,但是如果修改JSP代码导致JSP重新编译,sum的值⼜会变成2,全局变量类似JSP ⽣成的类中的⼀个属性成员
<% int sum = 1;%>
sum = <%= ++sum%>
上⾯这种情况下,每次刷新值都是2,局部变量类似JSP某函数中的⼀个变量(类⽐C嘉嘉啦)
动作标识
动作标识在请求阶段起作⽤,使⽤XML语法,样式和标签差不多,有结束标签
<!-- 写法1 -->
<;动作名属性1=""/>
<!-- 写法2-->
<;动作名属性1=""></动作名>
1. jsp:include引⼊⽂件(注意与指令标识区分)
1. include通过file属性指定被包含的⽂件,并且file属性不⽀持任何表达式; <jsp:include>动作标识通过page属性指定被包含的⽂
件,⽽且page属性⽀持JSP表达式。
2. ⽤include指令,被包含的⽂件内容会原封不动地插⼊到包含页中,然后JSP编译器在将合成后的⽂件最终编译成⼀个Java⽂
件,被包含⽂件和包含⽂件中不能有重名的变量或⽅法;
3. ⽤<jsp:include>,标识被执⾏时,程序会将请求转发(不是重定向)到被包含的页⾯,并将执⾏结果输出到浏览器中,然后返回
包含页,继续执⾏后⾯的代码。因为服务器执⾏的是多个⽂件,所以JSP编译器会分别对这些⽂件进⾏编译,在被包含⽂件中重名的变量和⽅法是不相冲突的。
4. 指令标记在编译时就将⼦⽂件载⼊;动作标记在运⾏时才将⼦⽂件载⼊;两者的执⾏速度不同。
5. <jsp:include>标识对静态⽂件和动态⽂件处理不同,对于静态⽂件,将⽂件直接嵌⼊页⾯,对于动态⽂件,将编译运⾏的结果嵌
⼊页⾯。静态/动态⽂件由标识指定,与⽂件本⾝类型⽆关
6. <jsp:include>标识中不能包括⽂本(报错惹
2. jsp::useBean寻或者实例化⼀个JavaBean
3. jsp:getProperty输出某个JavaBean的属性
4. jsp:setProperty设置JavaBean的属性
5. jsp:forward把请求转到⼀个新的页⾯<jsp:forward page="login.jsp" />,原页⾯该动作之后的代码不再执⾏
6. jsp:param作为其他标签的⼦标签传递参数
页⾯跳转传递参数的例⼦
<forward page="tmp.jsp">
<param name="computer"value="a"/>
</forward>
<include page="tmp.jsp">
<param name="computer"value="300"/>
</include>
<% String tag = Parameter("computer");%>
computer is <%= tag%>
注释
JSP可以放⼊HTML的注释
<!-- 注释 -->
在代码⽚段当然也可以放⼊Java注释
<%
//int i=0;
%>网页设计html代码翻译
除此之外JSP还有两种特殊注释
<%-- 注释 --%>静态注释,最后⽣成的html界⾯源代码不会包括此注释
<!-- <%= new Date()%> -->动态注释,结合html注释与声明标识
杂
⼀些乱七⼋糟的
CSS的空格处理
1. ⽂字的前部和后部的空格都会忽略,内部的连续空格只会算作⼀个。这就是浏览器处理空格的基本规则。如果希望空格原样输出,可
以使⽤<pre>标签或⽤改⽤ HTML 实体 ;表⽰空格。
<pre> hello world </pre>
<p> hello world </p>
2. HTML 处理空格的规则,适⽤于多种字符。除了普通的空格键,还包括制表符(\t)和换⾏符(\r和\n)。
浏览器会⾃动把这些符号转成普通的空格键,可以使⽤<br>标签显式表⽰换⾏。
同样的原理,使⽤out.println时也会发现其实根本不会换⾏
<%out.println("ssss");%>
HTML字符实体
四⼤作⽤域
为了⽅便页⾯间数据共享和信息传递,JSP定义了四⼤作⽤域:page页⾯内共享,request请求内共享,session会话内共
享,application Web应⽤程序内共享
page
仅在当前页⾯有效,使⽤pageContext实例的setAttribute和getAttribute⽅法可以访问该作⽤域内的对象(pageContext也提供了访问其他域的getAttribute⽅法),如果当前页⾯forward到其他页⾯或者刷新页⾯(重新发送request请求),当前page域的变量全部失效
request
在⼀次请求内共享,存放在HttpServletRequest对象中。可以在两个forward的页⾯之间传递数据,但是刷新页⾯或者页⾯跳转之后失效。
session
当我们向服务器发送第⼀个请求开始,只要页⾯不关闭,或者会话未过期(默认30分钟),或者未调⽤HttpSession的invalidate()⽅法,接下来的操作都属于同⼀次会话的范畴。在JSP中,每当向服务器发送⼀个请求,服务器响应这个请求的时候,会在客户端的Cookie中写⼀个session id值。每次发送请求的时候,会将该session id值⼀起发送到服务器端,服务器端根据该session id值来判断每次请求是否属于同⼀个session的范畴之内。其存放在HttpSession对象中。上⾯所说的请求转发,页⾯跳转,刷新页⾯都不会使它失效,可以在不同页⾯之间传递数据。
application
在应⽤程序内有效,只要不重启tomcat,该域内的变量不会消失。application的作⽤域是最⼴的,它代表着整个Web应⽤的全局变量,对每⼀个页⾯,每⼀个Servlet都是有效的。当我们在application中设置属性时,这个属性在任意的⼀个页⾯都是可以访问的。在application 作⽤域中设置的属性如果不
⼿动调⽤removeAttribute函数进⾏删除的话,它们就⼀直可以使⽤,如果Web容器发⽣重启,此时application范围内的所有属性都将丢失。
注意:根据jsp规范,⽤于某个对象的名称必须在所有作⽤域中都是唯⼀的。也就是说,如果application作⽤域中有⼀个名为user的对象,⽽且在request作⽤域中⽤相同的名称保存着另⼀个对象,那么容器可能会移除第⼀个对象,尽管很少有容器会执⾏这项规则,但是为了使您的项⽬更加完善,还是应该确保在任何地⽅都是⽤唯⼀的名称,除⾮所保存的对象为同⼀个。
内置对象
JSP可以内嵌Java代码,但是每次使⽤对象实例化很⿇烦,所以JSP设置了⼀些内置的实例化对象,使⽤这些对象的时候⽆需定义,直接使⽤即可,如上⾯(好像)⽤过的out与request等。
JSP中⼀共预先定义了9个这样的对象,分别
为request、response、session、application、out、pageContext、config、page、exception
对象描述
request HttpServletRequest 接⼝的实例
response HttpServletResponse 接⼝的实例
out JspWriter类的实例,⽤于把结果输出⾄⽹页上
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论