JSP

作者: 一只96年的程序猿 | 来源:发表于2018-08-26 16:51 被阅读0次

    JSP概述

    由sun公司提供的动态web资源的开发技术。本质上是一个servlet.

    [toc]

    1.JSP由来

    JSP的出现是为了解决Servlet在响应时不适合向外输出页面的问题.

    • Servlet本质上是一段java代码,非常适合处理逻辑,但是处理的结果不太适合由Servlet向外输出(不适合输出完整的html页面)。
    • HTML是用于开发网页的一门技术,可以用来展示数据。但是HTML开发出来的页面本质上就是一个文档(静态资源),无法展示动态的数据
    • JSP非常适合编写HTML代码,适合作为响应页面向外输出,同时JSP里可以写java代码,也可以展示动态的数据
    • 所以JSP的出现既可以解决Servlet不适合向外响应一个完整的页面又可以解决html无法展示动态数据的问题
    • JSP在第一次访问时,会被翻译成一个Servlet,对JSP访问后看到的页面 其实就是翻译后的Servlet在向外输出

    2.JSP执行过程


    3.JSP语法

    模板元素

    直接写在jsp页面中的html内容称之为jsp页面的模板元素

    模板元素在翻译后的Servlet中,直接被out.write原样输出到浏览器。

    JSP表达式

    格式: ==<%= 表达式 %>== 其中可以书写常量、变量、表达式


    作用:JSP表达式在翻译后的Servlet中是执行表达式的值再原样输出到浏览器

    <%= "Hello JSP" %>
    <%= 153+231 %>
    

    JSP脚本片段

    格式:==<% java语句 %>==

    作用:在翻译过来的servlet中,脚本片段中的Java代码被复制粘贴到对应的位置执行

    <% for(int i = 0;i<10;i++){ %>
        Hello JSP...<br/>
    <% } %>
    

    JSP注释

    格式:==<%-- JSP注释 --%>==

    注意: 注释不能交叉嵌套!!

    JSP指令

    用于指挥JSP解析引擎如何来翻译当前JSP页面中其它部分的内容

    (1)page指令

    用来声明当前JSP页面的基本属性的,page指令可以写在JSP页面的任意位置,但是为了可读性考虑,一般情况下最好放在JSP页面的最前面

    格式:==<%@ page ... %>==

    (1)<%@ page language="java" %> -- 指定当前JSP使用的语言是java.(了解即可)

    (2)<%@ page pageEncoding="UTF-8"%> -- 用来通知JSP解析引擎使用指定的编码来翻译JSP。如果想防止JSP乱码,应该要保证JSP文件保存时的编码和pageEncoding指定的编码保持一致。

    (3)<%@ page session="true"%> -- 用来指定当前页面是否使用session,如果设置为true,则翻译过来的servlet中将会有对session对象的引用,于是可以直接在JSP中使用session隐式对象。但
    是这将导致一旦访问JSP就会调用request.getSession()方法,可能导致不必要的空间浪费。如果确定JSP中不需要session可以设为false.

    (4)<%@ page errorPage="filepath"%> -- 为当前JSP页面指定友好错误提示页面,即当前JSP如果抛出了异常,将会跳转到errorPage属性指定的页面。

    (5)<%@ page import="..."%> -- 为JSP翻译后的Servlet指定所依赖的jar包

    <%@page import="java.util.Date"%>
    <%@page import="java.io.File" %>
    <%@page import="java.sql.DriverManager"%>
    
    (2)include指令

    可以实现页面包含的效果

    格式: ==<%@ include file="" %>==

    (3)taglib指令

    引入JSTL标签库

    4.JSP的九大隐式对象

    JSP翻译引擎在将JSP翻译成servlet的过程中,在servlet里预先定义了九个对象,因此我们可以在JSP页面中直接使用这九个对象

    隐式对象 info
    page this
    request ServletRequest
    response ServletResponse
    application ServletContext
    config ServletConfig
    session HttpSession
    exception
    out 等价于response.getWriter()
    pageContext

    pageContext

    代表当前JSP页面的运行环境的对象,通过该对象可以访问页面中的共享数据

    (1).pageContext对象可以获取其他八大隐式对象
    (2).pageContext是一个域对象
    方法 相关描述
    setAttribute(String name,Object value) 添加一个域属性
    getAttribute(String name) 根据指定的属性名获取属性值.
    removeAttribute(String name) 根据指定的属性名删除一个属性.

    生命周期:当访问JSP开始时创建pageConext对象,当访问JSP结束时销毁pageContext对象.

    作用范围: 整个JSP页面

    主要功能: 在整个JSP页面中实现数据的共享

    四大作用域范围: ServletContext > Session > Request > pageContext

    5.JSP标签技术

    于是在JSP的2.0版本中,sun提出了JSP标签技术,推荐使用标签来代替JSP页面中java代码,并且推荐,JSP2.0以后不要在JSP页面中出现任何一行java代码

    EL表达式

    EL表达式在JSP中可以非常方便的获取数据,可以代替JSP页面中的JSP表达式(<%= %>)

    基本结构: ${ 表达式 }

    EL只能获取不能设置!!!


    EL只能获取不能遍历!!!

    (1) 获取常量/变量(必须存入域中)/表达式的值
        ${ "Hello EL" }
        ${ 123+456 }
        
        <br/>
        <%= "Hello EL" %>
        <%= 123+456 %>
        
        <hr/>
        <% String name = "赵云"; %>
        
        <%= name %>
        <%-- 上面通过JSP表达式获取name, 是在当前JSP运行环境
            中获取名称为name的变量的值 --%>
        
        <%
            request.setAttribute("name", "request张飞");
            session.setAttribute("name", "session张飞");
        %>
        ${ name }
        <%-- 通过EL获取name, 是在四大域中寻找名称为name的属性
            值, 如果找到就返回name属性的值, 如果找不到就什么
            也不输出!!
            在寻找时, 是按照从小到大的顺序到四大域中寻找指定
            名称的属性值!!
         --%>
    
    (2)获取域中数组或集合中的数据
       <%
            String[] names = 
                { "王海涛", "齐雷", "陈子枢", "刘沛霞" };
            request.setAttribute("names", names);
        %>
        ${ names[0] }
        ${ names[1] }
        ${ names[2] }
        ${ names[3] } 
    
    (3)获取域中map集合中的数据
        <%
            Map map = new HashMap();
            map.put("name", "刘德华");
            map.put("age", 18);
            map.put("nickname", "Andy");
            
            request.setAttribute("map", map);
        %>
        ${ map.name }
        ${ map.age }
        ${ map.nickname }
    

    JSTL标签库

    (1)c:set标签
    • 往域中添加一个域属性
    <c:set var="name" value="张三丰" scope="request"/>
        ${ name }
    
    • 修改域中已有的域属性
    <c:set var="name" value="张无忌" scope="request"/>
        ${ name }
    
    • 修改域中map集合中的元素
        <%
            Map map = new HashMap();
            map.put("name", "刘德华");
            map.put("age", 18);
            map.put("nickname", "Andy");
            
            request.setAttribute("map", map);
        %>
        修改前: 
        ${ map.name }
        ${ map.age }
        ${ map.nickname } 
        <hr/>
        <c:set target="${map}" property="name" value="阿凡达"/>
        <c:set target="${map}" property="nickname" value="小达达"/>
        修改后:
        ${ map.name }
        ${ map.age }
        ${ map.nickname }
    
    (2)c:if标签
        <c:if test="${ 3>5 }">yes</c:if>
        <c:if test="${ !(3>5) }">no</c:if>
        
        <!-- 模拟判断用户是否登录 -->
        <%
            session.setAttribute("user", "张三");
            session.removeAttribute("user");
        %>
        <c:if test="${ user == null }">
            <a href="#">您好, 请登录...</a>
        </c:if>
        <c:if test="${ user != null }">
            欢迎, ${ user } 回来...
        </c:if>
    
    (3)c:forEach标签
    • 遍历域中的数组或集合中的元素
        <%
            List list = new ArrayList();
            list.add("张三");
            list.add("李四");
            list.add("王五");
            list.add("刘能");
            request.setAttribute("list", list);
            
            for(Object o : list){
                System.out.println(o);
            }
        %>
        <c:forEach items="${list}" var="o">
            ${ o }<br/>
        </c:forEach>
    
    • 遍历域中的map集合中的元素
        <%
            Map<Object, Object> map = new HashMap();
            map.put("name", "刘德华");
            map.put("age", 18);
            map.put("nickname", "Andy");
            request.setAttribute("map", map);
            
            for(Map.Entry<Object,Object> e : map.entrySet()){
                System.out.print(e.getKey() + " : ");
                System.out.println(e.getValue());
            }
        %>
        <c:forEach items="${map}" var="entry">
            <%-- ${ entry.getKey() } : ${ entry.getValue() } <br/> --%>
            ${ entry.key } : ${ entry.value } <br/>
        </c:forEach>
    
    • varStatus 用于指定表示循环状态信息的对象
    参数 相关描述
    first Boolean,当前被遍历元素是否是第一个
    last Boolean,当前被遍历的元素是否是最后一个
    count 数值,当前被遍历元素是第几个
    index 索引,当前被遍历元素的索引值()

    相关文章

      网友评论

          本文标题:JSP

          本文链接:https://www.haomeiwen.com/subject/llvoiftx.html