JSP概述
Servlet是j2ee提供的动态资源开发技术,是以java的程序的形式进行开发,在java中书写HTML标签是一件十分头疼的事情,所以人们开发出了JSP,看起来像是HTML一样,但可以在其中写java代码,本质上是动态web资源。
JSP原理
JSP会在第一次被访问时被翻译成一个Servlet,访问jsp时本质上是这个翻译过来的Servlet在执行。
JSP基本语法
- 模板元素
直接写在jsp页面中的html内容叫做模板元素
会在翻译过来的Servlet中被直接out.write输出到浏览器中
<%@ page import="java.util.Date" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%--这是一个测试页面--%> <%for(int i=0;i<3;i++){%> <font color='red'> <%=new Date().toLocaleString()%> </font> <%}%> </body> </html> |
out.write("<html>\r\n"); out.write("<head>\r\n"); out.write(" <title>Title</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); for(int i=0;i<3;i++){ out.write("\t\t<font color='red'>\r\n"); out.print(new Date().toLocaleString()); out.write("\t </font>\r\n"); } out.write("</body>\r\n"); out.write("</html>\r\n"); |
- 脚本表达式
<%= java表达式%> |
通过脚本表达式可以在jsp页面中编写java表达式
会在翻译过来的Servlet中执行java表达式并将执行结果打印给浏览器
<%@ page import="java.util.Date" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%--这是一个测试页面--%> <%for(int i=0;i<3;i++){%> <font color='red'> <%=new Date().toLocaleString()%> </font> <%}%> </body> </html> |
out.write("<html>\r\n"); out.write("<head>\r\n"); out.write(" <title>Title</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); for(int i=0;i<3;i++){ out.write("\t\t<font color='red'>\r\n"); out.print(new Date().toLocaleString()); out.write("\t </font>\r\n"); } out.write("</body>\r\n"); out.write("</html>\r\n"); |
- 脚本片段
<% 若干java语句 %> |
通过脚本片段可以在jsp页面中编写java语句
页面中可以有若干脚本片段
某个脚本片段java代码可以是不完整的,但整个jsp页面中的脚本片段拼在一起必须是完整的java代码。
在翻译过来的Servlet中,脚本片段被原样复制粘贴到对应位置
<%@ page import="java.util.Date" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%--这是一个测试页面--%> <%for(int i=0;i<3;i++){%> <font color='red'> <%=new Date().toLocaleString()%> </font> <%}%> </body> </html> |
out.write("<html>\r\n"); out.write("<head>\r\n"); out.write(" <title>Title</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); for(int i=0;i<3;i++){ out.write("\t\t<font color='red'>\r\n"); out.print(new Date().toLocaleString()); out.write("\t </font>\r\n"); } out.write("</body>\r\n"); out.write("</html>\r\n"); |
- jsp注释
<%--注释内容--%> |
被jsp注释包裹的内容不会被翻译到servlet中
<%@ page import="java.util.Date" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%--这是一个测试页面--%> <%for(int i=0;i<3;i++){%> <font color='red'> <%=new Date().toLocaleString()%> </font> <%}%> </body> </html> |
out.write("<html>\r\n"); out.write("<head>\r\n"); out.write(" <title>Title</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); for(int i=0;i<3;i++){ out.write("\t\t<font color='red'>\r\n"); out.print(new Date().toLocaleString()); out.write("\t </font>\r\n"); } out.write("</body>\r\n"); out.write("</html>\r\n"); |
JSP指令
jsp指令是用来配置jsp页面特性的标签。
jsp指令包括page指令、include指令、taglib指令
- page指令
<%@ page …%> |
用来通知翻译引擎,如何翻译当前的JSP
其中可以包含如下属性
[ language="java" ] 当前JSP使用的开发语言 [ extends="package.class" ] 当前jsp翻译成servlet后要继承的类,注意此值必须是一个servlet的子类,一般情况下不要改 [ import="{package.class | package.*}, ..." ] 导入需要使用到的包 java.lang.*;javax.servlet.*;javax.servlet.jsp.*;javax.servlet.http.*; [ session="true | false" ] 用来指定当前页面是否使用session,如果设置为true,则翻译过来的servlet中将会有对session对象的引用,于是可以直接在jsp中使用session隐式对象。但是这将导致一旦访问jsp就会调用request.getSession()方法,可能导致不必要的空间浪费。如果确定jsp中不需要session可以设为false [ buffer="none | 8kb | sizekb" ] out隐式对象所使用的缓冲区的大小 [ autoFlush="true | false" ] out隐式对象是否自动刷新缓冲区,默认为true,不需要更改 [ isThreadSafe="true | false" ] 翻译过来的servlet是否实现SingleThreadModel [ errorPage="relative_url" ] 如果页面出错,将要跳转到的页面,除了在jsp中使用此属性指定错误页面外也可以在web.xml中配置整个web应用的错误页面,如果两个都设置则jsp中的此属性起作用 [ isErrorPage="true | false" ] 如果设置此属性为true,翻译过来的servlet中将含有Exception隐式对象,其中封装的就是上一个页面中抛出的异常对象 [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] 和jsp乱码相关的指令,用来指定jsp输出时,设置的Content-Type响应头用来指定浏览器打开的编码 [ pageEncoding="characterSet | ISO-8859-1" ] 服务器翻译jsp时使用的编码集.如果向防止jsp乱码,应该保证文件的保存编码和jsp翻译成servlet用的编码以及输出到浏览器后浏览器打开的编码一致.此属性一旦设置好,翻译引擎会间接帮我们设置content-type属性. [ isELIgnored="true | false" ] 当前页面是否使用el表达式,设置为false时表示启用el,j2ee4.0开始默认支持,j2ee4.0一下做开发时,如果要使用el表达式,需将此属性设置为fals |
- include指令
<%@ include file=""%> |
用来实现页面包含
include指令实现的包含是静态包含,其他方式实现的包含都是动态包含.
静态包含是在jsp翻译成servlet过程中,多个jsp翻译成一个servlet,在源码级别实现了包含
动态包含是各自的jsp翻译成各自的servlet,在访问时,各自的Servlet执行产生各自的输出,将这些输出合成一个输出,是输出级别的包含
静态包含效率更高一些,推荐使用。
- taglib指令
<%@ taglib uri="" prefix=""%> |
用来引入标签库。
九大隐式对象
jsp翻译成Serlvet的过程中,自动创建的9个对象,可以在jsp页面中直接使用
page | this | 当前servlet |
request | HttpServletRequest | 代表请求的对象 |
response | HttpServletResponse | 代表响应的对象 |
config | ServletConfig | 当前Servlet的配置对象 |
application | ServletContext | 代表当前应用的对象 |
session | HttpSession | 代表会话的对象 |
out | resopnse.getWriter() | 代表输出流的对象 |
pageContext | pageContext | 代表jsp页面环境 |
exception | exception | 代表当前jsp页面抛出的异常对象 |
PageContext
pageContext是代表当前jsp页面运行环境的对象。
- 作为入口对象可以获取其他八大隐式对象
getPage()方法返回page隐式对象 getRequest()方法返回request隐式对象 getResponse()方法返回response隐式对象 getServletConfig()方法返回config隐式对象 getServletContext()方法返回application隐式对象 getSession()方法返回session隐式对象 getOut()方法返回out隐式对象 getException()方法返回exception隐式对象 |
- 作为入口对象操作四大作用域
getAttribute(String name,int scope) setAttribute(String name, Object value,int scope) removeAttribute(String name,int scope) 其中pageContext中代表域的常量: PageContext.APPLICATION_SCOPE PageContext.SESSION_SCOPE PageContext.REQUEST_SCOPE PageContext.PAGE_SCOPE findAttribute(String name) 从四大作用域中按照由小到大的顺序搜寻指定名称的域属性,找到就返回,找不到返回null |
- PageContext是一个域对象
操作api
setAttribute(String name,Object obj) | 向域中存入数据 |
getAttribute(String name) | 从域中获取数据 |
removeAttribute(String name) | 删除域中指定数据 |
getAttributeNames() | 获取域中所有属性名组成的枚举 |
- 特点
生命周期: 访问jsp开始时创建,访问jsp结束后销毁
作用范围:当前jsp页面范围
主要功能:在当前jsp页面内共享数据