JSP基础(笔记)

1、什么是JSP

JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以 <% 开头以 %> 结束。

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

JSP标签有多种功能:

  1. 访问数据库
  2. 记录用户选择信息
  3. 访问JavaBeans组件等
  4. 在不同的网页中传递控制信息和共享信息。

2、JSP原理

WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。

每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。

Tomcat 5.x把为JSP页面创建的Servlet源文件和class类文件放置在“<TOMCAT_HOME>\work\Catalina<主机名><应用程序名>\”目录中,Tomcat将JSP页面翻译成的Servlet的包名为org.apache.jsp.<JSP页面在WEB应用程序内的目录名> 。
在这里插入图片描述

分析JSP所生成的Servlet代码:

  • 原jsp文件:
    在这里插入图片描述

  • JSP页面翻译成的Servlet继承了org.apache.jasper.runtime.HttpJspBase类,HttpJspBase类是HttpServlet的一个子类,因此JSP页面翻译成的Servlet是HttpServlet的一个孙子类。HttpJspBase类实现了javax.servlet.jsp.HttpJspPage接口中的部分方法,因此,HttpJspBase类是抽象的。

    翻译后的jsp文件:
    在这里插入图片描述

  • JSP页面中的位于<% %>外面的每行和紧临<%%>两边的每段文本被转换成以这些文本作为参数的一条条out.write语句,JSP脚本片断(位于<%%>内的一段java代码)中的java代码被原封不动地搬移进了_jspService方法中的相应位置处,JSP表达式(位于<%=和%>之中的内容)则是被转换成以其中的变量或表达式作为参数的out.print语句。
    在这里插入图片描述

JSP本质上是一个Servlet程序,这是jsp被编译为java文件后的内容:

	//初始化
    public void _jspInit() {
    }
	//销毁
    public void _jspDestroy() {
    }
	//JSPService
    public void _jspService(HttpServletRequest request, HttpServletResponse response)

3、JSP的执行过程

JSP的执行过程主要可以分为以下几点:

客户端发出请求。

Web容器将JSP转译成Servlet源代码。

Web容器将产生的源代码进行编译。

Web容器加载编译后的代码并执行。

把执行结果响应至客户端。
在这里插入图片描述

4、JSP语法

脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。

脚本程序的语法格式:

<% 代码片段 %>

4.1、JSP表达式

一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。

由于表达式的值会被转化成String,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签。

表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。

作用:用来将程序的输出,输出到客户端

JSP表达式的语法格式:

<%= 表达式 %>

例如:

<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  
  今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
  
  </body>
</html>

输出:

今天的日期是: 2016-6-25 13:40:07

4.2、JSP脚本片段

在JSP里编写java程序

<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>

  <%
    int sum =0;
    for (int i = 0; i <=100 ; i++) {
      sum +=i;
    }
    out.println("<h1>Sum="+sum+"</h1>");
  %>

  </body>
</html>

输出:

Sum=5050

4.3、JSP注释

语法描述
<%-- 注释 --%>JSP注释,注释内容不会被发送至浏览器甚至不会被编译
<!-- 注释 -->HTML注释,通过浏览器查看网页源代码时可以看见注释内容
<%代表静态 <%常量
%>代表静态 %> 常量

4.4、JSP声明

一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。在JSP文件中,您必须先声明这些变量和方法然后才能使用它们。JSP声明的会被编译到java类中,其他的就会编译到_jspService方法中。

JSP声明的语法格式:

<%! declaration; [ declaration; ]+ … %>

4.5、JSP中EL表达式

EL 语法很简单,它最大的特点就是使用上很方便。接下来介绍EL主要的语法结构:

${sessionScope.user.sex}

作用:

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象

4.6、JSP指令

JSP指令用来设置与整个JSP页面相关的属性。

JSP指令语法格式:

<%@ directive attribute=“value” %>

三种常用指令标签:

指令描述
<%@ page … %>定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include … %>包含其他文件
<%@ taglib … %>引入标签库的定义,可以是自定义标签

4.6.1、Page指令

下表列出与Page指令相关的属性:

属性描述
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确定脚本元素能否被使用

举一个错误页面的设置:

index.jsp页面:
在这里插入图片描述
500.jsp页面:
在这里插入图片描述
输出页面:
在这里插入图片描述
修改错误页面,也可在web.xml中进行操作:
在这里插入图片描述

4.6.2、Include指令

JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。

Include指令的语法格式如下:

<%@ include file=“文件相对 url 地址” %>

5、JSP 标准标签库(JSTL)

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。

JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。

根据JSTL标签所提供的功能,可以将其分为5个类别。

  • 核心标签
  • 格式化标签
  • SQL 标签
  • XML 标签
  • JSTL 函数

这就说一个核心标签和JSTL标签,其它的课参考菜鸟教程

5.1、JSTL 库添加

在 web.xml 文件中添加 jstl表达式依赖standard标签库

<!-- jstl表达式依赖 -->
<dependency>
	<groupId>javax.servlet.jsp.jstl</groupId>
	<artifactId>jstl-api</artifactId>
	<version>1.2</version>
</dependency>
<!-- standard标签库 -->
<dependency>
	<groupId>taglibs</groupId>
	<artifactId>standard</artifactId>
	<version>1.1.2</version>
</dependency>

5.2、JSP标签

<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>

