JavaWeb的技术体系
一.Java Server Pages
JSP 与 PHP、ASP、ASP.NET 等语言类似,运行在服务端的语言。
JSP(全称Java Server Pages)是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。
-
1)Java Server Pages,顾名思义就是运行在java服务器中的页面,也就是在我们JavaWeb中的动态页面,其本质就是一个Servlet。
-
2)其本身是一个动态网页技术标准,它的主要构成有HTML网页代码、Java代码片段、JSP标签几部分组成,后缀是.jsp
1.为什么要使用JSP
1)早期只有servlet与HTML,HTML不会处理请求,只能使用response输出标签数据,非常麻烦。
2)后来有了jsp,相比于Servlet与HTML,JSP既能处理请求又能处理显示页面,简化了Servlet的开发(意义)
3)但如果过度使用jsp,在jsp中即写大量的java代码,又写html,造成难于维护以及分工协作,而Servlet更擅长处理业务逻辑,两种技术各有专长,所以一般我们会将Servlet和JSP结合使用,Servlet负责业务,JSP负责显示。
4)一般情况下, 都是Servlet处理完的数据,转发到JSP,JSP负责显示数据的工作
5)再后来,javaweb开发借鉴mvc开发模式,程序的设计也变得更加合理
2.JSP的处理流程
服务器第一次使用jsp页面时:
之后会一直使用该servlet对象,除非页面发生改变。
JSP对应的java与class文件,在服务器文件夹:
- org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\WebTest\
3.JSP语法
1)JSP的脚本元素:
- 脚本片段是嵌入到JSP中Java代码段
- 格式以<%开头,%>结尾,两个%号之间就可以编写Java代码了
<!-- 1.JSP脚本片段
作用:用来在里面写Java代码-->
<%
//在JSP中循环打印h1标签内容
for(int i = 0 ; i < 10 ; i ++ ){
//out.print("今天天气好晴朗,处处好风光!");
%>
<h1>今天天气好晴朗,处处好风光!</h1>
<%
}
%
2)JSP的表达式:用来输出对象
- JSP表达式用来直接将Java变量输出到页面中
- 格式以<%=开头,以%>结尾,中间是我们要输出的内容
<!-- 2.JSP表达式
作用:用来输出对象-->
<%="我是通过JSP表达式输出的" %>
3)JSP中的注释
- 1)<%-- JSP的注释 --%> —— 当被JSP引擎翻译成java文件时,会忽略JSP注释
- 2)//JAVA的注释:JVM编译java文件时会忽略注释
- 3)<!-- HTML的注释 -->:浏览器加载时,会忽略
4.JSP的九大隐含对象
变量名 | 真实类型 | 作用 |
---|---|---|
pageContext | PageContext | 当前页面共享数据,还可以获取其他八个内置对象 |
request | HttpServletRequest | 一次请求访问的多个资源(转发) |
session | HttpSession | 一次会话的多个请求间 |
application | ServletContext | 所有用户间共享数据 |
response | HttpServletResponse | 响应对象 |
page | Object | 当前页面(Servlet)的对象 this |
out | JspWriter | 输出对象,数据输出到页面上 |
config | ServletConfig | Servlet的配置对象 |
exception | Throwable | 异常对象 |
5.JSP的域对象
1)四个域对象:
范围从小到大依次为:
a) pageContext域
- 范围:当前页面;——离开这个页面,相关值不能使用
- 对应的域对象:pageContext
- 域对象的类型:PageContext
b) request域
范围:当前请求(一次请求)
对应的域对象:request
域对象的类型:HttpServletRequest
c) session域
- 范围:当前会话(一次会话);从打开页面开始,到浏览器关闭——这是一次会话
- 对应的域对象:session
- 域对象的类型:HttpSession
d) application域
- 范围:当前Web应用;只要服务器不关,一直可以使用
- 对应的域对象:application
- 域对象的类型:ServletContext
2)四个域对象都有以下三个方法:
- void setAttribute(String key , Object value); //设置雨中key-value元素
- Object getAttribute(String key); //获取key对应的value值
- void removeAttribute(String key);//移除元素
3)四个域对象的使用规则:
能用小的就不用大的
- 查找域对象中的key值,是从最小域开始
案例:
<!-- 在当前页面中分别向四个域中添加四个属性 -->
<%
pageContext.setAttribute("pageKey", "pageValue");
request.setAttribute("reqKey","reqValue");
session.setAttribute("sessKey", "sessValue");
application.setAttribute("appKey", "appValue");
%>
<h1>在当前页面中获取四个域中的属性值</h1>
page域中的属性值是:<%=pageContext.getAttribute("pageKey") %><br>
request域中的属性值是:<%=request.getAttribute("reqKey") %><br>
session域中的属性值是:<%=session.getAttribute("sessKey") %><br>
application域中的属性值是:<%=application.getAttribute("appKey") %><br>
4)将当前页面的相对路径为绝对路径
a) 使用JSP表达式
- request域对应API:
request.getScheme(): Returns the name of the scheme used to make this request, for example, http, https, or ftp
request.getServerName():Returns the host name of the server to which the request was sent.
request.getServerPort():端口号
request.getContextPath():
- 对应的JSP表达式:<%=request.getScheme() %>
<!-- base标签的href属性可以让当前页面中所有的相对路径都变为绝对路径 -->
<base href="<%=request.getScheme() %>://<%=request.getServerName() %>:<%=request.getServerPort() %><%=request.getContextPath() %>/" >
b) 对应的EL表达式:${pageContext.request.scheme}
<!--${pageContext.request.scheme}-->
<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/">
二.Expression Language 表达式语言
Expression Language 作用:替换和简化jsp页面中java代码的编写,主要用来输出域对象中的属性值。
1.EL的特点:
EL是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作。其具有以下特点:
-
EL在得到某个数据时,会自动进行数据类型的转换。
-
EL表达式用于代替JSP表达式(<%= %>)在页面中做输出操作。
-
EL表达式仅仅用来读取数据,而不能对数据进行修改。
-
使用EL表达式输出数据时,如果有则输出数据,如果为null则什么也不输出。
2.EL表达式的格式
EL表达式的语法:
- ${表达式}
<%
Date date = new Date();
//将对象放入不同域对象中
pageContext.setAttribute("time", date);
request.setAttribute("time", date);
%>
通过JSP表达式输出当前时间:<%=date %><br>
<!-- 输出的pageContext域中的time -->
通过EL表达式输出当前时间:${ time }<br>
3.EL的作用
主要用来输出域对象中的属性值
- ${ 域名称.键名 }:获取key对应的对象
- ${ 域名称.键名.属性名 }:获取JavaBean的属性值
- ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
- 获取对象、List集合、Map集合的值
- 1)对象:${域名称.键名.属性名}——本质上会去调用对象的getter方法
- 2)List集合:${域名称.键名[索引]}
- 3)Map集合:${域名称.键名.key名称} 或 ${域名称.键名[“key名称”]}
注意:获取JavaBean的属性值是通过调用对象的getXxx ()方法实现的,与对象中的成员属性无关
4.EL表达式获取域对象中的属性值的规则
默认是全域查找:
- 先从page域中开始查找,找到后直接返回;
- 找不到去request域中查找;以此类推到,session、application域中找;
- 如果最终没有找到,则什么也不输出。
5.EL中的四个Scope对象
EL给我们提供了四个Scope对象,用来精确获取指定域中的属性值(而不是从小到大去查找):
- pageScope:获取page域中的属性值
- requestScope:获取request域中的属性值
- sessionScope:获取session域中的属性值
- applicationScope:获取application域中的属性值
${ requestScope.request }
${ pageContext.request.contextPath }:动态获取虚拟目录
6.通过EL表达式,获取request\pageContext…
pageContext对象既是JSP的隐含对象,也是EL的隐含对象,所以可以通过pageContext对象获取request等其他隐含对象。
<%
Date date = new Date();
//往不同域中添加key值相同的元素
pageContext.setAttribute("time", date+"-");
request.setAttribute("time", date+"--");
session.setAttribute("time", date+"---");
application.setAttribute("time", date+"----");
//创建Employee对象
Employee employee = new Employee(1,"哪吒",new Department(1001,"魔丸部"));
pageContext.setAttribute("emp", employee);
%>
<--! 测试EL表达式输出的是哪个域中key对应的值 -->
通过JSP表达式输出当前时间:<%=date %><br>
通过EL表达式输出当前时间:${time }<br>
通过EL表达式获取request域中的时间:${requestScope.time }<br>
通过EL表达式获取Employee对象的name属性值:${emp.name }<br>
通过EL表达式获取Employee对象的dept属性的name属性值:${emp.dept.name }<br>
通过EL表达式获取Employee对象的getHome方法的返回值:${emp.home }<br>
通过JSP表达式获取项目的虚拟路径:<%=request.getContextPath() %><br>
通过EL表达式获取项目的虚拟路径:${pageContext.request.contextPath }
三.JSTL标签
JavaServer Pages Tag Library JSP标准标签库,是由Apache组织提供的开源的免费的jsp标签。
1.作用:用于简化和替换jsp页面上的java代码
2.使用步骤:
1)使用它需要导入以下jar包
- jstl.jar
- standard.jar
2)在JSP头部导入核心标签库:一般使用c标签
- taglib指令: <%@ taglib %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
3)使用标签
3.常用的JSTL标签
1)if:相当于java代码的if语句
- 属性:test 必须属性,接受boolean表达式
- 如果表达式为true,则显示if标签体内容,
- 如果为false,则不显示标签体内容
- 一般情况下,test属性值会结合el表达式一起使用
- 注意:c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签
<%
int age = 19;
pageContext.setAttribute("age", age);
%>
<c:if test="${age < 18 }">
少儿不宜!
</c:if>
<c:if test="${age > 18 }">
请尽情浏览!注意身体!!!
</c:if>
2)choose:相当于java代码的switch语句
- 使用choose标签声明 相当于switch声明
- 使用when标签做判断 相当于case
- 使用otherwise标签做其他情况的声明 相当于default
3)foreach:相当于java代码的for语句
- items属性:用来接收一个要遍历的集合
- var属性:设置一个变量来接收遍历到的数据,并且会以变量的值为key将数据放到page域中
<%
List<String> list = new ArrayList();
list.add("陈赫");
list.add("林丹");
list.add("黄海波");
//将list放到page域中
pageContext.setAttribute("stars", list);
%>
<!--循环遍历域中的stars键对应的list-->
<c:forEach items="${stars }" var="star">
<a href="#">${pageScope.star }</a><br>
</c:forEach>
4)empty运算符
- 用来判断一个字符串或一个集合是否为空
<!-- empty运算符:用来判断一个字符串或者一个集合是否为空(接上一段代码) -->
<c:if test="${empty stars }">
没有明星!
</c:if>
<c:if test="${not empty stars }">
什么都是别人的好!
</c:if>
<c:if test="${!empty stars }">
佛海无边,回头是岸!!!
</c:if>