jsp的本质是servlet,是运行在服务器端的小程序,是继承HttpServlet的java类,用以处理客户端的请求。当用户向指定Servlet发送请求时,Servlet利用输出动态流生成html页面。随意创建一个jsp文件,如hello.jsp,写上一些html代码后放到tomcat/webapps/ROOT中,启动tomcat后,在work/Catalina/localhost/_/org/apache/sp/目录下会生成指定的hello_jsp.java以及hello_jsp.class文件。这就是tomcat处理jsp文件后生成的servlet类。
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;
private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
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;
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("<html>\r\n");
out.write("\t<head>\r\n");
out.write("\t\t<title>hello jsp</title>\r\n");
out.write("\t</head>\r\n");
out.write("\t<body>\r\n");
out.write("\t\t<h1>hello jsp</h1>\r\n");
out.write("\t</body>\r\n");
out.write("</html>");
} 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);
}
}
}
程序结尾由out.write输出的是html代码,从字面上可以大概可以知道,我们在客户端所看到的html代码是由此生成并输出的。而在实际的web应用开发中,我们一般不会直接在jsp中直接写后台代码,特别是在”后台分离“观念很深刻的今天。在java web应用发展的历程中,原生的servlet用做为处理用户请求的特殊类仍是一个比较重要的历史阶段。以上代码毕竟是由tomcat处理生成的,看似有些杂乱,但只要细细研究过serlvet就会发现,其实上面的代码其实很完整的,比在eclipse中new出来的servlet文件还要完整详细。而通常,在eclipse中创建的servlet中,默认由两个方法,即doGet和doPost,从方法上可以看得出,它们分别处理了http的get和post请求,而在不需要区分get和post时候,可以直接把post放到get中或者反之。由于tomcat中webapp的启动是从应用的web.xml中开始,所以需要在其中指定到相应的servlet,才能正常的处理客户端请求,而如eclipse等ide会在新建servlet文件时把该配置加入到web.xml中。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<description></description>
<display-name>helloworld</display-name>
<servlet-name>helloworld</servlet-name>
<servlet-class>com.ydlx.servlet.helloworld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/helloworld</url-pattern><!--servlet的请求路径,即入口-->
</servlet-mapping>
</web-app>