JSP模板元素
模板元素是指JSP中属于HTML的内容
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP入门</title>
</head>
<body>
<h1>HELLO JSP!!!!</h1>
</body>
</html>
上述有色彩的属于HTML的内容,所以是模板元素
最上边两行属于JSP中独有的内容
模板元素在翻译后的Servlet程序中,会被直接用out.write原封不动的发送给浏览器,由浏览器解析
JSP表达式
表达式的格式:<%= 常量/变量/表达式 %>
表达式中不能写Java语句,也不能出现分号
作用:计算表达式的结果,将结果输出到浏览器上,由浏览器解析
例如:
JSP脚本片段
脚本片段的格式:<% 如果Java语句 %>
作用:在翻译后的servlet中,脚本片段中的Java代码,会被直接运行对应位置
例如:在JSP中代码如下:
<%
for(int i=0;i<5;i++){
out.write(“HELLO
”);
}
%>
在翻译后的Servlet中代码如下:
out.write("\t
\r\n");
out.write("\t");
for(int i=0;i<5;i++){
out.write(“HELLO
”);
}
另外,在某一个脚本片段中的Java代码可以是不完整的,但是在JSP中所有的脚本片段加载一起,最终组合起来必须要是完整的Java代码
例如:在JSP文件中写如下代码
<%for(int i=0;i<5;i++){%>
<%out.write(“HELLO
”);%>
<%}%>
在翻译后的Servlet程序中
out.write("\t
\r\n");
out.write("\t");
for(int i=0;i<5;i++){
out.write(’\r’);
out.write(’\n’);
out.write(’ ');
out.write(“HELLO
”);
out.write("\t\t\r\n");
out.write("\t");
}
JSP注释
注释格式:<%-- 注释的内容 -->
作用:为代码添加声明,可以将一些暂时用不到的代码注释掉,在JSP翻译时,JSP注释不会参与翻译,而是被直接丢弃
注意,注释时,不能交叉嵌套
JSP指令
指令的格式:<%@ 指令名称 若干的属性声明 %>
作用:用于指挥JSP解析引擎的工作,如何将一个JSP翻译成为一个Servlet程序
1.page指令—用于声明JSP文件的基本属性信息
<%@page import=“java.util.Date”%>
–import属性用于导包,如果不导包,也可以在使用类时,把包路径补全,如:
new java.util.Date();
JSP标签技术(了解)
jsp的优点是可以在HTML中写java代码,导致jsp特别得流行,所以就有的人只用JSP开发,但是这么一做,会导致大量的项目都太乱了,特别难维护
于是sun公司发布JSP2.0版本,提出了标签技术,并且推荐使用标签来替代JSP中的java代码,并且推荐,在JSP2.0版本后,就不要在JSP中出现任何一行java代码
EL表达式
格式:${ 常量/表达式/变量 }(放在EL表达式中的变量,需要先存入到域中,才可以获取到域中的值)
作用:
(1)计算放在EL表达式中的表达式的结果,将结果输出到当前位置
(2)主要作用:用于从域对象中获取数据,将获取到的数据输出到当前位置
<%@page import="com.tedu.pojo.User"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL表达式</title>
</head>
<body>
<h3>1.获取常量、表达式、变量的值</h3>
<%="Hello" %><br/>
${ "Hello EL" }<br/>
<%=123+456 %><br/><!-- 输出表达式,是先计算后输出 -->
${ 123+456 }<br/><!-- 如果发生异常,可以先剪切,然后保存,再粘进来 -->
123+456<br/><!-- 写什么输出什么 -->
<%
/* jsp的脚本片段:写java代码 */
/* 声明变量 */
String name="农夫山泉有点甜";
request.setAttribute("name1", name);
/* name是变量的名称 name1是变量存储到域中的名称 */
%>
<%= name %><br/><!-- jsp表达式可以直接输出变量,但是只能输出在当前jsp页面声明的变量 -->
${ name1 }<br/><!-- el表达式输出变量主要针对的是跳转发送过来的变量 -->
<!--
在EL表达式中书写变量时,底层会根据存储到域中的变量的名称到作用域中寻找
四大作用域从小到大排序:pageContext<request<session<application
如果找不到,就什么也不输出,如果找到了,就直接输出对应的值
-->
<h3>2.获取作用域中数组或者集合中的元素</h3>
<%
//声明一个数组,并为数组添加元素,将数组保存到域中
String[] names={"张三","李四","王五","赵六"};
request.setAttribute("FourCoolGuys", names);
%>
<!-- 使用EL表达式获取域中数组中的元素 -->
<!-- 可以直接使用域中的名称[下标] -->
${ FourCoolGuys[0] }<br/>
${ FourCoolGuys[1] }<br/>
${ FourCoolGuys[2] }<br/>
${ FourCoolGuys[3] }<br/>
<h3>3.获取作用域中的map集合中的值</h3>
<%
//声明一个map集合,并为map集合添加元素,将map集合存储到域中
Map<String,Object> map=new HashMap<String,Object>();
map.put("name","小李");
map.put("age",18);
map.put("desc","小李永远18");
request.setAttribute("LCY", map);
%>
<!-- 使用EL表达式获取域中的map集合中的值 -->
${ LCY.get("name") }<br/><!-- 域中的名字.get(key) -->
${ LCY.age }<br/><!-- 域中的名字.key -->
${ LCY["desc"] }
<h3>4.获取作用域中的实体对象的属性值</h3>
<%
//生成User对象,然后将实体对象存入到域中
User user=new User();
user.setName("老安");
user.setAge(18);
user.setDesc("老安不哭,站起来");
request.setAttribute("YYL",user);
%>
<!-- 使用EL表达式,获取域中实体对象中的属性值 -->
${ YYL.getName() }<br/>
${ YYL.getAge() }<br/>
${ YYL.getDesc() }<br/>
<!-- 下面的方式是对上面的方式的简写 -->
${ YYL.name }<br/>
${ YYL.age }<br/>
${ YYL.desc }<br/>
<br/><br/><br/><br/><br/><br/><br/><br/>
</body>
</html>
JSTL标签库
JSTL标签是为了JAVAWEB开发人员提供的一套标准通用的标签库,这个JSTL标签库和EL表达式配置使用可以替代JSP中绝大部分的java代码
在使用JSTL标签库之前,我们需要完成
(1)导入JSTL的开发包
将JSTL-1.2.jar放在WEB_INF/lib文件夹中,会总到Build
(2)在使用了JSTL标签库的JSP中引入JSTL
<c:set>标签
用于往域中添加属性,或者修改域中已有的属性
c:set标签常用属性总结:
(1)var属性—用于指定存入作用域中的属性的名称
(2)value属性—用于指定存入到作用域中的属性的值
(3)scope属性—用于指定属性存入到哪一个作用域中,可以取值:
a)page – pageContext域
b)request – request域
c)session – session域
d)application – application域
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 在当前JSP中引入JSTL标签库 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL标签库</title>
</head>
<body>
<h1>c:set标签</h1>
<h3>1.用于往request域中添加属性(name)</h3>
<%--
String name="小陈";
request.setAttribute("name", name);
--%>
<c:set var="name" value="小陈" scope="request"/>
${ name }
<h3>2.用于往request域中修改属性(name)的值为小陈真帅</h3>
<c:set var="name" value="小陈真帅" scope="request"/>
${ name }
</body>
</html>
为什么JSP的本质是一个Servlet?
1.当我们第一次访问JSP页面时,JSP文件会被底层默认翻译成为Servlet程序
在服务器发布路径的work文件夹下,可以找到两个文件,.class和.java文件,这两个文件就是在访问jsp文件时,自动生成的
打开.java文件,可以看到有如下代码
out.write("\r\n");
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta charset=\"UTF-8\">\r\n");
out.write("<title>JSP入门</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\t<h1>HELLO JSP!!!!</h1>\r\n");
out.write("</body>\r\n");
out.write("</html>");
所以访问JSP时,底层会自动将JSP中的文本用out.write向网页输出,所以才成为了一个HTML
2.当我们第二次访问JSP文件时,会直接加载Java文件,编译为class文件,然后运行。
(hello.jsp => hello_JSP.java => hello_JSP.class)