一、jsp与html区别:
jsp为动态网页,除了想html一样可以使用css,html,js外,还可以内置java。一般与servlet类一起合作使用。而且jsp出现在servlet之后。
html网页一般为静态的网页。
jsp其实是要转化成servlet.java类的,其实就是把jsp中一些语句在类中使用println表示出来,然后servlet产生html格式并内嵌于html response中传回浏览器。这样虽然jsp是动态的网页,但是web服务器以静态的html网页形式返回到浏览器。
因为存在从jsp转化成servlet类,所以需要一个jsp引擎(或者称为jsp容器)。web服务器一般会内置这个引擎(apache)。
二、jsp生命周期:
1. jsp编译
当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。
编译的过程包括三个步骤:
- 解析JSP文件。
- 将JSP文件转为servlet。
- 编译servlet。
2. jsp初始化
像一般的servlet一样,jsp在jspInit()函数中初始化servlet类。一般在该方法中初始化数据库连接、打开文件、创建查询表。
3. jsp执行
在void _jspService(HttpServletRequest request, HttpServletResponse response)函数中执行一切与请求相关的交互行为。并产生一个response返回给浏览器。如果在jsp中没有函数名,就写代码,好像就是写在这个函数中。
4. jsp清理
jsp清理发生在当一个jsp网页从容器中被移除时。调用jspDestroy()方法,在该方法中释放数据库连接,关闭文件夹等。
三、语法:
1. 脚本程序:
<%代码片段%>
或者
<jsp:scriptlet> 代码片段 </jsp:scriptlet>
2. 声明:
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
或者
<jsp:declaration> 代码片段 </jsp:declaration>
3. 表达式(字符串):
<%= 表达式 %>
或者
<jsp:expression> 表达式 </jsp:expression>
4. 注释:
<%-- 注释 --%> | JSP注释,注释内容不会被发送至浏览器甚至不会被编译 |
<!-- 注释 --> | HTML注释,通过浏览器查看网页源代码时可以看见注释内容 |
四、指令:
1. page指令:定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
属性 | 描述 |
---|---|
buffer | 指定out对象使用缓冲区的大小 |
autoFlush | 控制out对象的 缓存区 |
contentType | 指定当前JSP页面的MIME类型和字符编码 |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
extends | 指定servlet从哪一个类继承 |
import | 导入要使用的Java类 |
info | 定义JSP页面的描述信息 |
isThreadSafe | 指定对JSP页面的访问是否为线程安全 |
language | 定义JSP页面所用的脚本语言,默认是Java |
session | 指定JSP页面是否使用session |
isELIgnored | 指定是否执行EL表达式 |
isScriptingEnabled | 确定脚本元素能否被使用 |
2. include指令:包含其他文件,被包含的文件可以是JSP文件、HTML文件或文本文件。语法格式:
<%@ include file="文件相对 url 地址" %>
3. taglib指令:
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
Taglib指令的语法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。
五、动作元素:
jsp动作元素在请求处理阶段起作用。JSP动作元素是用XML语法写成的。
利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。
基本语法为:<jsp:action_name attribute="value" />
其中action_name可以为:
语法 | 描述 |
---|---|
jsp:include |
在页面被请求的时候引入一个文件。而include指令是在被转换成servlet时引入文件。 <jsp:include page="date.jsp" flush="true" /> |
jsp:useBean |
寻找或者实例化一个JavaBean(其实就是一个符合一定准则的java类)。使用JavaBean来使界面与逻辑分开。 <jsp:useBean id="myObjName" class="package.class" /> |
jsp:setProperty |
设置JavaBean的属性。可以使用这个动作元素设置属性的前提是JavaBean中提供了该属性的公开set方法,下同。该语句写在useBean动作语句内部则只有新建对象时才会起作用。写在外面,则不管是新建还是找到都会起作用。 <jsp:setProperty name="myObjName" property="someProperty" value="newValue" .../> |
jsp:getProperty | 输出某个JavaBean的属性。 |
jsp:forward |
把请求转到一个新的页面。 <jsp:forward page="date.jsp" /> |
jsp:plugin | 根据浏览器的类型,插入通过Java插件 运行Java Applet所必需的OBJECT或EMBED元素。 |
jsp:element | 定义动态XML元素 |
jsp:attribute | 设置动态定义的XML元素属性。 |
jsp:body | 设置动态定义的XML元素内容。 |
jsp:text | 在JSP页面和文档中使用写入文本的模板 |
其中<jsp:element> 、 <jsp:attribute>、 <jsp:body>动作元素的实例:
<jsp:element name="xmlElement">
<jsp:attribute name="xmlElementAttr"> 属性值 </jsp:attribute>
<jsp:body> XML 元素的主体 </jsp:body> </jsp:element>
在浏览器上输出为:
<xmlElement xmlElementAttr="属性值">
XML元素的主体
</<xmlElement>
所有的动作要素都有两个属性:id属性和scope属性。
- id属性:
id属性是动作元素的唯一标识,可以在JSP页面中引用。动作元素创建的id值可以通过PageContext来调用。
- scope属性:
该属性用于识别动作元素的生命周期。 id属性和scope属性有直接关系,scope属性定义了相关联id对象的寿命。 scope属性有四个可能的值: (a) page, (b)request, (c)session, 和 (d) application。
六、隐式对象:
JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。
JSP所支持的九大隐式对象:
对象 | 描述 |
---|---|
request | HttpServletRequest 接口的实例,每当客户端请求一个jsp页面时,jsp引擎会制造一个新的request对象来代表这个请求 |
response | HttpServletResponse 接口的实例,jsp引擎会制造一个response对象来代表响应。 |
out | JspWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关,这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。 |
config | ServletConfig类的实例,这个对象允许开发者访问Servlet或者JSP引擎的初始化参数,比如文件路径等。 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问,其中一个重要的方法就是removeArribute(),它可接受一个或两个参数。 |
page | 类似于Java类中的this关键字,这个对象就是页面实例的引用。它可以被看做是整个JSP页面的代表。相当于this |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
七、其他
1. 网页重定向:
response.sendRedirect(String location)
相当于:
String site = "http://www.runoob.com" ;
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);
2. 自动刷新:
response.setIntHeader("Refresh", 5);
3. 其他的http请求与响应、表单处理、过滤器、Cookie处理、Session、文件上传、日期处理、点击量统计、发送邮件都与servlet基本一致。
4. 另外:
是返回的页面,网址上有没有值的区别
查询数据库很可能也是返回一个枚举,所以可以用hasNext来遍历查询结果。
request.getParameterNames();只会返回复选框中被选中的元素枚举。
5.最后,异常处理
一般要为异常单独写一个网页,在这个网页中提供异常的信息。
在page指令中指定异常显示页面,如果在当前页面出现了什么异常,则转导异常页面:
<%@ page errorPage="ShowError.jsp" %>
在会抛出异常的地方写
throw new RuntimeException("Error condition!!!");
相应地,异常接收页面要写自己是一个异常显示页面:
<%@ page isErrorPage="true" %>
比较严谨的异常显示页面要使用jstl的核心标签与EL表达式显示异常的一些信息:
${pageContext.errorData.requestURI}
<c:forEach var="trace" items="${pageContext.exception.stackTrace}">
<p>${trace}</p>