<%-- 转发到jspatag页面,并携带两个参数 --%>
  <jsp:forward page="jsptag.jsp">
    <jsp:param name="name" value="Jick"/>
    <jsp:param name="age" value="20"/>
  </jsp:forward>

  </body>
</html>

获取转发的参数信息

<body>
    名字:<%=request.getParameter("name")%>
    年龄:<%=request.getParameter("age")%>
</body>

5.3、核心标签

核心标签是最常用的 JSTL标签。引用核心标签库的语法如下

<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>

标签描述
<c:out>用于在JSP中显示数据,就像<%= … >
<c:set>用于保存数据
<c:remove>用于删除数据
<c:catch>用来处理产生错误的异常状况,并且将错误信息储存起来
<c:if>与我们在一般程序中用的if一样
<c:choose>本身只当做<c:when>和<c:otherwise>的父标签
<c:when><c:choose>的子标签,用来判断条件是否成立
<c:otherwise><c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行
<c:import>检索一个绝对或相对 URL,然后将其内容暴露给页面
<c:forEach>基础迭代标签,接受多种集合类型
<c:forTokens>根据指定的分隔符来分隔内容并迭代输出
<c:param>用来给包含或重定向的页面传递参数
<c:redirect>重定向至一个新的URL.
<c:url>使用可选的查询参数来创造一个URL

5.4、JSTL表达式

JSTL标签库就是为了弥补HTML的不足;它自定义了很多标签,可以供我们使用,标签的功能和java代码一样。

jstl标签使用步骤:

  1. 引入对应的taglib
  2. 使用其中的方法
  3. 在Tomcat也需要引入jstl的包,否则会报错:JSTL解析错误

这个例子用了<c:if>和<c:out>标签:

<%--引入jstl核心标签,才能使用JSTL标签--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h4>if测试</h4>
<form action="jsptag.jsp" method="get">
    <%--
    EL表达式获取表单中的数据
    ${param.参数名}
    --%>
    <input type="text" name="username" value="${param.username}">
    <input type="submit" value="登录">
</form>

<%--判断提交的是否是管理员,如果是就登录成功--%>
<%--test:判断条件  var:返回判断结果的变量名(结果是true还是false)--%>
<c:if test="${param.username == 'admin'}" var="isAdmin">
    <c:out value="管理员欢迎您!"/>
</c:if>
<br/>
<c:out value="${isAdmin}"/>

</body>
</html>

6、JSP JavaBean

JavaBean 是特殊的 Java 类,使用 Java 语言书写,并且遵守 JavaBean API 规范。

特定写法:

  • 可能有一系列可读写属性。
  • 必须有一个无参构造
  • 属性必须私有化
  • 必须有对应的get、set方法

6.1、JavaBean 属性

方法描述
getPropertyName()如果属性的名称为 myName,那么这个方法的名字就要写成 getMyName() 来读取这个属性。这个方法也称为访问器。
setPropertyName()如果属性的名称为 myName,那么这个方法的名字就要写成 setMyName()来写入这个属性。这个方法也称为写入器。

一个只读的属性只提供 getPropertyName() 方法,一个只写的属性只提供 setPropertyName() 方法。

6.2、访问JavaBean

<jsp:useBean> 标签可以在 JSP 中声明一个 JavaBean,然后使用。声明后,JavaBean 对象就成了脚本变量,可以通过脚本元素或其他自定义标签来访问。

<jsp:useBean> 标签的语法格式如下:

<jsp:useBean id=“bean 的名字” scope=“bean 的作用域” typeSpec/>

其中,根据具体情况,scope 的值可以是 page,request,session 或 application(page < request < session < application )。
id值可任意只要不和同一 JSP 文件中其它 <jsp:useBean> 中 id 值一样就行了。

6.3、访问 JavaBean 对象的属性

在 <jsp:useBean> 标签主体中使用 <jsp:getProperty/> 标签来调用 getter 方法,
使用 <jsp:setProperty/> 标签来调用 setter 方法,语法格式如下:

<jsp:useBean id=“id” class=“bean 编译的类” scope=“bean 作用域”>
<jsp:setProperty name=“bean 的 id” property=“属性名” value=“value”/>
<jsp:getProperty name=“bean 的 id” property=“属性名”/>

</jsp:useBean>

name属性指的是Bean的id属性。property属性指的是想要调用的getter或setter方法。

javaBean一般用来和数据库的字段做映射 ORM;

ORM:对象关系映射

  • 表 --> 类
  • 字段 --> 属性
  • 行记录 --> 对象

数据库表(people表):

idnameageaddress
1小明119北京
2小明225北京
3小明342北京

java对应的实体类(people类):

package com.sdablog.pojo;

//实体类,一般都是和数据库中的表结构一一对应
public class People {
    private int id;
    private String name;
    private int age;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "People{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

JSP访问实体类people:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<jsp:useBean id="People" class="com.sdablog.pojo.People" scope="page"/>
<jsp:setProperty name="People" property="id" value="1"/>
<jsp:setProperty name="People" property="name" value="王五"/>
<jsp:setProperty name="People" property="age" value="18"/>
<jsp:setProperty name="People" property="address" value="上海"/>

id:<jsp:getProperty name="People" property="id"/>
姓名:<jsp:getProperty name="People" property="name"/>
年龄:<jsp:getProperty name="People" property="age"/>
地址:<jsp:getProperty name="People" property="address"/>

</body>
</html>

输出:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值