IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JavaWeb——JSP规范 -> 正文阅读

[Java知识库]JavaWeb——JSP规范

JSP规范

1. JSP规范介绍

  • 来源于JavaEE规范中一种
  • JSP规范制定了如何开发JSP文件代替响应对象将处理结果写入到响应体的开发流程
  • JSP规范制定了Http服务器应该如何调用管理JSP文件
  • 优势
    1. JSP文件在互联网通信过程,是响应对象的替代品
    2. 降低将处理结果写入到响应体的开发工作量同时降低处理结果的维护难度
    3. 在JSP文件开发时,可以直接将处理结果写入到JJSP文件而不需要手写out.print命令,在Http服务器调用JSP文件时,根据JSP规范要求自动的将JSP文件书写的所有内容通过输出流写入到响应体中。

2. 响应对象存在的弊端

  • 适合将数据量较少的处理结果写入到响应体中
  • 如果处理结果数量过多,使用响应对象增加开发难度

3. JSP文件内置对象request

  • 类型:HttpServletRequest

  • 作用

    • 在JSP文件运行时读取请求包信息
    • 与Servlet在请求转发的过程中实现数据共享
  • 栗子

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%--使用浏览器访问http://localhost:8080/myWeb/index.jsp?userName=陌言&password=0916--%>
    <%
      String userName = request.getParameter("userName");
      String password = request.getParameter("password");
    %>
    
    1.用户名称:<%=userName%><br/>
    2.用户密码:<%=password%>
    
    • 在浏览器中打印出

      1. 用户名称:陌言

      2. 用户密码:0916

4. JSP文件内置对象session

  • 类型:HttpSession

  • 作用:JSP文件在运行时,可以通过session指向当前用户私人储物柜,添加共享数据,或者读取共享数据

  • 栗子

    • session_1.jsp存数据

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%
          session.setAttribute("key1", 200);
      %>
      
    • session_2.jsp取数据

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%=session.getAttribute("key1")%>
      

5. JSP文件内置对象application

  • 类型:ServletContext全局作用域对象

  • 作用:同一个网站中的Servlet和JSP,都可以通过当前网站的全局作用域对象实现数据共享

  • 栗子

    • application.jsp向全局作用域对象中存数据

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      <%
          application.setAttribute("key1", "300");
      %>
      
    • OneServlet从全局作用域对象中取数据

      public class OneServlet extends HttpServlet {
          
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              ServletContext application = request.getServletContext();
              String value = (String) application.getAttribute("key1");
              System.out.println("value = " + value);
          }
      }
      

6. Servlet跟JSP的联合调用

  1. Servlet跟JSP分工:

    • Servlet:负责处理业务并得到处理结果——大厨
    • JSP:不负责业务处理,主要任务将Servlet中处理结果写入到响应体——传菜员
  2. Servlet跟JSP之间的调用关系

    • Servlet工作完毕之后,一般通过请求转发方式向Tomcat申请调用JSP
  3. Servlet与JSP之间如何实现数据共享

    1. Servlet将处理结果添加到[请求作用域对象]
    2. JSP文件在运行时从[请求作用域对象]得到处理结果
  4. 栗子

    • OneServlet处理业务,模拟得到处理结果

      public class OneServlet extends HttpServlet {
          // 处理业务,得到处理结果———查询学员信息
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              Student s1 = new Student(10, "mike");
              Student s2 = new Student(20, "alien");
              List stuList = new ArrayList();
              stuList.add(s1);
              stuList.add(s2);
      
              // 将处理结果添加到请求作用域对象中
              request.setAttribute("key", stuList);
              // 通过请求转发方案,向Tomcat申请调用user_show.jsp
              // 同时将request与response通过tomcat交给user_show.jsp使用
              request.getRequestDispatcher("/user_show.jsp").forward(request, response);
          }
      }
      
    • user_show.jsp负责将处理结果写入到响应体中

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%
          // 从请求作用域对象得到OneServlet添加进去的集合
          List<Student> stuList = (List) request.getAttribute("key");
      %>
      <%--将处理结果写到响应体中--%>
      <table border="2" align="center">
          <tr>
              <th>用户编号</th>
              <th>用户姓名</th>
          </tr>
          <%
              for (Student stu:stuList){
      
          %>
                  <tr>
                      <td><%=stu.getSid()%></td>
                      <td><%=stu.getSname()%></td>
                  </tr>
          <%
              }
          %>
      </table>
      

7. JSP文件运行原理

  1. Http服务器调用JSP文件步骤

    1. Http服务器将JSP文件内容编辑为一个Servlet接口实现类(.java)
    2. Http服务器将Servlet接口实现类编译为class文件(.class)
    3. Http服务器负责创建这个class的实例对象,这个实例对象就是Servlet实例对象
    4. Http服务器通过对这个Servlet实例对象调用它的_jspService方法,将jsp文件内容写入到响应体中
  2. Http服务器编辑编译JSP文件的位置:[work]文件夹下

tomcat对jsp的处理

