JSP-动态网页开发技术

前言

更多java知识关注公众号"自定义的Vae",持续更新中!
学习笔记可供下载!

什么是JSP

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

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

JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

JSP原理

JSP是如何执行的?

服务器内部工作

IDEA中使用Tomcat的话会在IDEA的tomcat中产生一个work目录,这是我自己Ubuntu系统的jsp位置

image-20210218190258334

发现页面转变成了java程序

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet,JSP本质就是一个Servlet

解析index_jsp.java源码

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

JSP内置了一些对象

final javax.servlet.jsp.PageContext pageContext;   //页面上下文
javax.servlet.http.HttpSession session    //session
final javax.servlet.ServletContext application;    //applicationContext
final javax.servlet.ServletConfig config;      //config配置
javax.servlet.jsp.JspWriter out = null;     //out输出
final java.lang.Object page = this;         //当前页

输出页面之前增加的代码

response.setContentType("text/html");   //设置响应的页面类型
pageContext = _jspxFactory.getPageContext(this, request, response,
        null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;

以上的这些对象,我们可以在JSP页面中直接使用

新建一个hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


hello


启动Tomcat,访问hello.jsp

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gIP5guwz-1613724636293)(https://picture.hs-vae.com/image-20210218191347148.png)]

这时可以看到新生成了一个hello_jsp.java

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOp8xcyM-1613724636294)(https://picture.hs-vae.com/image-20210218191618226.png)]

原理图如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52ZikVR5-1613724636296)(https://picture.hs-vae.com/jsp原理.png)]

在JSP页面中,只要是java代码就会原封不动的输出,如果是HTML代码就会转换为这样的格式

out.write("hello\n");

JSP基础语法

首先在pom.xml导入jsp所需要的各种依赖

<dependency>
    <groupId>javax.servletgroupId>
    <artifactId>javax.servlet-apiartifactId>
    <version>4.0.1version>
    <scope>providedscope>
dependency>
<dependency>
    <groupId>javax.servlet.jspgroupId>
    <artifactId>javax.servlet.jsp-apiartifactId>
    <version>2.3.3version>
dependency>

<dependency>
    <groupId>javax.servlet.jsp.jstlgroupId>
    <artifactId>jstl-apiartifactId>
    <version>1.2version>
dependency>

<dependency>
    <groupId>taglibsgroupId>
    <artifactId>standardartifactId>
    <version>1.1.2version>
dependency>

JSP作为java技术的一种应用,它拥有一些自己扩充的语法,java所有语法都支持,所以有一定的规范

中文编码问题

如果我们要在页面正常显示中文,我们需要在 JSP 文件头部添加以下代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

JSP表达式

语法格式:

<%= 变量或者表达式 %>

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

<%=new java.util.Date()%>>

JSP脚本程序

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

里面可以嵌套html,jsp会自动转义

<%--jsp脚本片段--%>
<%
int sum=0;
for (int i = 0; i < 100; i++) {
  sum+=i;
}
out.println("

Sum="+sum+"

"
); %>

JSP声明

语法格式:<%! %>

<%--jsp声明--%>
<%!
  static{
    System.out.println("Hello World");
  }
  private int a=0;
  public void hs(){
    System.out.println("进入了hs方法");
  }
%>

JSP声明:会被编译到jsp生成的java类中,在jspService方法外面!其他的,就会被生成到jspService方法中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jZP1a8ld-1613724636298)(https://picture.hs-vae.com/image-20210218204634504.png)]

jsp的注释,不会在客户端显示,而HTML的注释会被显示

<%--jsp注释--%>

JSP指令

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

JSP指令语法格式:

<%@ page attribute="value" %>

这里有三种指令标签:

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

Page指令

Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。

Page指令的语法格式:

<%@ page attribute="value" %>

等价的XML格式:



下表列出与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 确定脚本元素能否被使用

Include指令

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

Include指令的语法格式如下:

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

include 指令中的文件名实际上是一个相对的 URL 地址。

如果您没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。

等价的XML语法:



Taglib指令

JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。

Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。

Taglib指令的语法:

<%@ taglib uri="uri" prefix="prefixOfTag" %>

uri属性确定标签库的位置,prefix属性指定标签库的前缀。

等价的XML语法:


案例一:自定义一个500页面和404页面

在web目录新建一个jsp2.jsp文件

<%
    int i=6/0;
%>

这时候除数为0,这时候会报500代码错误

接着新建一个error目录里面在建立一个500.jsp,里面添加一个事先准备好的500图片

500

然后在jsp2.jsp文件头部写上jsp中page指令,定制错误页面

<%@page errorPage="error/500.jsp" %>

测试,网址请求jsp2.jsp文件,这时候就是自己定制的500错误页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i0UQoNnN-1613724636299)(https://picture.hs-vae.com/image-20210218213757615.png)]

同理404页面也可以自己去定制

还有一种方法就是去web.xml里面配置500和404页面

<error-page>
    <error-code>404error-code>
    <location>/error/404.jsplocation>
error-page>
<error-page>
    <error-code>500error-code>
    <location>/error/500.jsplocation>
error-page>

案例二:设计一个简单的网页(主体,header,footer)

新建一个common目录里面存放网页的相同的内容

创建一个footer.jsp和一个header.jsp

JSP-动态网页开发技术_第1张图片

创建一个jsp3.jsp,使用jsp-include指令

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


      <%@include file="common/header.jsp"%>
      

网页主体

<%@include file="common/footer.jsp"%>

测试,请求jsp3.jsp

JSP-动态网页开发技术_第2张图片

9大内置对象

JSP支持九个自动定义的变量,江湖人称隐含对象。这九个隐含对象的简介见下表:

对象 描述
request HttpServletRequest类的实例
response HttpServletResponse类的实例
out PrintWriter类的实例,用于把结果输出至网页上
session HttpSession类的实例
application ServletContext类的实例,与应用上下文有关
config ServletConfig类的实例
pageContext PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
page 类似于Java类中的this关键字
exception exception 类的对象,代表发生错误的 JSP 页面中对应的异常对象

不同对象设置节点时

<%
pageContext.setAttribute("vae","许嵩");  //保存的数据只在一个页面中有效
request.setAttribute("jay","周杰伦");    //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("silence","汪苏泷");   //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("joker","薛之谦"); //保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>

作用域是从底层到高层:page–>request–>session–>application,和JVM双亲委派机制一样

应用场景

request:客户端向服务器发送请求,产生的数据,用户看完了就没用了,比如:新闻

session:客户端向服务器发送请求,产生的数据,用户用完一会还用,比如:购物车

application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天室

EL表达式

EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达

式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。

语法:

${}

EL表达式的作用:

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

JSP行为标签

语法 描述
jsp:include 用于在当前页面中包含静态或动态资源
jsp:useBean 寻找和初始化一个JavaBean组件
jsp:setProperty 设置 JavaBean组件的值
jsp:getProperty 将 JavaBean组件的值插入到 output中
jsp:forward 从一个JSP文件向另一个文件传递一个包含用户请求的request对象
jsp:plugin 用于在生成的HTML页面中包含Applet和JavaBean对象
jsp:element 动态创建一个XML元素
jsp:attribute 定义动态创建的XML元素的属性
jsp:body 定义动态创建的XML元素的主体
jsp:text 用于封装模板数据

转发一个jsp,并携带两个参数

新建一个jsptag1.jsp

这是jspTag1

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

再建一个jsptag2.jsp

<%--转发标签--%>
<%request.setCharacterEncoding("utf-8");%>   

    
    
>

JSTL标签

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

核心标签

核心标签是最常用的 JSTL标签,c代表核心core,使用时需要先引入对应的taglib

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

c:if 测试

由于tomcat里面没有JSTL的jar包,会报以下错误

JSP-动态网页开发技术_第3张图片

解决方案:手动将standard和jstl的jar包导入到Tomcat的lib文件夹

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

核心标签中if测试

<%-- EL表达式获取表单中的数据 ${param.参数名} --%>
<%--判断如果提交的用户名是管理员,则登录成功--%> <%--c:out自闭和标签--%>

启动Tomcat测试,访问coreif.jsp

JSP-动态网页开发技术_第4张图片

c:choose 测试

jstl里的choose标签类似于switch,when相当于case

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

JSTL核心标签choose-成绩等级划分测试

成绩:

启动Tomcat测试

JSP-动态网页开发技术_第5张图片

c:forEach 测试

<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%--创建一个list集合,里面添加4个元素--%>
<%
    ArrayList people = new ArrayList<>();
    people.add("许嵩");
    people.add("周杰伦");
    people.add("汪苏泷");
    people.add("薛之谦");
    request.setAttribute("list",people);
%>
<%--
var 每一次遍历出来的变量
item  要遍历的对象
begin 起点
end 终点
step 步长
--%>

    


启动Tomcat测试

JSP-动态网页开发技术_第6张图片

格式化标签(不常用)

SQL标签(不常用)

XML标签(不常用)

JavaBean

通常称为实体类

JavaBean有特定的写法

  • 必须要有一个无参构造
  • 属性必须私有化
  • 必须有对应的get和set方法

一般用来和数据库的字段做映射ORM(对象关系映射)

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

在数据库中定义一个singer表

id name age song
1 vae 34 灰色头像

使用JavaBean

先创建一个实体类SInger

package pojo;

public class Singer {
    private int id;
    private String name;
    private int age;
    private String song;

    public Singer(int id, String name, int age, String song) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.song = song;
    }

    public Singer() {
    }

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

    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 getSong() {
        return song;
    }

    public void setSong(String song) {
        this.song = song;
    }
}

建立一个javabean.jsp

<%@ page import="pojo.Singer" %>

使用JavaBean

<%--使用javabean--%> id:
姓名:
年龄:
歌曲:

使用Java代码get,set

<%--等价于以下java代码--%> <% Singer singer1 = new Singer(); singer1.setId(1); singer1.setName("vae"); singer1.setAge(34); singer1.setSong("灰色头像"); %> id:<%=singer1.getId()%>
姓名:<%=singer1.getName()%>
年龄:<%=singer1.getAge()%>
歌曲:<%=singer1.getSong()%>

启动Tomcat测试

JSP-动态网页开发技术_第7张图片

你可能感兴趣的:(JavaWeb,jsp,javaweb,java)