JSP(Java Server Pages)页面虽然看上去和HTML没有区别,但如果服务器要给浏览器响应动态页面,就要处理Servlet。
而JSP与Servlet都是用于动态页面,在JSP还没有面试的年代,后端程序员写输出前端页面需要这样操作:
resp.getWriter().write("<html>");
resp.getWriter().write("<body>");
resp.getWriter().write("<h2>Hello World</h2>");
resp.getWriter().write("<body>");
JSP和HTML的区别就是:JSP是动态的;而HTML是伪动态的,即使利用一些JS让页面改变,其本质上还是没有与服务器发生交互。所以JSP中是可以嵌入Java代码的,目的是给用户提供动态数据。
JSP原理:
IDEA中使用Tomcat,会在IDEA的Tomcat目录中生成一个work目录,路径如下:
work目录继续深入:
最后停留在Java代码,因为JSP最后也会被转换成Java类。说明浏览器向服务器发送任何请求,其实都是在访问Servlet。
现在引入JSP的依赖:
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
JSP本质上就是一个Servlet,其内置了一些对象,可以在上述的index.jsp.java中看到:
final javax.servlet.jsp.PageContext pageContext;//页面上下文,存东西
javax.servlet.http.HttpSession session = null;//Session,存东西
final javax.servlet.ServletContext application;//与Servlet中的ServletContext一致
final javax.servlet.ServletConfig config;//区别于ServletContext,ServletConfig是大仓库中小仓库
javax.servlet.jsp.JspWriter out = null;//输出对象
final java.lang.Object page = this;//page代表当前页
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
还有request,response,exception对象,以上这些对象JSP可以直接使用
里面有如下代码实现了index.jsp页面的HTML代码:
try {
response.setContentType("text/html");//设置了响应页面类型
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);//this指的是page
_jspx_page_context = pageContext;
application = pageContext.getServletContext();//说明了application本质上是ServletContext
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();//此处回忆起之前Demo中为什么要将PrintWriter对象命名为out
_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");
在index.jsp中所写的一起内容,或主动或被动最终都会转换成上面的Java代码输出。
例如,hello.jsp内容如下:
<%
String name = "Ju";
%>
name: <%=name%>
启动Tomcat后进入hello.jsp页面,输出
此时进入上述的最后JSP目录下,查看hello.jsp.java的代码,发现上述的代码已经转换成下列的Java代码:
String name = "Ju";
out.write("\r\n");
out.write("\r\n");
out.write("name: ");
out.print(name);
在JSP页面中,只要是Java代码就会原封不动地输出,HTML代码会被转换成out.write输出。-是被“渲染出来的”。