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" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
hello
</body>
</html>

启动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.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.3</version>
</dependency>
<!--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>

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("<h1>Sum="+sum+"</h1>");
%>

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注释--%>
<!--HTML注释-->

JSP指令

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

JSP指令语法格式:

<%@ page attribute="value" %>

这里有三种指令标签:

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

Page指令

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

Page指令的语法格式:

<%@ page attribute="value" %>

等价的XML格式:

<jsp:directive.page attribute="value" />

下表列出与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语法:

<jsp:directive.include file="文件相对 url 地址" />

Taglib指令

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

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

Taglib指令的语法:

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

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

等价的XML语法:

<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />

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

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

<%
    int i=6/0;
%>

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

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

<img src="../img/500.png" alt="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>404</error-code>
    <location>/error/404.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/error/500.jsp</location>
</error-page>

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

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

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

image-20210218215441547

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
      <%@include file="common/header.jsp"%>
      <h1>网页主体</h1>
      <%@include file="common/footer.jsp"%>
</body>
</html>

测试,请求jsp3.jsp

image-20210218215634777

9大内置对象

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

对象描述
requestHttpServletRequest类的实例
responseHttpServletResponse类的实例
outPrintWriter类的实例,用于把结果输出至网页上
sessionHttpSession类的实例
applicationServletContext类的实例,与应用上下文有关
configServletConfig类的实例
pageContextPageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
page类似于Java类中的this关键字
exceptionexception 类的对象,代表发生错误的 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

<h1>这是jspTag1</h1>
姓名: <%=request.getParameter("name")%>
年龄: <%=request.getParameter("age")%>

再建一个jsptag2.jsp

<%--转发标签--%>
<%request.setCharacterEncoding("utf-8");%>   
<jsp:forward page="jsptag1.jsp">
    <jsp:param name="name" value="胡帅"/>
    <jsp:param name="age" value="21"/>
</jsp:forward>>

JSTL标签

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

核心标签

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

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

c:if 测试

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

image-20210219144937103

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

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h1>核心标签中if测试</h1>

<%--
    EL表达式获取表单中的数据
    ${param.参数名}
--%>
<form action="coreif.jsp" method="post">
    <input type="text" name="username" value="${param.username}">
    <input type="submit" value="登录">
</form>
<%--判断如果提交的用户名是管理员,则登录成功--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
    <c:out value="欢迎管理员"/>
</c:if>
<%--c:out自闭和标签--%>
<c:out value="${isAdmin}"/>

启动Tomcat测试,访问coreif.jsp

image-20210219150744270

c:choose 测试

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

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h1>JSTL核心标签choose-成绩等级划分测试</h1>
<form action="corechoose.jsp" method="post">
    成绩:<input type="text" name="score" value="${param.score}"><br>
    <input type="submit" value="查询">
</form>
<c:choose>
    <c:when test="${param.score>=90&&param.score<=100}">
        <c:out value="优秀"/>
    </c:when>
    <c:when test="${param.score>=80&&param.score<90}">
        <c:out value="良好"/>
    </c:when>
    <c:when test="${param.score>=60&&param.score<80}">
        <c:out value="一般"/>
    </c:when>
    <c:when test="${param.score>=0&&param.score<60}">
        <c:out value="不及格"/>
    </c:when>
    <c:when test="${param.score<0||param.score>100}">
        <c:out value="分数异常,请重新输入"/>
    </c:when>
</c:choose>

启动Tomcat测试

image-20210219153004474

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<String> people = new ArrayList<>();
    people.add("许嵩");
    people.add("周杰伦");
    people.add("汪苏泷");
    people.add("薛之谦");
    request.setAttribute("list",people);
%>
<%--
var 每一次遍历出来的变量
item  要遍历的对象
begin 起点
end 终点
step 步长
--%>
<c:forEach var="people" items="${list}">
    <c:out value="${people}"/><br>
</c:forEach>

<hr>

<c:forEach var="people" items="${list}" begin="0" end="3" step="2">
    <c:out value="${people}"/><br>
</c:forEach>

启动Tomcat测试

image-20210219154716862

格式化标签(不常用)

SQL标签(不常用)

XML标签(不常用)

JavaBean

通常称为实体类

JavaBean有特定的写法

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

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

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

在数据库中定义一个singer表

idnameagesong
1vae34灰色头像

使用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" %>

<h2>使用JavaBean</h2>
<%--使用javabean--%>
<jsp:useBean id="singer" class="pojo.Singer" scope="page">
    <jsp:setProperty name="singer" property="id" value="1"/>
    <jsp:setProperty name="singer" property="name" value="许嵩"/>
    <jsp:setProperty name="singer" property="age" value="34"/>
    <jsp:setProperty name="singer" property="song" value="灰色头像"/>
 </jsp:useBean>


id:<jsp:getProperty name="singer" property="id"/><br>
姓名:<jsp:getProperty name="singer" property="name"/><br>
年龄:<jsp:getProperty name="singer" property="age"/><br>
歌曲:<jsp:getProperty name="singer" property="song"/>
<hr>

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

启动Tomcat测试

image-20210219163509923

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值