jsp
什么是jsp
Java Servlet Pages:java服务器端页面。也和Servlet一样用于开发动态web技术
最大的特点:
- 写Jsp就像在写Html
- 区别:
- HTML只给用户提供静态数据
- JSP页面中可以嵌入Java代码,为用户提供动态数据
jsp原理
思路:JSP到底怎么执行
-
代码层面没有问题
-
服务器内部工作
tomcat中有一个work目录
IDEA中使用Tomcat会在IDE中生成一个work目录
-
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
-
Jsp最后也会转换成java类
-
Jsp本质上就是一个Servlet
-
判断请求
-
内置了一些对象
- pageContext:页面上下文
- Session
- application:applicationContext = ServletContext
- config:配置
- out
- page:当前页
- request:请求
- response:响应
-
输出页面前增加的代码
- 以上的对象可以在jsp页面中直接使用
在JSP页面中:
-
只要是Java代码,就会原封不动地输出
-
如果是HTML代码,就会被转换成:
out.write("<html>")
这样的格式渲染到前端
JSP基础语法
JSP表达式
用来将程序的输出输出到客户端
<%-- JSP表达式
作用:用来将程序的输出输出到客户端
<%= 变量或表达式%>>
--%>
<%= new java.util.Date()%>
结果:页面直接显示日期
Jsp脚本片段
<%
int sum = 0;
for(int i = 1; i <= 100; i++){
sum += i;
}
out.println("<h1>Sum=" + sum +"</h1>");
%>
结果:Sum=5050
脚本片段的再实现
在代码中嵌入HTML元素
<%
for(int i = 0; i < 5; i++) {
%>
<h1>hello world <%=i%></h1>
<%
}
%>
hello world 0
hello world 1
hello world 2
hello world 3
hello world 4
JSP声明
<%!
static{
System.out.println("Loading Servlet");
}
int var = 0;
public void init(){
System.out.println("进入了方法init");
}
%>
区别:
JSP声明:
- 会被编译到JSP生成的Java类中
其他:
- 生成到_jspService方法中
在JSP中,嵌入Java代码即可
JSP指令
定制错误页面
<%-- 定制错误页面 --%>
<%@ page import="java.util.*" %>
<%@ page errorPage="error/500.jsp" %>
当该页面有错误时就会自动跳转到error下的500.jsp页面
也可以在web.xml下配置
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
显式地声明这是个错误页面
<%@ page isErrorPage="true" %>
提取公共页面
<%@ include file=""%>
拼接页面
<jsp:include page="footer.jsp"/>
转发页面
<jsp:forward page="test2.jsp"></jsp:forward>
JSP内置对象及作用域
九个内置对象
- PageContext
- Request
- Response
- Session
- Application ->ServletContext 存东西
- config ->ServletConfig
- out
- page
- exception
1. 内置对象存储
//保存的数据只在一个页面中有效
pageContext.setAttribute("name1","yeye");
//保存的数据只在一次请求中有效,请求转发会携带
request.setAttribute("name2","yeye");
//保存的数据在一次会话中有效(从打开浏览器到关闭浏览器)
session.setAttribute("name3","yeye");
//保存的数据在服务器中有效,从打开服务器到关闭服务器
application.setAttribute("name4","yeye");
2. 从pageContext取出
<%--通过PageContext取出我们保存的值
脚本片段中的代码,会被原封不动生成到.jsp.java
所以这里的代码必须保证Java语法的正确性--%>
<%
//从PageContext中取出,我们通过寻找的方法
//从底层到高层(作用域):page->request->session->application
//类似JVM的双亲委派机制
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");
%>
3.使用EL表达式输出
<%--使用el表达式输出 -> ${}--%>
<h1>取出的值为</h1>
<h4>${name1}</h4>yeye
<h4>${name2}</h4>yeye
<h4>${name3}</h4>yeye
<h4>${name4}</h4>yeye
<h4>${name5}</h4>不显示
<h3><%=name5%></h3>null
请求转发
<%
//前端转发
pageContext.forward("/index.jsp");
//原型:
request.getRequestDispatcher("/index.jsp").forward(request,response);
%>
应用
- Request:客户端向服务器发送请求产生的数据,用户看完就没用了
- Session:产生的数据用户用完了一会儿还有用,比如:购物车
- application:一个用户用完了,其他用户还可能使用,比如:聊天数据
<%@ page contentType="text/html; utf-8" language="java" %>
<html>
<head>
<title></title>
</head>
<%
//保存的数据只在一个页面中有效
pageContext.setAttribute("name1","yeye");
//保存的数据只在一次请求中有效,请求转发会携带
request.setAttribute("name2","yeye");
//保存的数据在一次会话中有效(从打开浏览器到关闭浏览器)
session.setAttribute("name3","yeye");
//保存的数据在服务器中有效,从打开服务器到关闭服务器
application.setAttribute("name4","yeye");
%>
<%--通过PageContext取出我们保存的值
脚本片段中的代码,会被原封不动生成到.jsp.java
所以这里的代码必须保证Java语法的正确性--%>
<%
//从PageContext中取出,我们通过寻找的方法
//从底层到高层(作用域):page->request->session->application
//类似JVM的双亲委派机制
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>
<h4>${name1}</h4>yeye
<h4>${name2}</h4>yeye
<h4>${name3}</h4>yeye
<h4>${name4}</h4>yeye
<h4>${name5}</h4>不显示
<h3><%=name5%></h3>null
<%
//前端转发
pageContext.forward("/index.jsp");
//原型:
request.getRequestDispatcher("/index.jsp").forward(request,response);
%>
</html>
JSP标签
EL表达式:${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
<%--转发可以携带参数
url:http//localhost:8080/tset2.jsp?name=yeye--%>
<jsp:forward page="test2.jsp">
<jsp:param name="name" value="yeye"/>
</jsp:forward>
<%--取出参数--%>
名字:<%=request.getParameter("name")%>
JSTL表达式
JSTL标签库的使用就是为了弥补HTML标签的不足,它自定义了许多的标签,可以供我们使用,标签的功能和Java代码一样
核心标签(掌握部分)
引入JSTL核心标签库,我们才能使用JSTL标签:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
标签 描述
<c:out> 用于在JSP中显示数据,就像<%= ... >
<c:set> 用于保存数据
<c:remove> 用于删除数据
<c:catch> 用来处理产生错误的异常状况,并且将错误信息储存起来
<c:if> 与我们在一般程序中用的if一样
<c:choose> 本身只当做<c:when>和<c:otherwise>的父标签
<c:when> <c:choose>的子标签,用来判断条件是否成立
<c:otherwise> <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行
<c:import> 检索一个绝对或相对 URL,然后将其内容暴露给页面
<c:forEach> 基础迭代标签,接受多种集合类型
<c:forTokens> 根据指定的分隔符来分隔内容并迭代输出
<c:param> 用来给包含或重定向的页面传递参数
<c:redirect> 重定向至一个新的URL.
<c:url> 使用可选的查询参数来创造一个URL
格式化标签
SQL标签
XML标签
JSTL标签库使用步骤
- 引入对应的taglib
- 使用其中的方法
c:if c:out
<%--如果判断提交的用户名是管理员,则成功登录--%>
<%
if(request.getParameter("username").equals("admin")) {
out.print("登录成功");
}
%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<c:out value="管理员欢迎你"/>
</c:if>
c:set c:choose
<%--定义一个变量叫score,值为85--%>
<c:set var="score" value="85"></c:set>
<c:choose>
<c:when test="${score>=90}">
你的成绩为优秀
</c:when>
<c:when test="${score>=90}">
你的成绩为良好
</c:when>
</c:choose>
c:foreach
<%
ArrayList<String> strings = new ArrayList<String>();
strings.add(0,"a");
strings.add(1,"gg");
request.setAttribute("list",strings);
%>
<%--var:每一次遍历出来的变量--%>
<%--items:要遍历的对象--%>
<%--step:步长--%>
<%--begin,end:开始,结束--%>
<c:forEach var="string" items="${strings}">
<c:out value="${string}"/> <br>
</c:forEach>