- 💂 个人主页: 陈行恩
- 🤟 版权: 本文由【陈行恩】原创、在CSDN首发、需要转载请联系博主
- 💬 如果文章对你有帮助、欢迎关注+点赞+收藏(一键三连)哦!
JSP
JSP(全称JavaServer Pages)是由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编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
- JSP 与HTML 的区别:
- HTML只给用户提供静态的数据
- JSP页面中可以嵌入JAVA代码,为用户提供动态数据
JSP 过程
JSP源码分析
JSP 生成的java文件
- 找到jsp编译后生成的java文件与class文件
- 打开服务器,访问jsp文件
C:\Users\admin\AppData\Local\JetBrains\IntelliJIdea2021.3\tomcat
在这个路径下就会生成jsp的编译文件夹
- 进一步打开其下的文件夹:
- 查看生成的
index.jsp
与index.java
在jsp页面中,java代码会原封不动的输出,如果是html代码就会被转换为out.write("<head>\r\n");
这种格式输出到前端
JSP 本质就是一个Servlet
- 打开Jsp编译生成的java文件
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
_jspService
里面即是index.jsp 页面锁编译成的java文件
JSP 基础语法
JSP 作为java技术的一种应用,它拥有一些自己扩充的语法,Java任何语法都支持!
JSP 表达式
<%= 变量或者表达式%>
作用是用来将程序输出到客户端
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<!-- 这是html 注释语言-->
<%-- 这是jsp 注释语言--%>
<body>
<%-- 变量或者表达式--%>
<%= new java.util.Date()%>
</body>
</html>
注意: html的注释会在页面的审核元素上显示,但是jsp注释语言不会
JSP 脚本片段
<% java脚本片段 %>
作用是写java程序
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String name;
for (int i=0;i<5;i++){
name = "cxe"+Integer.toString(i);
out.print("<h1>姓名:"+name+"</h1>");
}
%>
</body>
</html>
JSP 声明
- <%! %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%-- EL表达式取值为null的话会自动过滤掉,但是--%>
<%-- <%=%>不存在就会返回null --%>
<%!
String name;
%>
<h1><%=name%></h1>
<h1>${name}</h1>
</body>
</html>
public final class index2_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
String name;
JSP声明:会被编译到JSP生成的Java类中,其他的,就会被生成到_jspService中,所以一些静态属性可以放在此处
注意:EL表达式取值为null的话会自动过滤掉,但是 <%=%>
不存在就会返回null
EL表达式
在JSP中访问模型对象是通过EL表达式的语法来表达。所有EL表达式的格式都是以“ ” 表 示 。 例 如 , {}”表示。例如, ”表示。例如,{ userinfo}代表获取变量userinfo的值。当EL表达式中的变量不给定范围时,则默认在page范围查找,然后依次在request、session、application范围查找。也可以用范围作为前缀表示属于哪个范围的变量,例如:${ pageScope. userinfo} 表示访问page范围中的userinfo变量。
错误页面
JSP 定制错误页面
- 显示的声明这是一个错误页面 <%@page isErrorPage=“true” %>
- 定制错误页面 ,当该页面发生错误的时候,就跳转到500.jsp
<%@page errorPage=“500.jsp” %>
- index2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定制错误页面 ,当该页面发生错误的时候,就跳转到500.jsp--%>
<%@page errorPage="500.jsp" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int i=1/0;
%>
</body>
</html>
- 500.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--显示的声明这是一个错误页面--%>
<%@page isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>你的程序内部出现了错误!!!</h1>
</body>
</html>
当我访问index.jsp 的时候,内部发生了错误,就会跳转到500.jsp页面
可以发现地址栏,没有变化,说明这个属于请求转发!
web.xml 实现错误页面配置
- web.xml
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
当发生500错误的时候,就跳转到500.jsp
- index2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int i=1/0;
%>
</body>
</html>
- 500.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>你的程序内部出现了错误!!!</h1>
</body>
</html>
JSP 指令
页面复用 %@include
包含指令 <%@include file=“head.jsp”%> 一个jsp中可以嵌套其他的页面
作用:可以增加页面脚本的复用
- index2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%@include file="head.jsp"%>
<h1>context</h1>
<%@include file="foot.xhtml"%>
</body>
</html>
- head.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>head</h1>
- foot.jsp
<h1>foot</h1>
但是这种方法有缺陷,这样形成的页面是多个页面合二为一
页面复用 jsp:include
- index2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:include page="head.jsp"/>
<h1>context</h1>
<jsp:include page="foot.jsp"/>
</body>
</html>
注意: 使用 %@include 来合并页面的时候,三个页面中不能有相同的java变量名,jsp:include 则可以;
本质还是三个页面,是一个拼接页面形成的
实现请求转发jsp:forward
- index5.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:forward page="/index6.jsp">
<jsp:param name="name" value="cxe"></jsp:param>
<jsp:param name="age" value="20"></jsp:param>
</jsp:forward>
</body>
</html>
- index6.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String name = (String)pageContext.findAttribute("name");
String age = (String)pageContext.findAttribute("age");
String name2 = request.getParameter("name");
String age2 = request.getParameter("age");
%>
<%=request.getParameter("name")%>
<%=request.getParameter("age")%>
<h1>name:${name}</h1>
<h1>age:${age}</h1>
<h1>name2:${name2}</h1>
<h1>age2:${age2}</h1>
<h1>name3:${param.name}</h1>
<h1>age3:${param.age}</h1>
</body>
</html>
当访问index5.jsp 的时候
可以看到,只有 <%= %>与${param.name} 才能将url中请求的参数取出来;
对象使用 jsp:useBean
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--jstl 核心标签库--%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>使用对象 测试</h1>
<jsp:useBean id="user" class="com.nadoutong.Servlet.pojo.User" scope="page"/>
<jsp:setProperty name="user" property="username" value="cxe"/>
<jsp:setProperty name="user" property="age" value="20"/>
姓名:<jsp:getProperty name="user" property="username"/>
年龄:<jsp:getProperty name="user" property="age"/>
</body>
</html>
JSP 九大内置对象及作用域
- request对象:是 javax.servlet.httpServletRequest类型的对象。
- response对象: 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。
- session对象:是由服务器自动创建的与用户请求相关的对象。
- application对象:可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。
- out 对象:用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。
- pageContext 对象:作用是取得任何范围的参数,可以获取 JSP页面的out、request、reponse、session、application 等对象。
- config 对象:主要作用是取得服务器的配置信息。
- page 对象:代表JSP本身,只有在JSP页面内才是合法的。
- exception 对象:作用是是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。
public abstract class PageContext extends JspContext {
public static final int PAGE_SCOPE = 1;//作用域 只在页面中生效
public static final int REQUEST_SCOPE = 2;//只在一次请求中生效 请求转发会携带该数据
public static final int SESSION_SCOPE = 3;//只在一次会话中生效,打开浏览器到关闭浏览器
public static final int APPLICATION_SCOPE = 4;//保存在服务器中,从打开服务器到关闭服务器
public static final String PAGE = "javax.servlet.jsp.jspPage";
public static final String PAGECONTEXT = "javax.servlet.jsp.jspPageContext";//页面上下文 存东西
public static final String REQUEST = "javax.servlet.jsp.jspRequest"; // 存东西
public static final String RESPONSE = "javax.servlet.jsp.jspResponse";
public static final String CONFIG = "javax.servlet.jsp.jspConfig";
public static final String SESSION = "javax.servlet.jsp.jspSession"; // 存东西
public static final String OUT = "javax.servlet.jsp.jspOut";
public static final String APPLICATION = "javax.servlet.jsp.jspApplication"; // 存东西
public static final String EXCEPTION = "javax.servlet.jsp.jspException";
- index3.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<%
pageContext.setAttribute("name1","cxe1");//保存的数据只在一个页面中有效
request.setAttribute("name2","cxe2");//保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","cxe4");//保存的数据只在一个会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","cxe4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
<h1>name1:${name1}</h1>
<h1>name2:${name2}</h1>
<h1>name3:${name3}</h1>
<h1>name4:${name4}</h1>
<h1>name5:${name5}</h1>
<body>
</body>
</html>
- index4.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>name1:${name1}</h1>
<h1>name2:${name2}</h1>
<h1>name3:${name3}</h1>
<h1>name4:${name4}</h1>
<h1>name5:${name5}</h1>
</body>
</html>
首先访问index3.jsp
再访问index4.jsp
name1与name2的值为都为null ,是因为name1只在当前页面有效,name2 是只在一次请求中中有效;
现在关闭页面,再次访问index4.jsp
name3也为null,是因为name3只在一次会话中有效;
同理需要name5 也消失,需要关闭服务器,然后重新启动服务器再次直接访问index4.jsp,name5 也会消失;
那么如果需要使用request设置属性,且需要这个属性能够在整个会话中生效呢?
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<%
pageContext.setAttribute("name1","cxe1",3);//保存的数据只在一个页面中有效
request.setAttribute("name2","cxe2");//保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","cxe4");//保存的数据只在一个会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","cxe4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
<h1>name1:${name1}</h1>
<h1>name2:${name2}</h1>
<h1>name3:${name3}</h1>
<h1>name4:${name4}</h1>
<h1>name5:${name5}</h1>
<body>
</body>
</html>
设置了name1 的作用域是整个会话
JSTL
- JSTL(Java server pages standarded tag library,即JSP标准标签库)是由JCP(Java community Proces)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
核心标签库的使用
- 引入核心标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
if 判断 c:if
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--jstl 核心标签库--%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>if 判断测试</h1>
<form action="/index7.jsp" method="get">
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断如果提交的为 root ,就输出成功--%>
<c:if test="${param.username=='root'}" var="isRoot">
<c:out value="登录成功" />
</c:if>
<%--自闭合标签--%>
<c:out value="${isRoot}"/>
</body>
</html>
注意:错误原因,是因为tomcat服务器还需要引入JSTL包、standard包
选择判断 c:choose
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--jstl 核心标签库--%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>choose 判断测试</h1>
<%--定义变量--%>
<c:set var="age" value="20"/>
<c:choose>
<c:when test="${age<16}">
未成年
</c:when>
<c:when test="${age>16}">
已成年
</c:when>
</c:choose>
</body>
</html>
循环 c:forEach
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--jstl 核心标签库--%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>循环 测试</h1>
<%
ArrayList<String> objects = new ArrayList<>();
objects.add(0,"cxe");
objects.add(1,"cxe2");
request.setAttribute("list",objects);
%>
<%--
var 每一次遍历出来的变量
items 要遍历的对象
begin 从哪里开始
end 哪里结束
step 步长
--%>
<c:forEach var="object" items="${list}">
<c:out value="${object}"/><br/>
</c:forEach>
</body>
</html>
javaweb 推荐狂神说