java server pages(java服务器端页面,也和Servlet一样,用于动态Web技术)
最大的特点:写JSP就像在写HTML
区别:HTML只给用户提供静态的数据
JSP页面中可以嵌入JAVA代码,为用户提供动态数据。
思路:JSP到底怎么执行的?
(1)代码层面没有任何问题,仍然为如下所示:
(2)服务器内部工作
Tomcat中有一个work目录,work目录就是Tomcat工作的目录。
IDEA中使用Tomcat的会在IDEA的tomcat中生成一个work目录
其中Tomcat即为IDEA中Tomcat的工作空间。
地址如下所示:
C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2022.1\tomcat\060f05dc-727f-4cf1-b15f-3fc617a8a14b\work\Catalina\localhost\Cookie_war\org\apache\jsp
我们发现页面转变成了Java程序
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet。
JSP最终也会被转换成为一个Java类
我们打开该文件后,首先我们来看源码:
针对源码,我们会思考为什么该类没有实现servlet接口,没有继承HttpServlet。而是继承的是HttpJspBase,实现的是JspSourceImports这个接口。针对这个疑问,我们进行如下思考:
我们发现这样子无法进入源码界面:
我们手动进行导包:
我们发现爆红:
我们成功的导入进去如下所示:
我们发现导入进去还是无法成功,我们进行搜索之后发现如下所示:
我们发现之前我们所导入的包都是错误的。我们进行导入jasper-runtime包。
我们在maven仓库里面进行搜索:https://mvnrepository.com
搜索如下所示:
我们点击5.5.23,将其复制到pom.xml里面:
复制代码如下所示:
tomcat
jasper-runtime
5.5.23
我们复制进去,发现有刷新指示,我们进行刷新,即可发现Structure里面导入了这个包。
我们进入随便一个类里面进行输入的时候(必须是Cookie包里面的):我们发现存有这个类了。
我们进入HttpJspBase源码里面进行查看:
我们发现该类继承自HttpServlet。
JSP本质上就是一个Servlet.
我们在源码里面有对应的实现:
源码里面我们发现这些都是手动输出的。说明我们编写的jsp界面最后转换成java程序的时候,它手动做了我们原来程序员做的繁琐的事情。,而我们只用管理简单的实现就可以啦
我们进行对index_jsp.java文件进行查看:
我们发现里面的:
常量:
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
里面的方法代码:与service里面的三个方法相同(初始化,销毁,以及调用service)
//初始化
public void _jspInit() {
}
//销毁
public void _jspDestroy() {
}
//JSPservice
//Tomcat里面每个都是要走这样子一个请求服务,服务过来就会处理这个Request(请求)与Response(响应)
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
我们可以利用请求与响应去做一些事情,我们来看jsp里面做了什么:
1.判断请求:
//判断请求
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
return;
}
2.内置了一些对象:
//内置对象
final javax.servlet.jsp.PageContext pageContext; //pageContext为页面上下文
javax.servlet.http.HttpSession session = null; //session,可以直接拿来用
final javax.servlet.ServletContext application;
//applicationContext本质上就是ServletContext.他的作用域非常的高。
final javax.servlet.ServletConfig config; //config 配置
javax.servlet.jsp.JspWriter out = null; //out对象,输出对象,JspWriter
final java.lang.Object page = this; //this代表本身这个页面,page:当前页
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
final javax.servlet.http.HttpServletRequest request, //请求
final javax.servlet.http.HttpServletResponse response //响应
我们对源码继续往下看,我们发现使用了try -catch方法:
同时在输出页面之前增加了一些代码:
response.setContentType("text/html"); //设置响应的页面类型为html。
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true); //初始化对象,其中this代表它本身,
_jspx_page_context = pageContext;
application = pageContext.getServletContext(); //application赋了一个值,与此前的相同,为GetServletContext。
config = pageContext.getServletConfig(); //获取了一个配置文件,在web.xml的配置文件可以得到
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
以上的这些对象我们可以在JSP界面直接使用
我们创建一个新的JSP,为hello.jsp。
我们发现目前还没有hello.jsp,我们需要进行访问之后才会将文件编译成class文件。
我们进入hello.jsp进行查看,我们在jsp里面进行取数据需要使用${ }进行取
四大作用域:session request application page
pageContext为页面上下文。
pageScope为页面的作用域
requestScope为request的作用域
session里面可以存东西,可以通过这种方式在页面里取出来
我们也可以通过这种方式取出来。
我们可以使用Jsp里面已经有的对象 ,通过对java代码的编写
我们发现我们没有new out这个对象,但是我们已经可以直接使用了。
我们之前的session没有去getAttribute,但是可以直接使用。能直接使用的原因是我们在index_jsp.java源码里面已经帮我们实现了。
我们新建一个hello.jsp,如下所示:
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/9/8
Time: 15:20
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
hello
我们运行之后,回到文件夹页面,进行刷新发现如下所示:
我们同时发现work文件夹也不见了,当服务器跑完之后,进行刷新。发现新建了work文件夹:
我们发现进入网站进行访问hello.jsp的时候,我们访问完毕之后,JSP里面出现了hello_jsp.java的源文件:
我们进入hello_jsp.java文件,我们发现除了我们的界面代码不一样之外,其他全部相同。我们了解到,JSP本质就是servlet,只不过jsp帮你简化了很多东西,只需要写页面部分即可。:
以下为我们所要写的页面部分:
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write(" Title \r\n");
out.write("\r\n");
out.write("\r\n");
out.write(" hello\r\n");
out.write("\r\n");
out.write("\r\n");
我们进入hello.jsp里面进行编写代码:
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/9/8
Time: 15:20
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
//我们在里面定义了一个java的变量。
<% String name="rgf521ypl";
%>
//我们可以通过out.print进行输出,也可以用以下方式输出:
name:<%=name%> //在jsp里面取出东西的方式为:<%=所取出来的值%>
我们运行之后如下所示:
我们进行查看源码:
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write(" Title \r\n");
out.write("\r\n");
out.write("\r\n");
out.write(" ");
String name="rgf521ypl"; //java代码被原封不动的进行输出
out.write("\r\n");
out.write("\r\n");
out.write("name:"); //通过out.write进行输出
out.print(name);
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
在JSP页面中,只要是java代码就会被原封不动的进行输出,如果是HTML代码,就会被转换为一个个的out.write对象。
out.write("\r\n");
以这样子的格式输出到前端。