JSP介绍
JSP和Servlet都是由SUN公司提供的一门动静web资源开发技术。
JSP看起来像一个HTML,和HTML不同的是,JSP中能够书写Java代码,能够通过Java代码显示动态数据。
JSP实质上就是一个Servlet。
JSP的由来
1.Servlet实质是一段Java程序,适宜解决业务逻辑,不适宜向外输入一个(残缺的复合标准的)html网页。
2.HTML就是一个页面的开发技术,适宜作为网页进行输入,然而html是一个动态Web资源开发技术,无奈展现动态数据(HTML+AJAX)。
3.JSP也是一个页面的开发技术,能够输入html网页,并且JSP能够通过Java代码展现动态数据。
JSP的呈现,既解决了Servlet不适宜输入网页的问题,也解决了HTML无奈展现动态数据的问题
为什么说JSP实质是一个Servlet?
在JSP第一次被拜访时,会翻译成一个Servlet程序。拜访JSP后看到的html网页,其实是翻译后的Servlet执行的后果。(也就是说,拜访JSP后看到的网页,是JSP翻译后的Servlet输入到浏览器的。)
JSP的执行流程
- 当浏览器申请服务器中的某一个JSP文件(例如:localhost:8080/day11-jsp/test.jsp),服务器会依据申请资源的门路去寻找该文件:
- 如果找到了,JSP翻译引擎会将JSP翻译成一个Servlet程序(JSP—-> xxx.java—-> xxx.class),而后Servlet程序再执行,执行的后果是向浏览器输入一个HTML网页!
- 如果没有找到,服务器将会响应一个404页面,告诉浏览器申请的资源不存在。
JSP表达式
格局:<%= 常量、变量、表达式 %>
作用:计算表达式的后果,将后果输入到浏览器中,由浏览器负责解析并显示。
<%= "Hello JSP..." %>
<% String name = "林青霞"; %>
<%= name %>
<%= 100+123 %>
<%= Math.random() %>
留神:JSP表达式中能够书写合乎Java语法的代码,然而不能写Java语句(外部不能写分号;)
JSP脚本片段
格局:<% 若干Java语句 %>
<!-- 在页面上输入5行"hello JSP" -->
<%
for(int i=0; i<5; i++){
out.write("Hello JSP...<br/>");
}
%>
JSP正文
格局:<%– JSP正文内容 –%>
面试题:考查JSP中的JSP正文、Java正文、html正文
<%--
<% out.write( "aaaaa<br/>" ); %>
--%>
<% //out.write( "bbbbb<br/>" ); %>
<!--
<% out.write( "ccccc<br/>" ); %>
-->
问题:(1)下面输入的三行内容,在拜访时,会显示哪一行内容?
第一行被JSP正文给正文了,JSP正文的内容不会参加翻译,也不会执行,更不会发送给浏览器,也不会在浏览器上显示。
第二行被Java正文给正文了,放在脚本片段中的内容会参加翻译,会将其中的Java代码复制到翻译后的Servlet中,但因为代码被正文了,所以不会执行,也不会发送给浏览器,更不会在浏览器上显示。
第三行被html正文给正文了,html正文在JSP中是模板元素,正文自身会发送给浏览器,正文中的脚本片段会参加翻译,其中的java代码也会执行,也会将内容(ccccc)发送给浏览器,但因为发送到浏览器后的ccccc被html正文包裹,因而也不会显示在浏览器上。
(2)下面输入的三行内容,哪一行会发送到浏览器中?(不论是否显示)
其中第三行内容会发送到浏览器中,但不会显示,因为前后有html正文。
JSP指令
指令的格局:<%@ 指令名称 若干属性申明… %>
<%@ page language="java"%>
language属性用于指定以后JSP应用的开发语言,目前只有java语言反对,能够省略不写!
<%@ page import="java.util.Date"%>
mport属性用于导入包,如果不导入包,在应用其余包下的类时,就须要在类名后面加上包门路,例如:
java.util.Date date = new java.util.Date();
<%@ page pageEncoding="UTF-8"%>
pageEncoding属性是用于指定以后JSP应用的编码,Eclipse工具会依据这个编码保留JSP文件。
JSP标签技术
EL表达式
格局:${ 常量/表达式/变量 }
作用:
(1)计算放在其中的表达式的后果,将后果输入在以后地位。
(2)次要作用:用于从域对象中获取数据,将获取到的数据输入在以后地位。
获取常量、表达式、变量的值(变量得先存入域中)
域对象:pageContext、request、session、application
例入
String name="马云";
request.setAttribute("name123" , name);
在EL表达式中书写变量,底层会依据变量名到四个作用域中寻找该名称的属性值
如果找到对应的属性值, 就间接返回, 输入到以后地位; 如果找不到就接着寻找
直到找完四个作用域, 最初还找不到就什么都不输入!
到四个作用域中寻找的程序为: pageContext->request->session->application
获取作用域中数组或汇合中的元素
//申明一个数组, 为数组增加元素, 并将数组存入到域中
String[] names = {"刘德华", "郭富城", "张学友", "拂晓" };
request.setAttribute( "names", names );
//将申请转发到jsp, 在JSP中获取域中的数组中的元素
request.getRequestDispatcher( "/02-el.jsp" ).forward(request, response);
JSP中的代码:
<%-- 获取从Servlet转发带过去的域中的数组中的元素 --%>
${ names[0] } <%-- 刘德华 --%>
${ names[1] } <%-- 郭富城 --%>
${ names[2] } <%-- 张学友 --%>
${ names[3] } <%-- 拂晓 --%>
JSTL标签库
其中罕用的标签如下:
<c:set></c:set> -- 用于往域中增加属性,或者批改域中已有的属性值
(1)var -- 指定存入作用域中的属性名称
(2)value -- 指定存入作用域中属性的值
(3)scope -- 指定将属性存入哪一个作用域中,默认值是page,示意pageContext域
可取值: a)page示意pageContext域 b)request示意request域
c)session示意session域 d)application示意ServletContext域
<c:if></c:if> -- 结构简略的 if…else…构造语句
test属性 -- 指定一个布尔表达式,当表达式的后果为true时,将会执行(输入)c:if标签中的内容,如果表达式后果为false,将不会输入c:if标签中的内容
<c:forEach></c:forEach> -- 对汇合或数组等中元素进行循环遍历或者是执行指定次数的循环.
(1)items: 指定须要遍历的汇合或数组
(2)var: 指定用于接管遍历过程中的每一个元素
(3)begin: 指定循环从哪儿开始
(4)end: 指定循环到哪儿完结
(5)step: 指定循环时的步长, 默认值是1
(6)varStatus: 用于示意循环遍历状态信息的对象, 这个对象上有如下属性:
first属性: 示意以后遍历是否是第一次, 若是, 则返回true;
last属性: 示意以后遍历是否是最初一次, 若是, 则返回true;
count属性: 记录以后遍历是第几次
发表回复