9.1 JSP基础

一、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所支持的九大隐式对象:

对象描述
requestHttpServletRequest 接口的实例,每当客户端请求一个jsp页面时,jsp引擎会制造一个新的request对象来代表这个请求
responseHttpServletResponse 接口的实例,jsp引擎会制造一个response对象来代表响应。
outJspWriter类的实例,用于把结果输出至网页上
sessionHttpSession类的实例
applicationServletContext类的实例,与应用上下文有关,这个对象在JSP页面的整个生命周期中都代表着这个JSP页面。通过向application中添加属性,则所有组成您web应用的JSP文件都能访问到这些属性。
configServletConfig类的实例,这个对象允许开发者访问Servlet或者JSP引擎的初始化参数,比如文件路径等。
pageContextPageContext类的实例,提供对JSP页面所有对象以及命名空间的访问,其中一个重要的方法就是removeArribute(),它可接受一个或两个参数。
page类似于Java类中的this关键字,这个对象就是页面实例的引用。它可以被看做是整个JSP页面的代表。相当于this
ExceptionException类的对象,代表发生错误的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>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值