JavaWeb笔记之第三章JSP技术

第三章 JSP技术基础

JSP和Servlet的关系(简介明了)

  • JSP:在HTML页面嵌套Java(HTML页面的JavaScript虽然也可以实现 Java的一些操作,但是JavaScript和Java半毛钱关系也没有)
  • Servlet:在Java中嵌套HTML

3.1JSP语法基础

JSP页面元素
声明----------- <%! %>
小脚本----------- <% %>
表达式----------- <%= %> 注意此处的%和=之间不能有空格
指令----------- <%@ %>
指令----------- <%@ %>
动作----------- <jsp:动作名 />
EL表达式--------------${applicationScope.email}
注释----------------------<%-- --%>

3.1.1 JSP脚本元素

三种脚本元素(scripting elements):声明、小脚本、表达式

  1. JSP声明
<%!LocalDate date = null; %>

声明的变量仅在页面第一次载入时有容器初始化一次,初始化后在后面的请求中一直保持该值
example:
<% int x = 3; %>
<% int x = 3; %>

注:每个变量的声明语句必须以分号结束

  1. JSP小脚本
<%
	data = LocalDate.now();//创建一个LocalDate对象
%>

小脚本在每次访问页面时都被执行,因此date变量在每次请求时会返回当前日期。

注:在小脚本中的代码必须时合法的Java语言代码,注意每条语句都要以分号结束;不能在小脚本中声明方法,因为在Java语言中不能在方法中定义方法。

  1. JSP表达式
<%= date.toString() %>

在页面每次被访问时都要计算表达式,然后将其值嵌入到HTML的输出中。

注:表达式不能以分号结束。(特殊)

3.1.2 JSP指令

指令(directive)向容器提供关于JSP页面的总体信息。
三种类型:page指令、include指令和taglib指令。

<%@ page attribute-list %>
<%@ include attribute-list %>
<%@ taglib attribute-list %>
  1. page指令
    page指令通知容器关于JSP页面的总体特性。
<%@ 
	page contentType="text/html;cahrset=UTF-8"
%>//通知容器页面输出的内容类型和使用的字符集
  • include指令
    include指令实现把另一个文件(HTML、JSP等)的内容包含到当前页面中
<%@ include file="copyright.html" %>//把copyright.html的内容包含到当前页面中
  • taglib指令
    taglib指令用来指定在JSP页面中使用标准标签或自定义标签的前缀与标签库的URI。
<%@ taglib prefix="demo" uri="/WEB-INF/mytaglib.tld" %>

注:

  • 标签名、属性名及属性值都是大小写敏感的。
  • 属性值必须使用一对单引号或者双引号括起来。
  • 在等号(=)与值之间不能有空格

3.1.3 JSP动作

动作(actions)是页面发给容器的命令,它指示容器在页面执行期间完成某种任务。

<prefix:actionName attribute-list />
//动作是一种标签,在动作标签中,prefix为前缀名,actionName为动作名,attribute-list表示针对该动作的一个或者多个属性/值对。

在JSP页面中可以使用三种动作:JSP标准动作,标准标签库(JSTL)中的动作和用户自定义动作。

<jsp:include page="copyright.jsp"/>//指示容器把另一个JSP页面copyright.jsp的输出包含在当前jsp页面的输出中

常用的JSP标准动作:

  • jsp:include,在当前页面中包含另一个页面的输出
  • jsp:forward,将请求转发到指定的页面
  • jsp:useBean,查找或创建一个JavaBeans对象
  • jsp:setProperty,设置JavaBeans对象的属性值
  • jsp:getProperty,返回JavaBeans对象的属性值
  • jsp:plugin,在JSP页面中嵌入一个插件(如Applet)

3.1.4 表达式语言

表达式语言(Expression Language,EL)是JSP2.0新增加的特性,它是一种可以在JSP页面中使用的简洁的数据访问语言。

//格式如下:
${expression}
${param.username}//该EL显示请求参数username的值

3.1.5 JSP注释

<%-- 这是JSP的注释内容 --%>
在小脚本中也可以
<% //Java注释 %>
在HTML中使用
<!-- html注释 -->

3.2 JSP页面的生命周期

生命周期阶段(life-cycle-phases)

3.2.1 JSP页面实现类

JSP页面从结构上看与HTML页面类似,但它实际上是作为Servlet运行的 。

  1. 当JSP页面第一次被访问时,Web容器解析JSP文件并将其转换成相应的Java文件
  2. 该文件声明了一个Servlet类,该类成为页面实现类
  3. Web容器编译该类并将其装入内存
  4. 然后与其他Servlet一样执行将其输出结果发送到客户端 JSP页面的生命周期方法
