JSP
1、什么是JSP
Java Server Pages:Java服务端页面,也和 Servlet 一样,用于动态 web 技术。
最大的特点:
- 写 JSP 就像在写 HTML
- 区别:
- HTML 只给用户提供静态的数据
- JSP 页面中可以嵌入 Java 代码,为用户提供动态数据
2、JSP 原理
思路:JSP 到底怎么执行的?
-
代码层面没有任何问题
-
服务器内部工作
tomcat中有一个work目录;
IDEA中使用Tomcat的会在IDEA的tomcat中生成一个work目录;
例如:
C:\Users\guancheng\.IntelliJIdea2019.1\system\tomcat\Unnamed_javaweb-cookie-session\work\Catalina\localhost\javaweb\org\apache\jsp
发现页面转变成了Java程序!
index_jsp.class
index_jsp.java
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet。
JSP 最终也会转换成 Java 类!
JSP 本质上就是一个Servlet
在JSP页面中:
只要是JAVA代码就会原封不动的输出;
如果是HTML代码,就会被转换为:
out.write("<html>\r\n");
这样的格式,输出到前端!
3、JSP基础语法
任何语言都有自己的语法,Java中有,JSP 作为 Java技术的一种应用,它拥有一些自己扩充的语法,Java所有语法都支持!
jsp表达式
<%--JSP表达式
作用:用来将程序的输出,输出到客户端
公式:<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
jsp脚本片段
<%--jsp脚本片段--%>
<%
int sum = 0;
for (int i = 0; i <= 100; i++) {
sum += i;
}
out.print("<h1>sum=" + sum + "</h1>");
%>
脚本片段的再实现
<%--在代码中嵌入HTML元素--%>
<%
for (int i = 0; i < 5; i++) {
%>
<h1>hello world <%= i%></h1>
<%
}
%>
jsp声明
<%!
static {
System.out.println("Loading Servlet!");
}
private int globalVar = 0;
public void test() {
System.out.println("进入了test方法!");
}
%>
JSP声明:会被编译到JSP生成的Java类中。其他的就会被生成到_jspService方法中!
在JSP中,嵌入Java代码即可!
<%%> 片段
<%=%> 表达式输出一个值
<%!%> 定义全局的变量、方法等
<%--注释--%> 注释
JSP的注释不会在客户端显示,HTML会!
4、JSP指令
<%@page args...%>
<%@include file=""%>
<%--@include会将两个页面合二为一--%>
<%@include file="commom/header.jsp"%>
<h1>网页主体</h1>
<%@include file="commom/footer.jsp"%>
<hr>
<%--jsp标签
jsp:include 拼接页面,本质还是三个
--%>
<jsp:include page="commom/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="commom/footer.jsp"/>
5、九大内置对象
- PageContext 存东西
- Request 存东西
- Response
- Session 存东西
- Application (ServletContext) 存东西
- config (ServletConfig)
- out
- page
- exception
<%
pageContext.setAttribute("name1", "张三01"); //保存的数据只在一个页面中有效
request.setAttribute("name2", "张三02");// 保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3", "张三03");// 保存的数据只在一次会话中有效,开启浏览器到关闭浏览器
application.setAttribute("name4", "张三04");// 保存的数据只在服务器中有效,开启服务器到关闭服务器
%>
<%--脚本片段中的代码会被原封不动的生成到JSP.java中
所以必须保证代码的语法正确--%>
<%
// 使用pageContext取出,通过寻找的方式来
// 从底层到高层(作用域)
String name1 = (String)pageContext.findAttribute("name1");
String name2 = (String)pageContext.findAttribute("name2");
String name3 = (String)pageContext.findAttribute("name3");
String name4 = (String)pageContext.findAttribute("name4");
String name5 = (String)pageContext.findAttribute("name5");// 不存在的数据
%>
<%--使用EL表达式输出 ${}--%>
<h1>取到的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<%--因为name5不存在,所以使用EL表达式不会输出--%>
<h3>${name5}</h3>
<%--因为name5不存在,所以会输出 null--%>
<h3><%=name5%></h3>
request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻
session:客户端向服务器发送请求,产生的数据,用户用完一会儿可能还有用,比如:购物车
application:客户端向服务器发送请求,产生的数据,一个用户用完另一个用户还可能用,比如:聊天数据
6、JSP标签、JSTL标签,EL表达式
导入依赖:
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表达式:${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
- 调用Java方法
JSP标签:
<%--jsp:include--%>
<jsp:forward page="/jsptag01.jsp">
<jsp:param name="name" value="张三"/>
<jsp:param name="age" value="20"/>
</jsp:forward>
<%--取出参数--%>
名字:<%=request.getParameter("name")%>
年龄:<%=request.getParameter("age")%>
JSTL表达式:
JSTL 标签库的使用就是为了弥补HTML标签的不足,它自定义了许多标签供我们使用,标签的功能和Java代码一样。
JSTL标签库使用步骤:
- 引入对应的 taglib
<%--引入JSTL标签库,我们才能使用 JSTL 标签 core--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- 使用其中的方法
<body>
<h4>if测试</h4>
<hr>
<form action="coreif.jsp" method="get">
<%--EL表达式获取表单数据:
${param.参数名}
--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="提交">
</form>
<%--判断如果提交的是管理员(admin),就登录成功--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<c:out value="登录成功,管理员欢迎您!"/>
</c:if>
<c:out value="${isAdmin}"/>
</body>
<body>
<h1>choose-when测试</h1>
<c:set var="score" value="50"/>
<c:choose>
<c:when test="${score >= 90}">
优秀👍
</c:when>
<c:when test="${score >= 80}">
良好😊
</c:when>
<c:when test="${score >= 70}">
中等🤭
</c:when>
<c:when test="${score >= 60}">
及格😟
</c:when>
<c:when test="${score < 60}">
不及格😭
</c:when>
</c:choose>
</body>
<body>
<h1>forEach测试</h1>
<%
ArrayList<String> poetry = new ArrayList<>();
poetry.add("一为迁客去长沙,西望长安不见家。");
poetry.add("二月江南花满枝,他乡寒食远堪悲。");
poetry.add("三万里河东入海,五千仞岳上摩天。");
poetry.add("四月清和雨乍晴,南山当户转分明。");
poetry.add("五月榴花照眼明,枝间时见子初成。 ");
poetry.add("六出飞花入户时,坐看青竹变琼枝。");
poetry.add("七夕今宵看碧霄,牵牛织女渡河桥。");
poetry.add("八月长江万里晴,千帆一道带风轻。");
poetry.add("九曲黄河万里沙,浪淘风簸自天涯。");
poetry.add("十里长街市井连,月明桥上看神仙。");
poetry.add("二十年来万事同,今朝岐路忽西东。");
poetry.add("三十骅骝一烘尘,来时不锁杏园春。");
poetry.add("四十年来画竹枝,日间挥写夜间思。");
poetry.add("五十年间万事非,放翁依旧掩柴扉。");
poetry.add("六十衰颓愧鬓蓬,黄花更负一年中。");
poetry.add("七十衰翁卧故山,镜中无复旧朱颜。");
poetry.add("八十昂藏一老翁,得钱长是醉春风。");
poetry.add("九十春光斗日光,山城斜路杏花香。");
poetry.add("百啭千声随意移,山花红紫树高低。");
poetry.add("千里莺啼绿映红,水村山郭酒旗风。");
poetry.add("万里清江万里天,一村桑柘一村烟。");
poetry.add("十万貔貅出羽林,横空杀气结层阴。");
poetry.add("百万苍生罹热恼,三年素女苦高寒。");
poetry.add("千万乘骢沈司户,不须惆怅郢中游。");
request.setAttribute("list", poetry);
%>
<%--
var:每一次遍历出来的对象
items:需要遍历的对象
--%>
<c:forEach var="poetry" items="${list}">
<c:out value="${poetry}"/> <br>
</c:forEach>
<%--
var:每次遍历出来的对象
begin:从哪开始
end:到哪结束
step:步长
items:遍历的对象
--%>
<c:forEach var="poetry" begin="0" end="10" step="1" items="${list}">
<c:out value="${poetry}"/> <br>
</c:forEach>
</body>
7、JavaBean
实体类
JavaBean的特定写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
一般用来和数据库的字段做映射!
ORM:对象关系映射
- 表 ==> 类
- 字段 ==> 属性
- 行记录 ==> 对象