8. EL技术

  • 介绍:由Java技术开发的一个jar包

  • 作用:降低JSP文件开发时Java命令开发强度

  • Tomcat服务器本身自带了EL工具包(Tomcat安装地址/lib/el-api.jar),故而不需要我们导入。当我们在将网站交给Tomcat进行管理的时候,tomcat发现我们缺少这个jar包,会自动到自己的lib中去找对应的jar包。

  • EL表达式

    • 命令格式${作用域对象别名.共享数据名}

    • 命令作用

      1. EL表达式是EL工具包提供的一种特殊命令格式
      2. EL表达式在JSP文件上使用
      3. 负责在JSP文件上从作用域对象读取指定的共享数据并输出到响应体
    • 作用域对象别名

      • JSP可以使用的作用域对象

        1. ServletContext application:全局作用域对象
        2. Httpsession session:会话作用域对象
        3. HttpServletRequest request:请求作用域对象
        4. PageContext pageContext:当前页作用域对象,这是JSP文件独有的作用域对象。Servlet中不存在。在当前页作用域对象存放的共享数据仅能在当前JSP文件中使用,不能共享给其他Servlet或者其他JSP文件使用。真实开发过程中,主要用于JSTL标签和JSP文件之间数据共享。JSTL——》pageContext——》JSP
      • EL表达式提供作用域对象别名

        JSP表达式
        application${applicationScope.共享数据名}
        session${sessionScope.共享数据名}
        request${requestScope.共享数据名}
        pageContext${pageScope.共享数据名}
    • EL表达式将引用对象属性写入到响应体中

      1. 命令格式${作用域对象名.共享数据名.属性名}
      2. 命令作用:从作用域对象读取指定共享数据关联的引用对象的属性值。并自动将属性的结果写入到响应体。
      3. 属性名:一定要与引用类型属性名完全一致(大小写)
      4. 原理反射机制
      5. 注意:EL表达式没有提供遍历集合方法,因此无法从作用域对象读取集合内容输出。
    • EL表达式简化版

      1. 命令格式${共享数据名}
      2. 命令作用:EL表达式允许开发人员开发时省略作用域对象别名
      3. 工作原理:EL表达式简化版由于没有指定作用域对象,在执行的时候采用的算法
        • 首先到pageContext中定位,如果存在直接读取输出并结束执行
        • 如果在pageContext没有定位成功,则开始依次到request、session、application中去定位。
      4. 存在隐患
        • 容易降低程序执行速度
      5. 应用场景
        • 设计目的,简化从pageContext读取共享数据并输出的难度。
    • 支持运算表达式

      1. 前提:在JSP文件有时需要将读取共享数据进行一番运算之后,写入到响应体中。

      2. 栗子

        • OneServlet提供数据

          public class OneServlet extends HttpServlet {
              protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                  request.setAttribute("key1", "100");
                  request.setAttribute("key2", 200);
                  request.getRequestDispatcher("/index_1.jsp").forward(request, response);
              }
          }
          
        • index_1.jsp读取共享数据并进行一番运算,然后将运算结果写入到响应体中

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <%--将作用域对象中共享数据读取出来相加,将响应结果写入到响应体--%>
          <!--1. 传统做法-->
          <%
              Integer n1 = Integer.valueOf((String) request.getAttribute("key1"));
              Integer n2 = (Integer) request.getAttribute("key2");
              int sum = n1 + n2;
          %>
          计算后结果:<%=sum%><br/>
          EL表达式计算后结果:${key1 + key2} +号提醒EL表达式将字符串转为数字进行运算<br/>
          EL表达式输出关系运算:${30>20? "30大于20":"30小于20"}
          
      3. 运算表达式

        1. 数学运算
        2. 关系运算(>、<、<=、 ==、 >=、 !=)
        3. 逻辑运算(&&、||、! )
    • EL表达式提供内置对象

      1. 命令格式${param.请求参数名}

      2. 命令作用:通过请求对象读取当前请求包中请求参数内容并将请求参数内容写到响应体

      3. 代替命令

        • index.jsp(发送请求:Http://localhost:8080/myWeb/index.jsp?userName=mike&&password=123)

          <%
          	String userName = request.getParameter("userName");
          String password = request.getParameter("password");
          %>
          <%=userName%>
          <%=password%>
          
      4. 命令格式${paramValues.请求参数名[下标]}

      5. 命令作用:如果浏览器发送的请求参数是[一个请求参数关联多个值],此时可以通过paramValues读取请求参数中指定位置的值并写入到响应体中

      6. 代替命令

        • http://localhost:8080/myWeb/index_2.jsp?pagNo=1&pagNo=2此时pagNo请求参数在请求包中以数组形式存在
        • pagNo:[1, 2]
        <%
        	String array[] = request.getParameterValues("pageNo");
        %>
        第一个值:<%=array[0]%>
        第二个值:<%=array[1]%>
        
    • EL表达式常见异常

    • org.apache.jasper.JasperException在对象中没有找到指定的属性

琐碎知识

  1. jsp文件在执行的时候,自动地将文件所有内容写入到响应体中,从而节省书写out.print。
  2. 在JSP文件中直接书写Java命令(在执行标记<%....内容..%>中写Java命令),是不能被JSP文件识别,此时只会被当作字符串写入到响应体。
  3. 在JSP文件中,通过输出标记<%=变量名%>,通知JSP将Java变量的值写入到响应体中。
  4. 在JSP文件夹中,所有的执行标记当作一个整体。
  5. JSTL可以有效弥补EL表达式没法遍历集合的缺陷。
  6. MySQL中随机查询的功能select * from table order by rand()
    • 单纯select rand()返回的是0—1之间的小数
    • 该随机查询功能是MySQL特有的,像Oracle等都没有。
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 11:52:17  更:2021-08-30 11:54:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:51:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码