zoukankan      html  css  js  c++  java
  • JavaEE 动态页面JSP

    1. JSP 概述

    JSP(Java Server Pages,Java 服务器页面),是在 HTML 文件中嵌入 Java 代码的一种技术,JSP 文档的扩展名为 .jsp。

    知乎大佬讲的很详细:https://zhuanlan.zhihu.com/p/42343690

    一个 JSP 页面中包含以下 3 中 Java 代码。

    (1)表达式。<%=表达式内容%>,可以是变量、变量的运算、有返回值的方法等。

    (2)Java 片段。<%代码%>,可以出现在 Java 方法中的代码都可以作为片段。

    (3)声明。<%!声明内容%>,用以声明成员变量、方法,代码内容和在 Java 中声明成员变量及成员方法的内容一致。

    JSP 是属于服务端的文档,而属于客户端的浏览器可以解释 HTML、CSS、JavaScript 等文档,但无法解释 Java 语言,Java 语言只能由服务器进行解释。实际上,JSP 文档在服务端运行,会被 Web 容器解释为一个 Servlet 类。Web 容器对 JSP 页面进行解释时遵顼以下规则。

    (1)JSP 文档中的 HTML 代码内容 会被翻译为 Servlet 类中的 “out.write()” 语句。

    (2)JSP 文档中的 表达式 最终显示的是其运行的结果。

    (3)JSP 文档中的 Java 片段 会被翻译为 Servlet 类中 service 方法中的代码。

    (4)JSP 文档中的 声明 会被翻译为 Servlet 类中的成员变量或成员方法。

    2. JSP 的隐式对象

    JSP隐式对象.菜鸟教程

    3. 转发与重定向

    3.1 转发

    在一个完整的 Web 项目中,通常是 JSP 页面和 Servlet 各司其职,Servlet 主要用于完成请求的逻辑处理,而 JSP 更多的是为逻辑处理之后的数据展示提供方便。在一个完整的请求过程中,既需要使用 Servlet 进行逻辑判断,又需要使用 JSP 进行数据展示,相当于是在多个 Servlet 之间进行跳转,这样的功能被称之为 转发

    转发 是指一个 Web 组件(Servlet/JSP)未能完成的处理通过容器转交给另一个 Web 组件完成。通常情况下,一个 Servlet 获取数据之后,将这些数据转发给 JSP,由这个 JSP 来展示这些数据。

    转发 还有一个特点,即浏览器地址不会发生改变。由于浏览器地址没有发生改变,所以会导致另外一个问题,即表单数据的重复提交,用户刷新登陆之后的页面,浏览器会给出提示信息,询问是否重复提交表单数据。

    3.2 重定向

    表单数据的重复提交会引发一系列的问题。例如,提交个人信息时,如果用户多次刷新页面,那么在数据库中会多次插入用户的数据,或者进行多次删除、更新等操作,这都会使数据出现异常。所以,表单数据的重复提交是需要避免的,在提交表单数据的地方,不能使用转发作为跳转页面的方式,而应该使用 Servlet/JSP 提供的 重定向(Redirect)作为跳转页面的机制。

    重定向 指用户发起请求处理完成后,服务器返回 302 状态码及新的 URL 地址,浏览器会再次发起请求,访问服务器返回的 URL 地址。重定向相当于是浏览器发起了两次请求,而 request 对象的生命周期只能存在于当次请求,即之前使用 request 对象传递数据的方式不能再次使用。

    HTTP 状态码.菜鸟教程
    页面重定向.菜鸟教程

    4. 作用域

    而在 Web 应用中,JSP 创建的对象有一定的生命周期,也有可能被其他组件访问。对象的生命周期和可访问性称为作用域。而 JSP 提供了 4 种作用域供编程者使用:

    隐式对象 说明 作用范围
    page 转译后对应 JspWriter 对象,其内部关联一个 PrintWriter 对象 当前页面有效
    request 转译后对应 HttpServletRequest/ServletRequest 对象 一个请求有效
    session 转译后对应 HttpServletResponse/ServletResponse 对象 一次会话有效
    application 转译后对应 ServletConfig 对象 整个项目有效

    作用域的范围由小到大为 page -> request -> session -> application。转发只有一次请求,所以两个 Servlet 可以使用 request 对象传递数据,而 重定向 属于两个请求,不能再使用 request 对象传递数据。可以使用 session 或 application 对象传递数据,但是 application 的作用范围最大,通常存放的是一些公共资源数据,而这里的登陆属于当前用户的信息,所以选择 session 来传递数据。

    JSP Session具体使用.菜鸟教程

    5. 表达式语言 EL

    一种简化 JSP 页面代码开发的功能,称为 表达式语言(Expression Language,EL)。

    EL 可使 JSP 写起来更加简单。EL 的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,使 JSP 的代码更加简练。

    使用 EL 可以完成简单的计算,取出作用域中的值,以及取出 JavaBean 对象中的属性值,其基本语法为 ${exper}。

    (1)计算。

    <body>
          EL表达式计算:<br>
          <!-- 加运算 -->
          1、${3+1} <br>
          <!-- 或运算 -->
          2、${true || false} <br>
          <!-- 三目运算 -->
          3、${1=1?"张三":"李四"} <br>
    </body>
    

    (2)取出前端传入的参数。

    EL表达式接收前端参数:<br>
          <!-- ${param.uname } 相当于 request.getParameter("uname") -->
          ${param.uname }
    

    (3)获取 request 作用域传递的数据。

    EL 表达式获取 request 作用域数据:<br>
    <!-- ${requestScope.msg} 相当于 <%=session.getAttribute("msg") %> -->
          ${requestScope.msg}
    

    (4)获取 request 作用域数据的简单写法。

    EL表达式获取 request 作用域数据简单写法:<br>
          ${msg}
    

    前面演示了两种获取 request 作用域数据的语法。实质上如果使用 ${name} 语法,EL 表达式会依次从 4 种作用域种获取绑定的 name 数据,从左至右顺序依次是 page、request、session、application,从 page 开始,查找到数据则显示,没有查到数据则继续从 request 对象中查找,依次运行;而 ${requestScope.name} 则指定从 request 作用域中获取数据。

    作用域对象与 EL 表达式语法

    作用域对象 EL 表达式语法
    page ${pageScope.name}
    request ${requestScope.name}
    session ${sessionScope.name}
    application ${applicationScope.name}

    ${name} 语法效率偏低,但取值范围更大;${requestScope.name} 语法效率高,但取值范围小。

    (5)获取 JavaBean 对象的属性值。
    创建 User 类的代码如下。

    public class User {
          private String name;
          private int age;
          //getter setter...
    
    }
    

    创建 BeanServlet 类的代码如下

        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取session对象传递数据或使用
            //request对象传递数据的效果都是一样的,这里主要是为读者演示使用session
            //传递数据的效果及写法
            HttpSession session = req.getSession();
            User user = new User();
            user.setName("张三");
            user.setAge(20);
            //将创建的user对象绑定到session对象中
            session.setAttribute("user",user);
            //转发到el.jsp
            req.getRequestDispatcher("el.jsp").forward(req,resp);
        }
    

    在 el.jsp 中添加如下代码。

    EL表达式获取 JavaBean 对象的属性值:<br>
    <!-- 语法解释:获取到作用域的 user 数据,再获取到 user 中的 name 属性值 -->
          ${user.name } <br>
    

    (6)获取集合中的值。

    EL 表达式获取集合的值:<br>
    <!-- 获取 map 中的数据,通过键获取值,若键不存在则不显示 -->
    我叫${map.name},今年${map.age}岁了, ${map.sex} <br>
    <!-- 获取list中的数据,通过下标获取,若下标不存在则不显示,不会抛出异常 -->
    ${list[0]}、${list[1]}、${list[2]} <br>
    

    5. JSP标准标签库(JSTL)

    EL 表达式无法处理所有的页面操作,如列表显示、条件判断显示等,通常会使用 EL 表达式与 JSP 标准标签库(JSP Standard Tag Library,JSTL)结合的方式完成这些功能。

    JSTL 是一个实现 Web 应用程序中常见通用功能的定制标签库集。

    JSP标准标签库 JSTL.菜鸟教程

  • 相关阅读:
    ExtJs 之 ComboBox级联使用
    JavaScript 面向对象(三) —— 高级篇
    JavaScript 面向对象(二) —— 案例篇
    JavaScript 面向对象(一) —— 基础篇
    手机进销存系统/供应链管理系统
    jQuery查找——parent/parents/parentsUntil/closest
    Echarts实现今日头条疫情地图和用户画像
    简版在线聊天Websocket
    推荐几个程序员常用的工具
    SpringBoot+Vue+ElementUI+动态菜单模版
  • 原文地址:https://www.cnblogs.com/john1015/p/13910298.html
Copyright © 2011-2022 走看看