前面讲了servlet入门实践如今开始介绍jsp入门实践,开发环境的搭建请参考我前面的tomcat的文章,jsp入门教程分为上下两部分,第一部分简单讲解:jsp语法的规范,以及三大编译指令,七个动做指令和九大内置对象,生命周期讲解等。html
所有代码下载:连接java
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1] 是由Sun Microsystems公司倡导、许多公司参与一块儿创建的一种动态网页技术标准。JSP技术有点相似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而造成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其余操做系统上运行。
第一个jsp程序:web
<%@ 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>Insert title here</title> </head> <body> <% out.print("hello peace"); %> </body> </html>
脚本程序,就是为了在HTML中穿插java代码,能够包含任意语法真确的java语句,变量,方法或表达式。生成servlet源码时该处的代码被放到_jspService()方法中apache
<% out.print("hello peace"); %>
<% for(int i=0;i<5;i++) { out.print("hello peace"+i); %> <br/> <% out.print("换行符穿插在中间了,同样会被循环输出"); }//for循环结束 %>
一个声明语句能够声明一个或多个变量、方法,供后面的Java代码使用。在JSP文件中,您必须先声明这些变量和方法而后才能使用它们。生成servlet源码时该处的代码成为类的属性和方法;浏览器
<%! private int i=10; %> <%! public void test(){ int a=0; int b=2; a=a+b; System.out.print(a); } %>
一个JSP表达式中包含的脚本语言表达式,先被转化成String,而后插入到表达式出现的地方,做用至关于脚本中的out(输出)
因为表达式的值会被转化成String,因此您能够在一个文本行中使用表达式而不用去管它是不是HTML标签。
表达式元素中能够包含任何符合Java语言规范的表达式,可是不能使用分号来结束表达式。
生成servlet源码时该处的代码被放到_jspService()方法中缓存
<%--在脚本处声明的变量是局部变量不能带有修饰符 --%> <% String nick="sisi"; int a=10,b=10; %> 3.jsp表达式:<br/> <%--表达式能够输出至关于out.write 不须要分号结束--%> <%=(a-b) %> <%=nick %> <hr/>
JSP注释不会出如今html的源码中 能够用来注释jsp的代码,html注释会出如今html的源码中;tomcat
1.jsp注释:<br/> <%-- 这些注释不会出如今html的源码中 能够用来注释jsp的代码--%>
JSP编译指令用来设置与整个JSP页面相关的属性;
主要有三大编译指令:服务器
<%@ page ... %> 定义页面的依赖属性,好比脚本语言、error页面、缓存需求等等 <%@ include ... %> 包含其余文件 <%@ taglib ... %> 引入标签库的定义,能够是自定义标签
Page指令为容器提供当前页面的使用说明。一个JSP页面能够包含多个page指令。session
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.Random"%>
JSP能够经过include指令来包含其余文件。被包含的文件能够是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。app
<%-- 1.原理是把被包含的页面(header.jsp) 的内容翻译到包含页面(index.jsp)中,合并成翻译成一个java源文件, 再编译运行!!,这种包含叫静态包含(源码包含) 2.被包含页面中不须要出现全局的html标签了!!! (如html、head、body)--%> <%@include file="/common/header.jsp"%>
JSP API容许用户自定义标签,一个自定义标签库就是自定义标签的集合。Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
本身定义的标签库 <%@ taglib uri="http://rlovep.com" prefix="rlovep" %>
动做指令与编译指令不一样,编译指令时通知servlet引擎的处理消息,而动做指令只是运行时的动做。编译指令在将JSP编译成Servlet时起做用,而处理指令一般可替换成JSP脚本,它只是JSP脚本的标准化写法。
(1)JSP:forward 执行页面转向,将请求的处理转发到下一个页面。
(2)JSP:param 用于传递参数,必须与其余支持参数的标签一块儿使用
(3)JSP:include 用于动态引入一个JSP页面
(4)JSP:plugin 用于下载JavaBean或者Applet到客户端执行
(5) JSP:useBean 建立一个Javabean实例
(6) JSP:setProperty 设置JavaBean实例的属性值
(7)JSP:getProperty 获取JavaBean实例的属性值
jsp:forward动做把请求转到另外的页面。jsp:forward标记只有一个属性page。
<%--转发 jsp:foward 参数 jsp:param <jsp:forward page="/action2.jsp"> <jsp:param value="peace" name="name"/> <jsp:param value="123456" name="pass"/> </jsp:forward> --%>
jsp:include>动做元素用来包含静态和动态的文件。该动做把指定文件插入正在生成的页面
<%--动态包括 --%> 动态包括: <jsp:include page="/common/header1.jsp"> <jsp:param value="lucc" name="name"/> </jsp:include>
这三个指令都是与JavaBean相关的指令,其中userBean指令用于在JSP页面中初始化一个java实例,setProperty指令用于为JavaBean实例的属性设置值;getProperty指令用于输出JavaBean实例的属性。
<%--useBean setProperty getProperty --%> <%--建立Student的实例 实例名称为student 属性范围为page --%> <hr/> <jsp:useBean id="student" class="com.rlovep.entity.Student" scope="page"/> <%--设置student的name值 --%> <jsp:setProperty name="student" property="name" value="peace"/> <%--输出 student的name值--%> name:<jsp:getProperty name="student" property="name" />
param用于设置参数值,这个指令自己不能单独使用,所以单独的param指令没有实际意义,param指令能够与如下指令结合使用
jsp:include jsp:forward jsp:plugin。使用方法上面已经介绍;
plugin指令主要用于下载服务器端的JavaBean或Applet到到客户端执行,因为程序在客户端执行,所以客户端必须安装虚拟机。该指令用处较少,不作介绍;
须要创建,action.jsp本文件,以级转发页面action2.jsp,被包含页面/common/header1.jsp,JavaBean:Student类
<%--转发 jsp:foward 参数 jsp:param <jsp:forward page="/action2.jsp"> <jsp:param value="peace" name="name"/> <jsp:param value="123456" name="pass"/> </jsp:forward> --%> <%--动态包括 --%> 动态包括: <jsp:include page="/common/header1.jsp"> <jsp:param value="lucc" name="name"/> </jsp:include> <%--useBean setProperty getProperty --%> <%--建立Student的实例 实例名称为student 属性范围为page --%> <hr/> <jsp:useBean id="student" class="com.rlovep.entity.Student" scope="page"/> <%--设置student的name值 --%> <jsp:setProperty name="student" property="name" value="peace"/> <%--输出 student的name值--%> name:<jsp:getProperty name="student" property="name" />
JSP脚本中包含9个内置对象,这9个内置对象都是Servlet API接口的实例,只是JSP规范对他们默认进行了初始化(由JSP页面对应的Servlet的_jspService()方法来建立这些实例)。也就是它们已是对象,能够直接使用。
JSP初始化该9个对象的地方能够经过生成的servlet类看到以下:
request、response两个对象是_jspService()方法的形参,当Tomcat调用该方法时会初始化这两个对象。而page、pageContext、application、config、session、out都是_jspService()方法的局部变量,由该方法完成初始化。
<%@ 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>Insert title here</title> </head> <body> <%--out对象:对应jspwriter --%> <% /* for(int i=0;i<=1024;i++){ out.write("a"); } System.out.println("当前缓存区大小:"+out.getBufferSize()); System.out.println("剩余缓存区大小:"+out.getRemaining()); */ //若是不刷新则,123先输出; //out.flush(); response.getWriter().write("123"); %> <%-- application对象:对应servlet中的context 存储的属性,是整个应用共享的;一样能够得到配置参数; --%> <% //存储属性 application.setAttribute("name", "peace"); %> <%=application.getInitParameter("keys") %> <%-- config对象:对应servlet中的config 用处不是很大 --%> <%=config.getServletName() %> <%-- exception对象:在错误页面中有效,能够得到异常属性 亲发生错误:该对象只有当编译指令page的isErrorPage="true"才有效 <%=exception.getMessage() %> --%> <%-- request对象:对应servlet中的request --%> <%=request.getLocalName() %> <%-- response对象:对应servlet中的response --%> <% response.getWriter().println("hello respose"); %> <%-- session对象:对应servlet中的session --%> <% session.setAttribute("pass", "567"); %> <%-- pagecontext对象:jsp的页面对象 能够得到其余八个对象: --%> <% //得到其余对象 response.getWriter().write("是否相等?"+(out==pageContext.getOut())+"<br/>"); %> <%--能够往不一样的域中存对象 --%> <% pageContext.setAttribute("message", "wang"); pageContext.setAttribute("age", "22", PageContext.REQUEST_SCOPE); pageContext.setAttribute("qq", "374126165", pageContext.SESSION_SCOPE); pageContext.setAttribute("tl","1881679",pageContext.APPLICATION_SCOPE); //重定向到另外一个页面取得数据: response.sendRedirect(request.getContextPath()+"/pageget.jsp"); //删除存储的对象 pageContext.removeAttribute("age",PageContext.REQUEST_SCOPE ); %> </body> </html>
理解JSP底层功能的关键就是去理解它们所遵照的生命周期。JSP生命周期就是从建立到销毁的整个过程,相似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet。
访问:http://localhost:8080/工程名/NewFile.jsp
第一次访问jsp:走(1)(2)(3)(4)
以后的访问:走(4)
注意:jsp文件修改了或jsp的临时文件被删除了,要从新走翻译(1)和编译(2)的过程
<%! public void jspInit(){ initVar++; System.out.println("jspInit(): JSP被初始化了"+initVar+"次"); } %>
<%! public void jspDestroy(){ destroyVar++; System.out.println("jspDestroy(): JSP被销毁了"+destroyVar+"次"); } %>
Servlet的生命周期: 1)构造方法(第1次访问) 2)init方法(第1次访问) 3)service方法 4)destroy方法 Jsp的生命周期: 1)翻译: jsp->java文件 2)编译: java文件->class文件(servlet程序) 3)构造方法(第1次访问) 4)init方法(第1次访问):_jspInit() 5)service方法:_jspService() 6)destroy方法:_jspDestroy()
<%@ 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>Insert title here</title> </head> <body> <%! //记录执行次数: private int initVar=0; private int serviceVar=0; private int destroyVar=0; %> <%! public void jspInit(){ initVar++; System.out.println("jspInit(): JSP被初始化了"+initVar+"次"); } public void jspDestroy(){ destroyVar++; System.out.println("jspDestroy(): JSP被销毁了"+destroyVar+"次"); } %> <% serviceVar++;// System.out.println("_jspService(): JSP共响应了"+serviceVar+"次请求"); //对各个的执行次数计数 String content1="初始化次数 : "+initVar; String content2="响应客户请求次数 : "+serviceVar; String content3="销毁次数 : "+destroyVar; %> <%-- 输出显示 --%> <h1><%=content1 %></h1> <h1><%=content2 %></h1> <h1><%=content3 %></h1> </body> </html>
显示以下:
来自一条小鲨鱼wpeace(rlovep.com)