public void jspInit();
public void jspService(HttpServletRequest request,
									HttpServletResponse response)
									throws ServletException,IOException;
public void jspDestroy();

注:这三个方法分别等价于Servlet的init()、service()和destroy()方法

3.2.2 JSP页面执行过程

  1. 页面转换
  2. 页面编译
  3. 加载和创建实例
  4. 调用jspInit()
  5. 调用_jspService() 这个方法不能被覆盖
  6. 调用jspDestroy()

3.3 JSP脚本元素

3.3.1 变量的声明及顺序

1.声明的顺序

在JSP声明中定义的变量和方法都转换成页面实现类的成员因此它们在页面中出现的顺序无关紧要
JSP声明中的变量和方法时成员变量和成员方法

2.小脚本的顺序
由于小脚本被转换成页面实现类的_jspService()方法的一部分,因此小脚本中声明的变量成为该方法的局部变量,故它们出现的顺序很重要

3.变量的初始化

  • 在Java语言中,实例变量被自动初始化为默认值,(成员变量)
  • 而局部变量使用之前必须明确赋值。(局部变量)
  • 在JSP声明中声明的变量被初始化为默认值;(成员变量)
  • 而在JSP小脚本中声明的变量使用之前必须明确初始化。(局部变量)

3.3.2 使用条件和循环语句

<% 
	//使用条件语句,与Java语法相同
	boolean isLogin = false;
	isLogin = (Boolean)request.getAttribute("isLogin");
	if(isLogin){
		out.print("<h3>欢迎您访问该页面!</h3>");
	}else{
		our.print("您还没有登录!");
		out.print("<a href='login.html'>登录</a>");
	}
%>
	//使用循环语句,与Java语法相同
<%@page contentType = "text/html;charset=UTF-8" %>
<html>
<head><title>计算素数</title></head>
<body>
<%
	for(int n = 2; n < 100; n++){
		int i ;
		for (i = 2;i < n; i++){
			if(n % i == 0)
				break;
		}
		if(i==n){
%>
	<%=n %>&nbsp;&nbsp;
<%			
		}
	}	
%>
</body>
</html>

3.3.3 请求时属性表达式

JSP表达式并不总是输出到页面中,它们也可以传递给JSP动作的属性

<%! String pageURL = "copyright.jsp"; %>
<jsp:include page="<%=pageURL %>" />

注:请求时属性表达式不能用在指令的属性中,因为指令具有转换时的语义,即容器仅在页面转换期间使用。
如果写成<%@include file="<%=pageURL%>" %>,此时的表达式将不起作用。

3.4 JSP隐含变量

隐含变量说明
application引用Web应用程序上下文
session引用用户会话
request引用页面的当前请求对象
response用来向客户发送一个响应
out引用页面输出流
page引用页面的Servlet实例
pageContext引用页面上下文
config引用Servlet的配置对象
exception用来处理错误

3.4.1 request与response变量

request和response分别是HttpServletRequest和HttpServletResponse类型的隐含变量,
在JSP页面中使用和Servlet中使用完全一样,用来分析请求和发送响应。

<%
	String uri = request.getRequestURL();
	response.setContent("text/html;charset =UTF-8");
%>
请求方法为:<%=request.getMethod() %>

3.4.2 out变量

<% out.print("Hello World!"); %>
或者
<%="Hello user!" %>

3.4.3 application变量

<%=application.getAttribute("today") %>

3.4.4 session变量

<%@page session = "false"%>
<html><body>
	会话ID = <% = session.getId() %>
</body></html>

3.4.5 config变量

<%=config.getInitParameter("conpany") %>

3.4.6 exception变量

<%@page isErrorPage='true' %>
<html><body>
	页面发生了下面错误:<br>
	<%=exception.toString() %>
</body></html>

3.4.7 config变量

<%=config.getInitParameter("company")%>

3.4.8 pageContext变量

pageContext是javax.servlet.jsp.PageContext类型的隐含变量,它是一个页面上下文对象。
PageContext类是一个抽象类,容器厂商提供了一个具体子类(如JspContext),它有下面三个作用

  1. 存储隐含对象的引用
  2. 提供了在不同作用域内返回或设置属性的方便的方法
  3. 提供了forward()和include实现将请求转发到另一个资源和将一个资源的输出包含到当前页面中的功能
<% pageContext.forward("other.jsp"); %>

3.4.9 page变量

