JSP技术简介
JSP是Java Server Page的缩写,它是Servlet的扩展,它的作用是简化网站的创建和维护。
JSP是HTML代码与Java代码的混合体。
JSP文件通常以JSP或JSPX的扩展名。
JSP拥有自己的语法。
JSP形式上像HTML,但本质上是Servlet。
JSP的出现,使得将Web开发中的HTML与业务逻辑代码有效分离成为可能。通常JSP只负责生成动态的HTML文档,而业务逻辑由其他Java组件如JavaBean来实现。JSP可以通过Scriptlet来访问这些组件。
< % %>
ContentType与pageEncoding的区别:
pageEncoding是jsp文件本身的编码 ,把jsp文件编译成java的时候给编译器用的 。
contentType的charset是指服务器发送给客户端时的内容编码 ,是浏览器解析网页的时候用的
如果两个任意设置了其中一个,另一个即会与此保持一致。但,contentType除可以设置charset外,还可以设置MIME类型,如text/html
Tomcat首次访问JSP的过程:
当浏览器(客户端)首次请求时,如果没有此jsp对应的servlet的class文件,tomcat会把jsp文件翻译成servlet源文件.java,再编译成servlet的.class文件,把.class 文件发送给浏览器,让浏览器解析.class文件。如果有,就调用。
容器按照以下顺序处理JSP请求
1、查找与JSP文件对应的Servlet,如果已经存在,就调用它的服务方法。
2、如果与JSP对应的Servlet不存在,就解析文件系统中的JSP文件,将它翻译成Servlet源文件,接着把Servlet源文件编译成Servlet类,然后再去初始化并运行Servle。
下是经过翻译的JSP文件,可见在它的服务方法中存在以下对像
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;
JSP语法:
SP指令 < %@ 指令名 属性=“值”%>
JSP声明 成员变量,或是成员方法。<%! …. %>
Java程序片段 不论有多少这样的代码块,都将包含_jspSerivice方法中。<% … %>
Java表达式 快速输出信息. _jspSerivice。<%= …%>
JSP隐含对像 pageContext.request,response,session,confing,application
JSP指令-page:
语法:<%@ 指令名 属性=“值”%>
Page指令-用于指定所使用的语言,及导入的包。
属性说明:
language – 示例:language=“java”
import -如: (注意多个引用之间使用逗号分开。)
<%@ page import=“java.util.,java.sql.”%> contentType – 指定响应结果的MIME类型。默认为text/html;charset=ISO-8859-1
session = true | false –指定jsp页面是否使用session.
errorPage = url – 指定当发生异常时转发到哪一个页面。
isErrorPage = true|false, - 表示此页是处理异常的页面。
pageEncoding – 设置页面的编码方式,此编码方式,会自动应用到contentType中的charset上,如果没有设置content-Type的话。显示时以content-Type为准。建议这两个值应该设置一个或至少应该一致。建议设置content-Type
buffer = none | 8kb | sizeb – 设置页面缓冲区大小。-建议不要修改此值。
JSP指令-taglib—标签库:
taglib指令,用于在页面上声明要使用的自定义标签。
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c”%>
uri – 指定自定义的标签的引用URI。
Prefix-指定使用时的前缀。
如:
此内容将在讲自定义标签时具体讲。
JSTL :java Standard Tag Lib
URL – 统一资源定位符
URI – 统一资源标识符.—XML namespace=“http://hncu.cn”
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" import="java.util.*,java.awt.*" errorPage="jsps/error.jsp" pageEncoding="UTF-8"%>
<!-- jsp中的导报:1.import 2.","+包 -->
<!-- isErrorPage="true":错误页面 -->
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>JSP技术演示</title>
</head>
<body>
<h2>这是主页</h2>
cForEach:<c:forEach begin="0" end="10">
这里相当于for循环...<br/>
</c:forEach>
<%
for(int i=3;i<10;i++){ //注意JSP表达式不能用;号结束
%>
<%=i %><br/>
<%
}
%>
<%//JSP的Java程序片段和JSP表达式:
//可以声明多个Java片段,它们都位于_jspService方法中。
int a=100;
out.println(a+"<br/>");//JspWriter
//jsp八个隐藏对象--用PageContext()可以获取
Button b=new Button("测试导报");//在page指令中import属性添加,java.awt.*
Date d=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time=sdf.format(d);
out.println(time+"<br/>");
//JSP中的局部变量---在底层函数 _jspService()内都有效
String str="湖南城院";
//错--底层函数_jspService()内不可嵌套函数
//void hello(){
//}
//pageContext.setAttribute("name", "page1111");
//request.setAttribute("name", "req22222");
//session.setAttribute("name", "session33333");
application.setAttribute("name", "app44444");
%>
<%!//JSP声明
//声明函数或者变量,JSP中的成员变量或方法----在index_jsp.java中和 _jspService()并列的方法
//语法:
int t=1;
String hello(){
return "hello";
}
//可以声明静态变量,也可以声明静态方法。可以多个JSP声明的代码块。
%>
<%out.println("out.println_str:"+str+"<br/>");//在底层函数 _jspService()内访问它的的局部变量
out.println("out.println_hello():"+hello()+"<br/>");//在底层函数 _jspService()内访问它的的成员变量
//依次从pageContext开始request,session,application,从小到大寻找一个name属性的值
String name=(String)pageContext.findAttribute("name");
out.println("out.println_name:"+name+"--pageContext.,request,session,application中之一的name属性值<br/>");
String name2=(String)pageContext.findAttribute("name2");
out.println("out.println_name2:"+name2+"<br/>");//null
%>
$_name:${name}--pageContext.,request,session,application中之一的name属性值<br/><!-- el表达式 -->
$_name2:${name2}若4个容器中都不存在该属性,什么也不输出(不会输出null)<br/><!-- 若4个容器中都不存在该属性,什么也不输出(不会输出null) -->
<!-- 快速输出, 小细节: %=两者紧挨着,结尾处不要添加";"号 -->
<%="快速输出str:"+str+"<br/>" %>
<%="快速输出hello():"+hello()+"<br/>" %>
<%="快速输出name:"+name+"<br/>" %>
<%="快速输出name2:"+name2+"<br/>" %><!-- 输出null -->
<% //exception.getStackTrace();//必须在page指令中添加属性isErrorPage="true"
//使用exception,必须在Page指令中添加属性:isErrorPage="true"
%>
<%
//以下用于测试erroPage属性
//int i = 100/0;
%>
</body>
</html>
<%@ page session="false" language="java" import="java.util.*,java.awt.*" isErrorPage="true" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>错误...</title>
</head>
<body>
<h1>这是错误页面</h1>
<%
out.println(exception);
//session.getAttribute("aa");
%>
</body>
</html>