jsp详解 javaweb 4 ( JSP&JSTL&EL)
JSP&JSTL&EL
1 JSP
servlet : 小服务应用程序 server applet
1、JSP(Java Server Pages):
概念:JSP(全称JavaServer Pages)是由[Sun Microsystems](https://baike.baidu.com/item/Sun Microsystems)公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
xxx.jsp---->xxxServlet.java---->xxxServlet.class。
在HTML中嵌入Java脚本语言 jsp页面可以写java
由应用服务器中的JSP引擎来编译和执行嵌入的Java脚本语言命令
将生成的整个页面信息返回给客户端
可以在html页面中写java代码。
2、为什么要用jsp
jsp其实就是一个特殊的servlet,
问题:有servlet了为什么还要用jsp呢?
因为:普通的servlet虽然可以显示数据,但是我们要的可不仅仅是显示数据,我们还需要css,js…,使用servlet也可以完成css,js,的功能,但是编码太过麻烦。
普通的servlet不能简化操作,有一些大牛–》整出一套标准,既可以显示数据,又可以设置css和js,让操作更方便 ----》jsp。
3、JSP创建过程
服务器根据接收到的客户请求来加载被请求的JSP文件
Web服务器中的JSP引擎将被加载的JSP文件转化为Servlet.java代码
JSP引擎将生成的Servlet.java代码编译成.class文件
服务器执行这个.class文件
服务器将执行结果发送到浏览器进行显示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HFnBowBO-1641867777460)(assets/image-20201208172028178.png)]
部署项目,启动Tomcat,观察JSP翻译的Servlet代码:
当webapp放置在tomcat容器中的时候,jsp生成的java文件与编译好的class文件会被放置在tomcat的work目录下,方便查看生成的java文件。
idea的web项目不是直接将webapp放在tomcat容器中。而是将生成的webapp与tomcat按照idea的“技术”形成连接,这样减少了很大的配置tomcat的时间,一次配置,一劳永逸。
C:\Users\baijinbao\AppData\Local\JetBrains\IntelliJIdea2020.2\tomcat\Unnamed_javaservlet02_2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g4dxw75J-1641867777462)(assets/image-20201107172230829.png)]
3.组成部分
指令:
作用:用于配置jsp页面,导入资源文件
格式:<%@ 指令名称 属性名=属性值%>
page 配置jsp页面
<!--导入jar包-->
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<!--设置页面的字符集编码 和mime 类型-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
taglib 导入标签库
include 页面包含的,导入资源的文件
注释
html注释 : 只能注释html代码
jsp注释:<%-- --%> 所有都可以注释
内置对象:
jsp九大内置对象:
面试题:说出5个左右jsp内置对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-khhcSbbq-1641867777462)(assets/image-20201106225419823.png)]
application ServletContext 应用场景:可以用来统计 实时的在线人数。
四大域对象:域:作用域!!!
pageContext(当前页面), request(一次请求) , session(一次会话) , application(服务器启动期间都可以用)
案例:在jsp页面显示所有people数据
注意:在jsp中写java代码必须写在 <% 这里 %>
<% 这里 %> 这中方式表示可以运行java代码
<%= 变量名 %> 这种方式表示可以将java变量显示在jsp页面中
步骤:
1.在servlet中先将数据存到request中,在请求转发—》相应的jsp页面
2.在jsp页面中再读取request中的数据。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dfoBNweX-1641867777463)(assets/image-20210105163137934.png)]
<%@ page import="java.util.Map" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户信息展示</title>
<style>
table{
background-color: red;
border: 2px solid blue;
}
td{
border: 1px solid green;
}
</style>
</head>
<body>
<table>
<thead>
<tr>
<th>编号</th>
<th>用户名</th>
<th>密码</th>
</tr>
</thead>
<tbody>
<%
List<Map<String, Object>> maps = (List<Map<String, Object>>)request.getAttribute("maps");
for (Map<String, Object> map : maps) {
%>
<tr>
<td><%=map.get("id")%></td>
<td><%=map.get("username")%></td>
<td><%=map.get("password")%></td>
</tr>
<%
}
%>
${requestScope.maps}
${sessionScope.msg}
</tbody>
</table>
</body>
</html>
1.什么是jsp?
java server pages
2.jsp的本质是什么?
jsp是一个servlet。
3.jsp的执行流程?
index.jsp---->index_jsp.java---->index_jsp.class
4.jsp的组成部分:
jsp指令 page taglib include
jsp可以写 <% java语言 %> <%=java变量%>
5.jsp的9大内置对象?
内置对象?不用创建可以直接使用的!
常用的要掌握,不常用的了解!
pageContext request response session application out exception page config
6.四大域对象 (属于9大内置对象:数据能够起作用的区域范围来划分的)
pageContext request(一次请求) session (一次会话) application(整个服务器启动期间)
2 EL和JSTL
1、EL表达式 ${}
-
概念:Expression Language:表达式语言 ;
-
作用:替换:<%=变量名%> ;原有的表达式缺点:html标签+java语法 混合
EL表达式可以直接从四大域对象中取出数据。
-
基本语法:${表达式}
-
注意:jsp默认支持el表达式, 如果要忽略el表达式 可以使用 \转义
-
**使用 **
- 运算
- 获取值:从四大域对象中取出数据
EL本质:获取的是对象中get属性的值(getName)
2、支持的运算符:课下运算符自己测试!
算术运算符:+ - * %
关系运算符:== != > <
逻辑运算符: and or not
语法:
${a+b}
${a>b}
${a>b and a>c}
3、值的获取
-
值的获取只能从域对象中获取(四大域 pageContext ,request,session,application)
-
语法1:${域名称.键名}
- 域名称
- pageScope -->pageContext域对象
- requestScope -->request域对象
- sessionScope -->session域对象
- applicationScope -->application域对象
示例:从域中取值
1.从List中取值:
List student = ArrayList();
${requestScope.student.get(i)}2.从Map中取值
Map<Object, Object> map = new HashMap<>(); map.put("id",1); map.put("name","张大骚"); map.put("age",18); map.put("address","泰国"); request.setAttribute("map",map);//将map添加到request域对象中 <%--${域名称.键名}--%> ${requestScope.name} <h1>取Map中的值</h1> ${requestScope.map}<%--取整个map--%> ${requestScope.map.name}<%--取map中的值 根据key--%> - 域名称
3.从对象中取值
User user = new User(5, "张小三", "123456");
request.setAttribute("user",user);//将user对象添加到request域对象中
${requestScope.user} <%--取整个user对象--%>
<%--此时取username 不是直接取对象中的username变量
而是 取get和set方法中的 属性getUsername,去掉set/get 将 大写的字母变成小写---> username --%>
${requestScope.user.username} <%--取对象中的某一个属性--%>
-
语法2:${键名}
-
此时没有确定域对象,会按照域对象的范围从小到大去挨个找,直到找到为止。
session.setAttribute("name","李四"); request.setAttribute("name","王五"); 此时通过 ${name} 取到的值是 request域对象中的 从小---》大 因为:四大域的范围是:pageContext < request < session < application
-
整体代码:
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="com.aaa.qy127.entity.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>el表达式使用</title>
</head>
<body>
<%
//模拟向request域和session域中设置数据
request.setAttribute("username","李四");
session.setAttribute("msg","你好哈哈哈");
//模拟向request域设置List
List<Object> list = new ArrayList<>();
list.add("1");
list.add("abc");
list.add("你好");
list.add("456");
request.setAttribute("list",list);
//模拟向request域设置Map
Map<Object, Object> map = new HashMap<>();
map.put("name","张三");
map.put("age",23);
map.put("sex","男");
request.setAttribute("map",map);
//模拟向request域设置Student对象
Student st = new Student(1, "李四", 29, 3);
request.setAttribute("st",st);
%>
${4 > 5}
${4 + 5}
${4 == 5}
${4 != 5}
${4>5 and 5<4}
<h1>===================直接根据键名取值======================</h1>
${requestScope.username}
${sessionScope.msg}
<h1>===================从List取值======================</h1>
<%--域名.键名.get(下标)--%>
${requestScope.list.get(1)}
<h1>===================从Map取值======================</h1>
<%--
方法一:域名.键名.key
方法二:域名.键名.get("key")
--%>
${requestScope.map.get("name")}
<h1>===================从Student对象取值======================</h1>
<%--域名.键名.属性名
原理:就是取getName() 将get去掉,并且将 Name变成 name
--%>
${requestScope.st.age}
</body>
</html>
3、EL隐式对象(11个)
作用域对象中,在指定的范围内起作用,本质上都是Map类型的集合,存储key-value, 通过key获取value值:
-
PageScope:当前页面
-
RequestScope:在当前的request中起作用,一次请求,A.jsp—>AServlet—>转发—>BServlet(一次请求)
-
SessionScope:在当前会话中起作用
-
ApplicationScope:类型:ServletContext;整个web应用;全局变量
备注:需要提前将数据以key-value的形式,存入其中的一个域对象中,然后就可以使用EL表达式在页面上获取。
查找key的过程:【page】—>【request】—>【session】—>【application】;找到为止
隐式对象:已经提前封装了数据,使用的时候可以直接获取。
| 隐含对象 | 类型 | 说明 |
|---|---|---|
| pageContext | javax.servlet.ServletContext | 表示此JSP的PageContext |
| pageScope | java.util.Map | 取得Page范围的属性名称所对应的值 |
| requestScope | java.util.Map | 取得Request范围的属性名称所对应的值 |
| sessionScope | java.util.Map | 取得Session范围的属性名称所对应的值 |
| applicationScope | java.util.Map | 取得Application范围的属性名称所对应的值 |
| param | java.util.Map | 如同ServletRequest.getParameter(String name)。回传String类型的值 |
| paramValues | java.util.Map | 如同ServletRequest.getParameterValues(String name)。回传String[]类型的值 |
| header | java.util.Map | 如同ServletRequest.getHeader(String name)。回传String类型的值 |
| headerValues | java.util.Map | 如同ServletRequest.getHeaders(String name)。回传String[]类型的值 |
| cookie | java.util.Map | 如同HttpServletRequest.getCookies() |
| initParam | java.util.Map | 如同ServletContext.getInitParameter(String name)。回传String类型的值 |
MVC: Model 模型 view 视图 Controller控制器
4、pageContext:
| Expression | 说明 |
|---|---|
| ${pageContext.request.queryString} | 取得请求的参数字符串 |
| ${pageContext.request.requestURL} | 取得请求的URL,但不包括请求之参数字符串,即servlet的HTTP地址。 |
| ${pageContext.request.contextPath} | 服务的webapplication的名称 |
| ${pageContext.request.method} | 取得HTTP的方法(GET、POST) |
| ${pageContext.request.protocol} | 取得使用的协议(HTTP/1.1、HTTP/1.0) |
| ${pageContext.request.remoteUser} | 取得用户名称 |
| ${pageContext.request.remoteAddr} | 取得用户的IP地址 |
| ${pageContext.session.new} | 判断session是否为新的,所谓新的session,表示刚由server产生而client尚未使用 |
| ${pageContext.session.id} | 取得session的ID |
| ${pageContext.servletContext.serverInfo} | 取得主机端的服务信息 |
5、标准标签库-JSTL
JSTL:Java Server Tag Library ;作用:为了替代:<% %>
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
- 核心标签
- 格式化标签
- SQL 标签
- XML 标签
- JSTL 函数
使用步骤
1、先引入jar包:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SbqjhuBX-1641867777465)(assets/image-20201107165246115.png)]
2、在页面上引入指令:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
if 相当于java代码中的if判断
1.test是必须属性,里边可以写表达式 值得类型为 boolean
if(a>10){
}
2.注意:这里没有else,如果想要else就再写一个< c:if>
<% request.setAttribute("a",10); %> <%--先执行test中的表达式,看是否成立,如果为true就执行 标签中的代码 否则就不执行。--%> <c:if test="${requestScope.a > 50}"> <h1>你好哈哈哈</h1> </c:if> <c:if test="${requestScope.a <= 50}"> <h1>你好嘿嘿嘿</h1> </c:if> -
foreach标签语句
- 1.重复执行某段代码 for循环
- 属性:
- begin :开始值===>int i = 0;
- end:结束值 ===》 i<=6
- var: 临时变量===> i
- step:步进==> i++
- 属性:
<%-- for(int i=0;i<6;i+=2){ 代码块; } --%> <c:forEach begin="1" end="20" step="2" var="i"> ${i} <br> </c:forEach>- 2.遍历容器
- 属性
- items 容器对象
- var: 临时变量
- varStatus: 循环状态对象
- index 索引
- count 循环的次数
- 属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AtxrgUNa-1641867777465)(assets/image-20201209090422937.png)]
- 1.重复执行某段代码 for循环
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>student</title>
<style>
table{background-color: yellow; }
tr{ height: 30px;text-align: center;}
</style>
</head>
<body>
<a href="${pageContext.request.contextPath}"></a>
<h1>这是studnetjsp</h1>
<%
//此处通过request获取到的是一个Object对象,所以需要强转
List<List> student = (List<List>) request.getAttribute("student");
session.setAttribute("name","李四");
request.setAttribute("name","王五");
%>
<table border="1" width="500" >
<tr>
<th>id</th>
<th>name</th>
<th>age</th>
<th>classid</th>
</tr>
<%--<% for (List list : student) { %>
<%–
常规写法
<tr>
<td><%= list.get(0) %></td>
<td><%= list.get(1) %></td>
<td><%= list.get(2) %></td>
<td><%= list.get(3) %></td>
</tr>–%>
<% } %>--%>
<c:forEach items="${requestScope.student}" var="obj" varStatus="s">
<tr>
<td>${obj.get(0)}</td>
<td>${obj.get(1)}</td>
<td>${obj.get(2)}</td>
<td>${obj.get(3)}</td>
</tr>
${s.index} ${s.count}<br>
</c:forEach>
</table>
</body>
</html>
更多推荐



所有评论(0)