1.什么是JSP
Java Server Pages:Java服务器端页面,也和Servlet一样,用于动态web技术。
最大的特点:
-
写jsp就像在写html。
-
jsp页面中可以嵌入Java代码,为用户提供动态数据。
2.JSP原理(本质上就是Servlet)
理解思路:jsp到底是怎样执行的?
-
在代码层面:没有任何问题,就是和servlet一样。
-
在服务器内部层面:
-
你运行完jsp项目之后,tomcat中有一个work目录。
-
IDEA中使用tomcat的会在IDEA的tomcat中产生一个work目录。
-
点开之后,你会发现jsp页面被转变成了Java程序。
-
index_jsp.class index_jsp.java
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet。
JSP最终也会被转换成为一个Java类。
本质上就是一个Servlet
public void _jspInit(){ ? } public void _jspDestory(){ ? } public void _jspService(req,resp){ ? }
内置一些对象
pageContext #页面上下文
session #session
application #applicationContext
config #config
out #out
page #当前
req
resp
JSP运行原理流程图:
在JSP页面中:
-
只要是Java代码,就会原封不动的输出。
-
如果是HTML代码,就会被转换为:内部自动转换
out.write("<html>\r\n");
然后输出到前端。
3.JSP基础语法
任何语言都有自己的语法,Java有。JSP作为Java技术的一种应用,它拥有一些自己扩充的语法,其中Java所有语法他都支持。
JSP表达式
<%--JSP表达式 作用:用来将程序的输出,输出到客户端 <%= 变量或者表达式%> --%> ? <%= new java.util.Date()%>
JSP脚本片段
脚本片段中的代码会被原封不动生成到.jap.java中,所以这里面组好不要写注释。
没有=开头 ? <% int sum = 0; for(int i =1; i <= 100; i++){ sum += i; } out.println("<h1>Sum="+sum+"</h1>") %>
JSP声明
!开头 <%! static{ System.out.println("Loading Servlet!"); } private int globalval = 0; public void li(){ System.out,println("进入了") }
注意:
-
JSP声明会被编译到JSP生成的Java类中,其它的,都会被生成到JavaSservice方法中。
-
JSP的注释,不会再客户端显示,HTML的会。
JSP指令的格式:<%@指令名 attr1=”” attr2=”” %>,一般都会把JSP指令放到JSP文件的最上方,但这不是必须的。
JSP中有三大指令:page、include、taglib,最为常用,也最为复杂的就是page指令了。
# jsp页面编码信息 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> ? # import 来导入用到的Java包 <%@page import=”java.net.*,java.util.*,java.sql.*”%>
page指令的errorPage和isErrorPage
在一个JSP页面出错后,Tomcat会响应给我用户错误信息!如果你不希望Tomcat给用户输出错误信息,那么可以使用page指令的errorPage来指定错误页!例如:
<%@page errorPage=”xxx.jsp”%>
这时,在当前JSP页面出现错误时,会转发到xxx.jsp页面。
pageError的路径,由于是服务器端的跳转,所以绝对路径不需要加项目名,直接指定项目名称后面的路径即可
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page errorPage="b.jsp" %> <% if(true){ throw new Exception("抛出异常"); } %> ? b.jsp <%@ page pageEncoding="UTF-8"%> <html> <body> 输出异常文字或信息! </body> </html> ? <%@ page isErrorPage="true" %>
还可以在web.xml文件中配置错误页面,在出现某种错误时跳转到对应的页面处理。
<error-page> <error-code>404</error-code> <location>/error404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error500.jsp</location> </error-page>
include指令
include指令表示静态包含!
include指令只有一个属性:file,指定要包含的页面,例如:<%@include file=”b.jsp”%>。
静态包含:当hel.jsp页面包含了lo.jsp页面后,在编译hel.jsp页面时,需要把a.jsp和b.jsp页面合并成一个文件,然后再编译成Servlet(Java文件)。
taglib指令
在JSP页面中使用第三方的标签库时,需要使用taglib指令来“导包”。例如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
其中prefix表示标签的前缀,这个名称可以随便起。uri是由第三方标签库定义的,所以你需要知道第三方定义的uri。
JSTL标签库会说明taglib指令的使用方式。
JSP九大内置对象
PageContext 存东西 Request 存东西 Response Session 存东西 Application(ServletContext) 存东西 config (ServletConfig) out page exception pageContext.setAttribute("name1","lihui1"); #保存的数据只在一个页面中有效 request.setAttribute("name1","lihui2"); #保存的数据只在一次请求中有效,但是请求转发可以携带这个数据 session.setAttribute("name1","lihui3"); #保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器 application.setAttribute("name1","lihui4"); #保存的数据只在服务器中有效,从打开服务器到关闭服务器 application > session > request > pageContext
使用场景:
request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻。
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车。
application:客户端向服务器端发送请求,产生的数据,一个用户用完了,其它用户还可能使用,比如:聊天数据。
JSTL表达式
JSTL标签库的使用就是为了弥补HTML标签的不足,它自定义许多标签,可以供我们使用,标签的功能和Java代码一样。
-
格式化标签
-
SQL标签
-
XML标签
-
<c:out>
<c:set>
<c:if>
<c:choose>
<c:when>
<c:forEach>
<c:params>
JSTL标签使用步骤:
-
引入对应的taglib
-
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
-
使用其中的方法
-
在tomcat也需要引入jstl的包,否则会莫名报错:jstl解析错误。