如果你想详细地了解JSP和JSTL的话,你可以去菜鸟教程
和w3c
学习。我觉得任何一种知识都是学不完的,展开讲实在是太多了。这篇文章会梳理一下知识结构
,这样子的话就能有效的管理知识
,之后的学习中需要不断完善。
JSP
什么是JSP
-
jsp是java server page的缩写:java服务端页面
-
jsp的书写格式像html。通过html标签写页面、通过jsp标签嵌入java代码。以此实现动态web
-
jsp其本质是servlet。代码最终会被编译成servlet
与servlet的比较
-
直接书写servlet需要把html页面的每一行手动转换成out.print("xxx"),非常繁琐且容易出错
-
jsp页面还支持el表达式、jstl标签,写起来更加清晰、快捷
-
在实际的开发中一般会把jsp与servlet程序结合起来使用。比如表单提交页面使用jsp写,表单处理用servlet写,这样可以发挥出各自的优势,且前后端的结构清晰
JSP原理
jsp代码执行的流程
jsp执行流程.jpg在tomcat目录(D:\Environment\tomcat-9.0.36\work\Catalina\localhost\ROOT\org\apache\jsp)和idea临时目录的work下(C:\Users\hwx.IntelliJIdea2019.1\system\tomcat\Unnamed_servlet01_6\work\Catalina\localhost\s2\org\apache\jsp)都有一个JSP文件夹,这个文件夹是用来放JSP编译后产生的class文件的。当jsp文件被访问时,idea的work目录下就会产生相应的jsp的java和class文件。打开这个java文件一看,这个类是继承HttpJspBase的
继承图如下:
HttpJspBase.png简单分析一下HttpJspBase的源码
- 可访问的属性和方法
- 内置对象和代码段
- 内置对象: jsp中有九大内置对象
内置对象,又叫做隐含对象,不需要预先声明就可以在脚本代码和表达式中随意使用。
这是为什么呢?我们可以把每一个jsp页面视为一个写完一半的servlet,所有的准备工作和可能用到对象都已经被准备好了,我们只需要调用现成的对象,专注于往页面输出的东西就好了。
下面的这些就是java源码中定义对象的代码。
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
不要看这些对象的类型是新的,仔细看这些对象,它们只不过是在原来的接口上进行了重新的封装而已,我们原来是怎么用的现在还是怎么用。
- 代码段:
在这个java文件的末尾(如下图)可以看到我们写的jsp代码统统变成了我们熟悉的servlet代码。并且注意到pageContext从_jspxFactory对象上拿到,其他的内置对象可以从pageContext身上拿到。
pageContext可以去深入理解一下
try {
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("<html>\n");
out.write("<body>\n");
out.write("<h2>Hello World!</h2>\n");
out.write("</body>\n");
out.write("</html>\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
内置对象的作用域
-
九大内置对象
request
response
pageContext
session
application
out
config
page
exception -
四大作用域
作用域代表了取用数据的有效范围。下面这些内置对象能够存储数据,同时也标志了四种作用域。我们下面讨论一下它们的作用域范围。
-
pageContext //保存的数据只在这一个页面有效
-
request //只在一次请求中有效,请求转发会携带
-
session //在一次会话中有效
-
application //保存的数据在服务器运行时都有效
- 作用域情况如下图所示:
-
JSP、JSTL、EL表达式
JSTL和EL表达式是对Jsp的优化,但并不是重点,用jsp都能实现。所以后面两种只用了解,觉得好用就用,不好用记不住就不用。使用之前在pom中导入依赖。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies></pre>
web.xml必须这样
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
Jsp
-
脚本程序。脚本程序的语法格式:<% 代码片段 %>
-
jsp声明。JSP声明的语法格式:<%! 声明变量 %>
-
JSP表达式。表达式的值会插入到表达式出现的地方。<%= 表达式 %>
-
jsp指令。JSP指令用来设置与整个JSP页面相关的属性。<%@ 属性 %>
-
JSP行为。JSP行为标签使用XML语法结构来控制servlet引擎。<jsp:action_name attribute="value" />
JSTL
-
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。JSTL的出现主要是为了简化脚本程序的
-
使用流程:-->导包-->page页面声明核心库-->使用JSTL标签、
-
在第一次运行的时候,可能需要手动引入特定包到项目和tomcat的lib目录下,如果第一次运行的时候遇到500错误的话。那两个包在Tomcat的这个目录下:D:\Environment\tomcat-9.0.36\webapps\examples\WEB-INF\lib
EL表达式
-
EL表达式主要用于替换JSP页面中的脚本表达式<%= 变量或表达式 %>,以从各种类型的web域中检索java对象、获取数据。
网友评论