JSP
JSP
什么是JSP?
Java Server pages:java服务器端页面,和Servlet一样,用于动态web技术
最大的特点:
- 写jsp就像在写HTML
- 区别:
- HTML只能提供静态数据,
- JSP页面可以嵌入java代码,为用户提供动态数据
JSP原理
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问servlet
项目中jsp文件在本机下载tomcat目录(或idea的tomcat目录中) work目录下文件中的jsp文件
-
JSP最终会被转为java类
-
JSP本质就是一个servlet
-
例如一个jsp文件中的“”一行在最终转换的java文件可能被转换为“out.write("\n")”,当然这只是该java文件中的一小部分。但是至少反映了jsp的作用:减少程序员的代码量,减少繁琐的过程
-
servlet(jsp转换的java文件)中关于jsp的方法:!
-
jsp最终转换的java文件中的步骤:
-
判断请求
-
内置对象
-
- 输出页面前相关设置
以上对象我们可以在写jsp时直接用
- 输出我们写的页面
原理图:
在jsp中:只要是java代码就会原封不动,html格式out.write(html代码)进行转换
JSP基础语法和指令
JSP基础语法
学习前我们需要在pom.xml中导入四个依赖:
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<!--jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!-- jstl表达式依赖-->
<!-- 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>
<!--Standard标签库-->
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
- JSP表达式:
<%--jsp表达式:将程序的输出,输出到客户端--%>
<%-- 格式:<%=java变量或者表达式%> --%>
<%= new java.util.Date()%>
- JSP脚本片段:
<%--JSP脚本片段:可以写多行,多个脚本片段可以理解为再一个函数中可以相互调用-%>
<%
int sum=0;
for (int i = 0; i < 100; i++) {
sum+=i;
}
out.print("<h1>sum="+sum+"</h1>");
%>
<%
out.print("<h1>sum="+sum+"</h1>");
%>
- 脚本片段的再实现:
<%
for (int i = 0; i < 5; i++) {
%>
<h1>
Hello World
</h1>
<%
}
%>
html和jsp脚本片段可以来回嵌套
- JSP声明
<%!
static {
System.out.println("Hello World");
}
private int a = 0;
public void Method(){
System.out.println("进入方法方法");
}
%>
JSP声明会被编译到jsp生成的java类中!而其他的会被生成到一个其中_jspService方法中
所以,jsp的层级会相比其他高一些
JSP指令
-
三种指令标签:
- <%@ page ... %>:定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
- <%@ include ... %> :包含其他文件
- <%@ taglib ... %>:引入标签库的定义
-
page:相关属性
例如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--导入包--%>
<%@ page import="java.util.Date" %>
<%--定制错误页面:当发生错误如500定向到定制错误页面--%>
<%@page errorPage="error.jsp" %>
<%--声明这是一个错误页面--%>
<%@page isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%=1/0%>
</body>
</html>
另外还有可以再web.xml中定制错误页面:
<error-page>
发生404错误时
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
发生500错误时
<error-code>500</error-code>
<location>/error2.jsp</location>
</error-page>
-
include:通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file="文件相对 url 地址" %>
例子:
会将几个页面合二为一 <%@include file="/header.jsp"%> <h1>Hello World</h1> <%@include file="/footer.jsp"%>
jsp标签:
拼接页面,本质还是三个 <jsp:include page=""></jsp:include> <h1>Hello World</h1> <jsp:include page=""></jsp:include> 还有其他jsp标签:例如 <jsp:body></jsp:body> <jsp:attribute name=""></jsp:attribute>
-
taglib:Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。语法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
九大内置对象
-
request
-
response
-
pageContext
-
page
-
session
-
application [servletContext]
-
out
-
exception
-
config [servletConfig]
<%
// 下面四个 都可以存放数据和对应的取数据(getAttribute)(可以提供一种内置对象的get取得所有的)
pageContext.setAttribute("a",1);//只在这一个页面有效
request.setAttribute("b",2);//在一次请求中有效,请求转发会携带该数据
session.setAttribute("c",3);//一次会话中有效(打开到关闭浏览器)
application.setAttribute("d",4);//服务器中有效(打开到关闭服务器)
//寻找机制从底层到高层
int a = (int)pageContext.getAttribute("a");
int b = (int)pageContext.getAttribute("b");
int b = (int)request.getAttribute("b");
%>
request:客户端向服务器发生请求,存储用户看完了就没用的,比如新闻
session:客户端向服务器发生请求,用户看完一会还有用,如购物车
application::客户端向服务器发生请求,产生的数据一个用户用完了,其他用户还需要用的,比如:聊天数据
EL表达式
四大作用:
- 获取数据
- 执行运算
- 获取web开发常用对象
- 调用java方法
<%
int a = 1;
%>
<h1>${a}</h1>
<form action="index.jsp" method="get">
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
JSP标签
<%--转发:打开该页面跳到error.jsp,但url不变--%>
<jsp:forward page="/error.jsp">
<%-- 传递参数--%>
<jsp:param name="name" value="lihua"/>
<jsp:param name="age" value="15"/>
</jsp:forward>
在error.jsp中得到传递的参数
<h1>名字:<%=request.getParameter("name")%></h1>
<h1>年龄:<%=request.getParameter("age")%></h1>
这只是一个例子:jsp还有很多,可以自行查阅
JSTL表达式
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。定义了许多标签弥补一定html标签的不足。
引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
核心标签有:
还有sql标签,xml标签等
可以参考JSP 标准标签库(JSTL) | 菜鸟教程 (runoob.com)
使用JSTL标签步骤:
- 引入对应taglib
- 使用其中的方法
在导入jstl核心标签库发现出错,最终手动将D:\Maven\apache-maven-3.6.3-bin\apache-maven-3.6.3\maven-repo\javax\servlet\jstl\1.2中的jstl-1.2.jar包复制粘贴到tomcat中D:\tomcat\apache-tomcat-9.0.75-windows-x64\apache-tomcat-9.0.75\lib解决,可能是因为tomcat和maven的版本冲突
c:if例子:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="jsp.jsp" method="get">
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断如果提交的用户名是管理员,就登录成功--%>
<%--var表示把判断结果的真假值赋给var中的参数--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<c:out value="管理员欢迎你"></c:out>
</c:if>
<c:out value="${isAdmin}"></c:out>
</body>
</html>
结果:
<%--定义一个变量score值为85--%>
<c:set var="score" value="85"></c:set>
<%--判断--%>
<c:choose>
<c:when test="${score>90}"></c:when>
<c:when test="${score>80}"></c:when>
</c:choose>
<%--for-each--%>
<c:forEach var="people" items="${list}">
<c:out value="${people}"></c:out>
<br>
</c:forEach>
<%--for-i--%>
<c:forEach begin="" end="" step=""></c:forEach>
热门相关:倾心之恋:总裁的妻子 变身蜘蛛侠 花月颂 道君 锦乡里