开始编写比较复杂的jsp啦。
全称:javaserver pages
在传统的网页HTML文件(.htm,.html)中加入java程序片段(Scriptlet)和jsp标签,就构成了jsp网页。
1、因为可以嵌入java代码,由此具备动态特性。
java程序段可以操纵数据库、重新定向网页以及发送E-mail等,实现建立动态网站所需要的功能。
2、所有程序操作都是在服务器端执行,网络上传送给客户端的仅是得到的结果,这样大大降低了对客户浏览器的要求,即使客户浏览器端并不支持java也可以访问jsp网页。
3、在里面嵌入的标签是<%%>
4、强大的组件(java Bean)支持功能。
比如下面就是在页面循环输出两个你好。
<%
for(;i<2;) {
%>
你好</br>
<%
}
%>
jsp的一般执行过程:接受request后,就先把jsp文件经过jsp parser转换为java文件(即Servlet文件),然后该文件被被jsdk(Servlet分析器)编译成class文件,然后被执行,再response回客户端。执行过程都是在服务器上执行的。
其中 查找jsp文件后还会发生以下检查:jsp是否是修改或创建后的第一次调用。
jsp原始代码包含jsp元素和模板(Template)Data两类。
template data值得是jsp引擎不处理的部分,即<% %>以外的部分。例如代码的HTML部分,这些数据会直接送到客户端。
jsp元素是指<% %>部分。由jsp引擎直接处理,这部分必须符合java语法,否则会出现编译错误。
jsp的语法:
1、编译器指令(directive)
例如<%@page import = "java.io."%>
该指令无论在jsp的哪一个地方,它的作用范围都是整个jsp文件。
编译器指令包含“包含指令”,“页指令”和“taglib指令”
他们包含在<%@ page [import] [pageEncoding]%>卷标里。
两个主要的指令是page与include。
例:import = "java.io."
已经默认import了
java.lang.*
javax.serlet.jsp.*
javax.servlet.http.*
就是jsp中用的request、out等tomcat已经定义好了。内置了的。
taglib指令:
<%@taglib uri = "URITOTagLibrary" prefix="tagPrefix"%>
用于引入定制标签库。
2、脚本语法(scripting)
html注释
(jsp)隐藏注释<%--comments--%>
jsp表达式<%=comments%>
jsp声明:<%!declaration,declaration%>
如:<%! int a = 3;%> 和<% int a = 3;%>这两个是有差别的。转换为servlet后编译的class文件是不一样的哦。
第一句话是把a声明为成员变量额,而第二句话则是把定义 为_jspService方法里面的局部变量。
一般定义为脚本段,而不是声明。。。。比较稳。
因为Servlet是单实例的,单实例的,单实例。。。
包含:<%@include file="相对位置"%>
3、动作语法(Action)
例如<jsp:forwward>,<jsp:getProperty>,<jsp:include>
(1)<jsp: forward page={"relativeURL" | "<%=expression %>" } />
(2)<jsp:param name="paramterName" value="{parameterValue | <%= expression %> }" />
[ <jsp:param...../> ]
page属性是指转到某一个页面中。
page=“value”,value可以i一个表达式或是一个字符串用于说明你将要定向的文件或者URL。这个文件可以是jsp,或者是程序段。
同时在转时,可以发送多个参数。
[ <jsp:param...../> ]
例子:转到forwardto.jsp,并传去参数名为username的值为winney的参数。
<jsp:forward page="forwardto.jsp">
<jsp:param name="username" value="winney" />
</jsp:forward/>
注:转到页面后,原本的那个页面剩下的代码是不会被执行的。因为页面的流程都已经转到另外一个页面里去了。
本质原因: 在jsp被翻译为class文件后的源码是在转页面的代码后直接加一个return语句。
(2)<jsp: include>
包含一个静态或者动态文件
<jsp:include page="{relativeURL |<%=expression%>}" flush="true" />
<jsp:include page="{relativeURL |<%=expression%>}" flush="true" />
<jsp: param name="parameterName" value="{parameterValue} | <%= expression %/>" />
[<jsp: param.../>]指可以有多个“<jsp:param/>”标记、
param可以将参数传到被包含的静态或者动态文件中。
关于servlet:
Servlet的框架是由两个java包组成的:
javax.servlet包:定义了所有的Servlet类都必须实现或拓展的通用接口类。
javax.servlet.http包:定义了采用HTTP协议通信的HttpServlet类。
每一个servlet都必须实现javax.servlet.Servlet接口,GenericServlet是个通用的,不特定于任何协议的Servlet,它实现了Servlet接口,而HttpServlet继承于GenericServlet,因此HttpServlet也实现了servlet接口,因此我们定义的servlet只需要继承HttpServlet父类即可。
Servlet接口中定义了service方法,HttpServlet对该方法进行实现:
将servletRequest和ServletReaponse转换为HttpServletRequest和HttpServletResponse。
转换完毕后,会调用HttpServlet自己定义的service方法;
在service方法中,首先获得请求方法名,然后根据方法名调用对应的Do方法。
在HttpServlet类中调用的doGet、doPost方法都是返回错误信息,所以我们自定义的servlet要override HttpServlet里面的doGet、doPost方法。
Servlet的启动:
在下列时刻Servlet容器装载Servlet:
--Servlet容器启动时自动装载某些Servlet
--在Servlet容器启动后,客户首次向Servlet发出请求
--Servlet的类文件被更新后,重新装载Servlet
Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期中,init方法只会被调用一次。