1,什么是jsp?
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
浏览器向服务器发请求,不管访问的是什么资源,其实都是在访问Servlet,也就是说,我们在访问jsp的时候,其实也是在访问一个servlet。换句话说,servlet容器会把一个jsp转化成servlet。
2,容器如何把jsp变成一个servlet?
容器拿到你在jsp中写的代码,把这些代码转换为一个servlet类(.java)源文件,然后再把这个源文件编译成java servlet类。在此之后,这就是名副其实的servlet了,换句话说,之后容器会加载servlet类,对其实例化并初始化,为每个请求建立一个单独的线程,并调用servlet的service()方法。
3,你的jsp代码在最后的servlet类中扮演什么角色?
3.1jsp的基本元素
A:模板文本
B:jsp脚本片段
C:jsp表达式
D:jsp声明
E:jsp注释
3.2用示例来说话
需求:统计jsp页面被访问的次数。
代码示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsp 入门介绍</title>
</head>
<body>
<%! int total = 0; //total 是用来统计jsp页面被访问的次数 %> <!-- 这是jsp声明 -->
<% total++; %> <!-- 这是jsp脚本片段 -->
页面访问次数:<%= total %> <!-- 这是jsp表达式 -->
</body>
</html>
生成的servlet类源文件:
package org.apache.jsp.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
int total = 0; //total 是用来统计jsp页面被访问的次数
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
private static java.util.List _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.AnnotationProcessor _jsp_annotationprocessor;
public Object getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
}
public void _jspDestroy() {
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
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("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
out.write("<title>jsp 入门介绍</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\t");
out.write(" <!-- 这是jsp声明 -->\r\n");
out.write("\t");
total++;
out.write("\t<!-- 这是jsp脚本片段 -->\r\n");
out.write("\t页面访问次数:");
out.print( total );
out.write("\t<!-- 这是jsp表达式 -->\r\n");
out.write("</body>\r\n");
out.write("</html>");
} 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);
}
}
}
页面显示的源代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsp 入门介绍</title>
</head>
<body>
<!-- 这是jsp声明 -->
<!-- 这是jsp脚本片段 -->
页面访问次数:8 <!-- 这是jsp表达式 -->
</body>
</html>
3.3通过这三段代码来分析jsp元素的语法以及这些元素在转换成的servlet类中所扮演的角色
A:模板文本
jsp模板文本就是html内容
B:jsp脚本片段
语法:<% java代码 %>
通过上面的代码可以看出,jsp脚本片段最终被放在service()方法中。也就可以得出如下结论:
1,在jsp脚本片段中定义的变量都是局部变量;
2,可以在jsp脚本片段中定义变量,书写语句,但是不能定义函数;
3,因为是定义变量,书写java语句,所以每行java代码需要加分号;
C:jsp表达式
语法:<%= 要输出的内容 %>通过上面的代码可以看出,jsp表达式最终被放在service()方法中。也就可以得出如下结论:
1,要输出的内容将会成为out.print( )的参数;
2,因为最终会成为out.print( )的参数,所以不能加分号;
D:jsp声明
语法:<%! java代码 %>通过上面的代码可以看出,jsp声明最终被放在service()方法之外,类声明的下面。也就可以得出如下结论:
1,在jsp声明中定义的变量和函数会成为类的成员变量和成员函数,当然也包括静态成员变量和静态成员函数;
E:jsp注释
语法:jsp注释<!-- -->或java的注释//和/* */两种注释的区别:
1,采用jsp注释,当人在页面上点击查看源代码的时候,可以查看到注释;
2,采用java注释,当人在页面上点击查看源代码的时候,查看不到注释;