Object page = this;//this指当前Servlet实例
它指的是生成的Servlet实例,该变量很少被使用。

3.5 page指令属性

属性名说明
import导入在JSP页面中使用的Java类和接口,其间用逗号隔开
contentType指定输出的内容类型和字符集
pageEncoding指定JSP文件的字符编码
session用布尔值指定JSP页面是否参加HTTP会话
errorPage用相对URL指定另一个JSP页面用来处理当前的错误
isErrorPage用一个布尔值指定当前页面是否用来处理错误
language指定容器支持的脚本语言
extends任何合法地实现了javax.servlet.jsp.JspPage接口的Java类
buffer指定输出缓冲区的大小
autoFlush指定是否当缓冲区满时自动刷新
info关于JSP页面的任何文本信息
isThreadSafe指定页面是否同时为多个请求服务
isELIgnored指定是否在此转换单元中对EL表达式求值

page指令是针对当前页面的指令,常用的page指令有8个:
1.<%@page language=“java”%>设置jsp中用到的语言,用到的是java,也是目前唯一有效的设定
2.<%@page extends=“mypackage.myclass”%>设置目前jsp要继承的父类,一般不需要设置,在默认情况下,jsp页面默认的父类是HttpJspBase。
3.<%@page import=“java.sql.*”% > jsp页面所用到的类
4.<%@page errorPage=“error.jsp”%> 设置该jsp页面出现异常时所要转到的页面,如果没设定,容器将使用当前的页面显示错误信息
5.<%@page isErrorPage=“true”%> 设置该jsp页面是否作为错误显示页面,默认是false,如果设置为true,容器则会在当前页面生成一个exception对象,和4拍配使用
6.<%@page contentType=“text/html;charset=gb2312”%> 设置页面文件格式和编码方式
7.<%@page isThreadSafe=“true”% > 设置容器以多线程还是单线程运行该jsp页面,默认是true,是多线程。设置为false,则以单线程的方式运行该jsp页面
8.<%@page session=“true”% > 设置该jsp页面是否可以用到session对象(jsp内置对象,为web容器创建),默认是true,能用到session.设置为false,则用不到

3.6 JSP组件包含

3.6.1 静态包含:include指令

静态包含是在JSP页面转换阶段将另一个文件的内容包含到当前JSP页面中。

<%@page include file="relativeURL">

3.6.2 动态包含:include动作

动态包含是通过JSP标准动作<jsp:include>实现的,动态包含是在请求时将另一个页面的输出包含到主页面输出中。

<jsp:include page ="relativeURL" flush="true|false"/>

3.6.3 使用<jsp:forward>动作

使用<jsp:forward>动作把请求转发到其他组件,然后由转发到的组件把响应发送给客户

<jsp:forward page="relativeURl" />

3.6.4 使用包含设计页面布局

<%@ include file="/WEB-INF/jsp/content.jsp" %>

3.7 作用域对象

作用域名称对应的对象存在性和可访问性
应用作用域application在整个Web应用程序有效
会话作用域session在一个用户会话范围内有效
请求作用域request在用户的请求和转发的请求内有效
页面作用域pageContex只在当前的页面(转换单元)内有效

3.8 JavaBeans

3.8.1 JavaBeans规范

需要满足三个条件
(1)JavaBeans应该是public类,且具有无参数的public构造方法(或者使用默认的构造方法)
(2)JavaBeans类的成员变量一般称为属性(property),每个属性访问权限一般定义为private
(3)每个属性通常定义一个getter(获取属性值)和setter(设置属性值)方法。

3.8.2 使用<jsp:useBean>动作

<jsp:useBean>动作用来指定的作用域中查找或创建一个bean实例

3.8.3 使用<jsp:setProperty>动作

<jsp:setProperty>动作用来给bean实例的属性赋值

3.8.4 使用<jsp:getProperty>动作

<jsp:getProperty>动作检索并向输出流中打印bean的属性值

3.9MVC设计模式

MVC(Model-View-Controller)
实现MVC模式的一般步骤

  1. 定义JavaBeans 存储数据
  2. 使用servlet 处理请求
  3. 结果与存储
  4. 转发请求到JSP页面
  5. 从JavaBeans 对象中提取数据

3.10 错误处理

  1. 声明式错误处理
<web-app>
........

<error-page>
      <error-code>401</error-code>
      <location>/errorPage.jsp</location>
  </error-page>
  <error-page>
      <error-code>404</error-code>
      <location>/errorPage.jsp</location>
  </error-page>
</web-app>
  1. 编程式错误处理

利用try-catch处理错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA开发区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值