}
public void _jspService(final HttpServletRequest request, final HttpServletResponse response)
throws java.io.IOException, ServletException {
final PageContext pageContext;
HttpSession session = null;
final ServletContext application;
final ServletConfig config;
JspWriter out = null;
final Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
response.setContentType(“text/html;charset=UTF-8”);
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(“\r\n”);
out.write(“\r\n”);
out.write(“\r\n”);
out.write(“\r\n”);
out.write("
out.write(“\r\n”);
out.write(“\r\n”);
String s = “HelloWorda”;
out.println(s);
out.write(“\r\n”);
out.write(“\r\n”);
out.write(“\r\n”);
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
编译过程是这样子的:浏览器第一次请求1.jsp时,Tomcat会将1.jsp转化成1_jsp.java这么一个类,并将该文件编译成class文件。编译完毕后再运行class文件来响应浏览器的请求。
以后访问1.jsp就不再重新编译jsp文件了,直接调用class文件来响应浏览器。当然了,如果Tomcat检测到JSP页面改动了的话,会重新编译的。
既然JSP是一个Servlet,那JSP页面中的HTML排版标签是怎么样被发送到浏览器的?我们来看下上面1_jsp.java的源码就知道了。原来就是用write()出去的罢了。说到底,JSP就是封装了Servlet的java程序罢了。
out.write(“\r\n”);
out.write(“\r\n”);
out.write(“\r\n”);
out.write(“\r\n”);
out.write("
out.write(“\r\n”);
out.write(“\r\n”);
有人可能也会问:JSP页面的代码服务器是怎么执行的?再看回1_jsp.java文件,java代码就直接在类中的service()中。
String s = “HelloWorda”;
out.println(s);
**JSP内置了9个对象!**内置对象有:out、session、response、request、config、page、application、pageContext、exception。
重要要记住的是:JSP的本质其实就是Servlet。只是JSP当初设计的目的是为了简化Servlet输出HTML代码。
什么时候用JSP
重复一句:JSP的本质其实就是Servlet。只是JSP当初设计的目的是为了简化Servlet输出HTML代码。
我们的Java代码还是写在Servlet上的,不会写在JSP上。在知乎曾经看到一个问题:“如何使用JSP连接JDBC”。显然,我们可以这样做,但是没必要。
JSP看起来就像是一个HTML,再往里边增加大量的Java代码,这是不正常,不容易阅读的。
所以,我们一般的模式是:在Servlet处理好的数据,转发到JSP,JSP只管对小部分的数据处理以及JSP本身写好的页面。
例如,下面的Servlet处理好表单的数据,放在request对象,转发到JSP
//验证表单的数据是否合法,如果不合法就跳转回去注册的页面
if(formBean.validate()==false){
//在跳转之前,把formbean对象传递给注册页面
request.setAttribute(“formbean”, formBean);
request.getRequestDispatcher(“/WEB-INF/register.jsp”).forward(request, response);
return;
}
JSP拿到Servlet处理好的数据,做显示使用:
JSP需要学什么
JSP我们要学的其实两块就够了:JSTL和EL表达式
EL表达式
**表达式语言(Expression Language,EL),EL表达式是用${}
括起来的脚本,用来更方便的读取对象!**EL表达式主要用来读取数据,进行内容的显示!
为什么要使用EL表达式?我们先来看一下没有EL表达式是怎么样读取对象数据的吧!在1.jsp中设置了Session属性
<%@ page language=“java” contentType=“text/html” pageEncoding=“UTF-8”%>
<%
//向session设置一个属性
session.setAttribute(“name”, “aaa”);
System.out.println(“向session设置了一个属性”);
%>
在2.jsp中获取Session设置的属性
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
<%
String value = (String) session.getAttribute(“name”);
out.write(value);
%>
效果:
上面看起来,也没有多复杂呀,那我们试试EL表达式的!
在2.jsp中读取Session设置的属性
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
${name}
只用了简简单单的几个字母就能输出Session设置的属性了!并且输出在浏览器上!
使用EL表达式可以方便地读取对象中的属性、提交的参数、JavaBean、甚至集合!
JSTL
${name}
只用了简简单单的几个字母就能输出Session设置的属性了!并且输出在浏览器上!
[外链图片转存中…(img-fvm6dBg5-1716351130025)]
使用EL表达式可以方便地读取对象中的属性、提交的参数、JavaBean、甚至集合!