关于JSP脚本

简单入门

Posted by YD Blog on October 17, 2022

关于JSP

概述

  • 概念:Java Server Page,Java服务端页面
  • 一种动态的网页技术,其中既可以定义HTML、JS、CSS等静态内容,也可以定义Java代码的动态内容。
  • JSP = HTML + Java
  • JSP作用:简化开发,避免了在Servlet中直接输出HTML标签

Java代码用<% %>包裹起来。

JSP快速入门

  1. 导入JSP依赖

在pom文件中添加如下代码:

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
      <scope>provided</scope>
    </dependency>
  1. 创建JSP文件

  2. 编写HTML标签和Java代码

<body>
    <h1>hello jsp!</h1>
    <%
        System.out.printf("jsp hello!");
    %>
</body>

这样一个最基础的jsp就完成了。

JSP原理

  • JSP本质上就是一个servlet。
  • 在项目部署时,JSP文件会转换为.java文件并且被编译。
  • 这个类继承自HttpJspBase类,而HttpJspBase继承自HttpServlet类。

JSP脚本

  • JSP脚本用于在JSP页面内定义Java代码

  • JSP脚本分类

    • <%...%>:内容会直接放到_jspService()方法内
    • <%=...%>:内容会放到out.print()中,作为out.print()的参数
    • <%!...%>:内容会被放到_jspService()方法外,被类直接包含

注意:JSP文件中的所有HTML标签在转换为java文件时都会被转化为out.write()方法写入,故JSP脚本是可以在任意语句之间截断的。

JSP缺点

  • 由于JSP页面内既可以定义HTML标签,又可以定义java代码,造成了以下问题:
    • 书写麻烦:特别是复杂的页面
    • 阅读麻烦
    • 复杂度高:运行需要依赖于各种环境,JRE、JSP容器、JavaEE等
    • 占内存和硬盘:JSP会自动生成.java文件和.class文件占磁盘,运行的是.class文件占内存
    • 调试困难:出错后,需要找到自动生成的.java文件进行调试
    • 不利于团队协作:前端人员不会Java,后端人员不精HTML

故JSP已经逐渐退出历史舞台,现在更多的使用HTML+AJAX技术完成同样的工作。

同时,使用JSP时,更多是配合Servlet使用,Servlet将处理好的数据放到response的域中,JSP只决定数据的展示。

故JSP的缺点的解决方案:不要直接在JSP里面写Java代码。

EL表达式

  • Expression Language 表达式语言,用于简化JSP页面内的Java代码
  • 主要功能:获取数据
  • 语法:${expression},例如${name}获取域中存储的key为name的值
  • 在Servlet中存好数据后,转发到对应的JSP资源中即可。
  • JavaWeb中有四大域对象:
    1. page:当前页面有效
    2. request:当前请求有效
    3. session:当前会话有效
    4. application:当前应用有效
  • EL表达式获取数据会依次从这四个域中寻找,直到找到为止。

JSTL标签

  • JSP标准标签库(Jsp Standarded Tag Library),使用标签取代JSP页面上的Java代码

这里只简单介绍两种标签<c:if><c:forEach>

  1. 首先要使用JSTL标签需要先引入依赖包,在pom文件中加入:
    <dependency>
      <groupId>javax.servlet.jsp.jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
  1. 在JSP页面上引入JSTL标签库

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

  1. 使用

<c:if test="逻辑表达式"> </c:if>

<c:if>标签没有else

foreach标签的语法如下:

<c:forEach
    items="<object>"
    begin="<int>"
    end="<int>"
    step="<int>"
    var="<string>"
    varStatus="<string>">
  ...
  </c:forEach>
属性 描述 默认值
items 要被循环的信息
begin 开始的元素(0=第一个元素,1=第二个元素) 0
end 最后一个元素(0=第一个元素,1=第二个元素) Last element
step 每一次迭代的步长 1
var 代表当前条目的变量名称
varStatus 代表循环状态的变量名称

MVC模式

  • MVC模式是一种分层开发的模式
  • M:Model,业务模型,处理业务
  • V:View,视图,界面展示
  • C:Controller:控制器,处理请求,调用模型和视图

故MVC模式就是将业务处理,界面展示,总体控制完全分开的一种开发模式。

三层架构

将项目分为三个层面:

  1. 表现层:接收请求,封装数据,调用业务逻辑层,响应数据
  2. 业务逻辑层:对业务逻辑进行封装,组合数据访问层中的基本操作,形成复杂的业务逻辑功能
  3. 数据访问层:对数据库进行crud(增删改查)的基本操作

表现层的包名一般为web,业务逻辑层一般为service包,数据访问层一般为dao或者mapper包。

常用框架:

  • 表现层:SpringMVC、Struts2
  • 业务逻辑层:Spring
  • 数据访问层:MyBatis、Hibername

  • SSM:Spring、SpringMVC、MyBatis

JSP中九大内置对象类型

名称 作用 对象类型 作用域
request 请求对象 javax.servlet.ServletRequest Request
response 响应对象 javax.servlet.SrvletResponse Page
pageContext 页面上下文对象 javax.servlet.jsp.PageContext Page
session 会话对象 avax.servlet.http.HttpSession Session
application 应用程序对象 javax.servlet.ServletContext Application
out 输出对象 javax.servlet.jsp.JspWriter Page
config 配置对象 javax.servlet.ServletConfig Page
page 页面对象 javax.lang.Object Page
exception 例外对象 javax.lang.Throwable page

内置对象是指在JSP中无需创建就可以使用的9个对象。