zoukankan      html  css  js  c++  java
  • JSP

    JSP

    一、Jsp简介

    JSP(全称JavaServer Pages)java服务器页面。 是一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。

    JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求,是简化版的Servlet。
    执行的过程为 xxx.jsp---->xxx.java---->xxx.class

    二、使用策略

    1.纯碎的HTML使用
      语法和使用HTML的用法完全一样,可以包含css,javaScript,Jquery等
    2.纯粹的Servlet使用
      以<% java代码片段 %>写法显示在jsp页面,相当于Servlet中的service方法 如果是Java代码写成什么样显示什么样
    3.HTML + Servlet使用
      如果写的html代码 相当于 out.write("<a></a>")
    但是我们需要注意:
    	jsp 只用来显示数据  不处理业务
    	Servlet 只处理业务
    

    代码示例:

    <%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.Date" %>
    <html>
    <head>
        <title>Title</title>
        <style>
            div{
                border:1px solid red;
                height: 200px;
                 200px;
            }
        </style>
    </head>
    <body>
        <!--纯粹的html演示-->
        <div>div区域块</div>
        <!--servlet使用演示-->
        <% Date d = new Date();
            System.out.print(d);
        %>
        <%=new Date()%>
        <%=d%>
    </body>
    </html>
    

    演示效果:

    image

    通过以上案例可以看出在jsp中的html内容和java代码都生效了,编译之后的文件看下图:
    

    image

    三、Jsp核心

    Jsp的内容包含除了以上的html,css,js,jquery,java代码外,还可以包含JSP相关指令,主要作用用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。

    1、三大指令

    ① page指令

    <%@page 属性名="值" 属性名="值" %> 控制整个jsp页面的配置信息
    language="java" 支持的语言
    contentType="text/html; charset=UTF-8" 内容类型
    pageEncoding="UTF-8" 页面的编码格式
    import="java.util.List,java.util.ArrayList" 导入jar

    ② include指令

    页面包含说的是一个页面可以包含另一个页面的内容,并且能正常加载。
    语法:<%@include file=”被包含的页面名称” %>

    案例:
    top.jsp
    

    image

    bottom.jsp页面代码:
    

    image

    index..jsp页面代码(包含top.jsp和bottom.jsp):
    

    image

    演示效果:

    image

    include指令的主要作用:可以将页面公共的部分提取出来,让每个页面包含这个公共的页面,一是为了减少代码量,二是易于后续的维护。
    
    ③ taglib指令
    后面使用JSTL标准标签库时使用。
    语法:<%@taglib prefix="前缀" uri="引入外部标签库的路径" %>
    

    2、九大内置对象

    内置对象:也称隐式对象,在jsp中,已经初始化好并且给我们封装好了,不需要程序员创建,可以直接使用的对象就是内置对象。
    对象名                  功能                                 类型
    Out					页面输出对象                            JspWriter
    Exception			异常处理对象                            Throwable
    Page				描述页面的对象                           Object
    PageContext			页面对象【作用域】                       PageContext
    Request				请求对象【作用域】                       HttpServletRequest   
    Response			响应对象                               HttpServletResponse
    Session				会话对象【作用域】                       HttpSession
    Config				配置                                   ServletConfig
    Application			服务器对象【作用域】                      ServletContext
    这些内置对象在Jsp页面都是存在的,我们可以直接使用;
    

    这里默认能显示的内置对象共8个,还有一个特殊的对象Exception关于异常的,只有在page指令中设置isErrorPage="true"时才会显示。
    可以通过以下方式获取:
    pageContext.getException() //获取异常对象

    对象详解:

    1.application相当于之前的ServletContext 对象可将信息保存在服务器中,直到服务器关闭。

    2.request 代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。request对象的作用域为一次请求。

    3.response 代表客户端的响应信息,主要是将JSP容器处理过的对象信息返回到客户端。

    4.config 对象的主要作用是取得服务器的配置信息。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。

    5.page:当前jsp页面的实例,相当于this关键字。

    6.session:会话对象。session 对象是由服务器自动创建与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。其作用范围为一次会话。

    7.exception对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用。

    8.out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。JSP中的out对象是JspWriter类型。

    9.pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,
    可以获取项目的根目录,还可通过getXXX()获取其他内置对象

    jsp中一共有四个域对象  pageContext request  session  application
    Servlet一共有三个域对象            request  session ServletContext
    在Servlet中能够直接使用的对象 只有request、response
    

    3、四大作用域

    为了在页面、请求、和用户之间传递和共享数据,JSP提供了四个不同的作用域:pageContext(页面作用域)、request(请求作用域)、session(会话作用域)、application(应用程序作用域),这些作用域就规定了数据可以传递和共享的范围以及数据的存活时间。

    作用域详解

    1.application 作用域
    如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。
    整个应用是指从应用启动,到应用结束。

    application作用域上的信息传递是通过ServletContext实现的,它提供的主要方法如下所示:
    Object getAttribute(String name) //从application中获取信息;
    void setAttribute(String name, Object value) //向application作用域中设置信息。

    2.session作用域
    如果把变量放到session里,它的有效范围是当前会话。所谓当前会话,就是指从用户打开
    浏览器开始,到用户关闭浏览器这中间的过程。

    Object HttpSession.getAttribute(String name) //从session中获取信息。
    void HttpSession.setAttribute(String name, Object value)//向session中保存信息。
    HttpSession HttpServletRequest.getSession() //获取当前会话session对象。

    3.request作用域
    一它的有效范围是当前请求周期。 所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量。

    Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的:
    void setAttribute(String name, Object value)//将对象value以name为名称保存到request作用域中。
    Object getAttribute(String name) //从request作用域中取得指定名字的信息。

    4.pageContext作用域
    page对象的作用范围仅限于用户请求的当前页面,对于page对象的引用将在响应返回给客户端之后被释放,或者在请求被转发到其他地方后被释放。page里的变量只要页面跳转了,它们就不见了。如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量。

    代码示例:

    
    <%--
      Created by IntelliJ IDEA.
      User: Administrator
      Date: 2021/9/8
      Time: 16:23
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>jsp四大作用域</title>
    </head>
    <body>
    
    <%
        //值存储到pageContext作用域中
        pageContext.setAttribute("a","pageContext");
        //值存储到request作用域
        request.setAttribute("b","requestContext");
        //值存储到session作用域中
        session.setAttribute("c","session");
        //值存储到application作用域
        application.setAttribute("d","application");
        //重定向到testFour.jsp
        //response.sendRedirect("testFour.jsp");
        //转发到testFour.jsp
        request.getRequestDispatcher("testFour.jsp").forward(request,response);
    %>
    
    
    </body>
    </html>
    
    
    
    <%--
      Created by IntelliJ IDEA.
      User: Administrator
      Date: 2021/9/8
      Time: 16:26
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>测试四个作用域</title>
    </head>
    <body>
    
    <!-- 四大作用域范围排序  pageContext < request < session < application -->
    <!-- servlet三大作用域排序   request < session < ServletContext   -->
    <%=pageContext.getAttribute("a")%>  <br>
    <%=request.getAttribute("b")%>  <br>
    <%=session.getAttribute("c")%>  <br>
    <%=application.getAttribute("d")%>  <br>
    
    
    </body>
    </html>
    
    

    4、EL表达式

    ① 简介

    EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
    ${} $

    ② 作用
    是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)通过以下方式:
    在JSP页面的任何静态部分均可通过:${expression}来获取到指定表达式的值
    el表达式可以获取四个作用域中的值
    包含以下几种方式:
    ${绑定名} 获取javaBean对象或者其他类型数据
    ${绑定名.属性名} 获取javaBean中对应的属性名
    ${绑定名[索引值]} 获取集合或者数组中对应的值
    ${绑定名["key"]} 通过key的值获取在Map中对应的value值
    
    同样也可以在el表达式内部做一些简单的运算:
    

    image

    代码示例:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>el基本运算</title>
    </head>
    <body>
         <!--基本运算-->
         加法运算:${3+2} <br>
         减法运算:${3-2} <br>
         乘法运算:${3*2} <br>
         除法运算:${3/2} <br>
         取余运算:${3%2} <br>
         <!--逻辑运算-->
         与:${5>4 && 7>8} <br>
         或:${5>4 || 7>8} <br>
         非:${! 5>4 } <br>
         非:${not (5>4) } <br>
         <!--三元运算-->
         三元运算:${5>4?"呵呵":"哈哈"}
        <!-- 空运算符 判断是否为空,如果为空则为true,否则为false-->
        ${empty uname}
    </body>
    </html>
    

    演示效果:

    image

    ③ 原理

    依次从四大作用域对象检索对应的绑定名,如果在某一个对象中获取到了,则不再去其他对象检索,否则继续检索,如果都没有查找到则返回的是一个空字符串,而不是null
    如果如下操作时:以表达式${user.name}为例
    EL表达式会根据name去User类里寻找这个name的get方法,此时会自动把name首字母大写并加上get前缀,一旦找到与之匹配的方法,El表达式就会认为这就是要访问的属性,并返回属性的值。
    所以,想要通过EL表达式获取对象属性的值,那么这个属性就必须有与之对应的get方法。

    可以通过指定检索四大作用域对象来提升检索速度,如下:
    application-->applicationScope
    session-->sessionScope
    request-->requestScope
    pageContext-->pageScope
    比如:
    ${requestScope.user} 表示直接去request对象中获取user绑定名对应的值
    
    ④ 案例
    分别获取javaBean,javaBean属性,Map值,List,数组类型的值
    代码示例:
    
    package com.offcn.web;
    
    import com.offcn.entity.Student;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    import java.util.Arrays;
    
    @WebServlet("/testEl")
    public class ElServlet extends HttpServlet {
    
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //保存javaBean
            req.setAttribute("student",new Student(1,"黄二",20));
    
            //保存数组
            req.setAttribute("stuArr",new Student[]{ new Student(1,"黄二",20) , new Student(2,"黄三",21) });
    
            //保存list
            req.setAttribute("stuList", Arrays.asList(new Student(1,"黄二",20) , new Student(2,"黄三",21)) );
            req.getRequestDispatcher("el.jsp").forward(req,resp);
        }
    }
    
    
    <%--
      Created by IntelliJ IDEA.
      User: Administrator
      Date: 2021/9/8
      Time: 16:39
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    
    
    <!-- 使用el表达式获取复杂类型 -->
    
    <p> ${student.name} -- ${student.age} -- ${student.id}</p>
    
    <p>${stuArr[0].name}--${stuArr[1].name}</p>
    
    <p>${stuList[0].name } -- ${stuList[1].name}</p>
    
    </body>
    </html>
    
    

    5.JSTL标签库

    ① 简介

    JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库。它主要提供给JavaWeb开发人员一个标准通用的标签,开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
    需要注意的是:jstl中需要获取值的地方一般都要配合EL表达式去使用

    ② 使用
    1) 导入
    jstl.jar  standard.jar 两个包
    
    2) 引入
    将标签库引入 页面中
    <%-- 引入标签库 --%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
    3) 常用标签
    1.<%--声明变量标签--%>
    <c:set var="name" value="柳岩"></c:set>
        var:声明的变量名
        value:变量的值
    
    2.<%--输出标签--%>
    <c:out value="${name}" ></c:out>
    value:要输出的变量的值,需要通过el表达式获取
    
    3.<%--删除声明变量--%>
    <c:remove var="name"></c:remove>
    var:删除要删除的变量的名字
    
    4.<%--if单分支标签--%>
    <c:if test="${empty name}">测试if分支标签1</c:if>
    test:当值为true的时候显示标签内部的值,否则不显示
    
    5.<%--choose多分支标签--%>
    <c:choose>
       <c:when test="${1>2}">第一个条件的标签内容</c:when>
       <c:when test="${3>2}">第二个条件的标签内容</c:when>
       <c:otherwise>以上条件都不满足的标签内容</c:otherwise>
    </c:choose>
    当when标签的test的值为true的时候,显示标签内容,否则不显示,当多个when标签都为true的时候,值显示第一个为true的when标签内容,如果以上when标签都为false则显示otherwise的标签内容
    注意:
       when标签出现至少一个
       otherwise标签最多出现一个
    6.<%--集合或者数组的遍历标签--%>
    <c:forEach items="" var="" >
    
    </c:forEach>
    items:要遍历的集合或者数组对象,需要通过el表达式获取
    var:循环变量,可以理解为集合或者数组中的每一个值或者对象,名称自定义
    

    代码示例:

    <%@ page import="java.util.ArrayList" %>
    <%@ page import="java.util.List" %><%--
      Created by IntelliJ IDEA.
      User: Administrator
      Date: 2021/7/16
      Time: 9:03
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    
    <%
    //    request.setAttribute("name","jack");
    //    Object name = request.getAttribute("name");
    //    out.print(name);
    //     request.removeAttribute("name");
    %>
    
    
    <!-- 存值标签
        score  作用域 (page、request、session、application)
        var    key      变量名
        value  value    变量值
        相当于   request.setAttribute("name","jack");
     -->
    <c:set scope="request" var="name" value="rose"></c:set>
    <!-- 移除值 标签
        相当于  request.removeAttribute("name");
     -->
    <c:remove var="name" scope="request"></c:remove>
    <!-- 输出标签
        相当于 out.print()
     -->
    <c:out value="${name}" default="服务器有bug"></c:out>
    
    <!-- if分支标签
        相当于 if(){}
     -->
    <c:if test="${3>4}">
        <c:out value="没有作业"></c:out>
    </c:if>
    
    
    <c:set scope="request" var="money" value="70"></c:set>
    
    <!-- choose 多分支选择标签
        相当于 if...else if...else
    
    -->
    <c:choose>
        <c:when test="${money>100}">
            <c:out value="买一台宝马X6"></c:out>
        </c:when>
        <c:when test="${money>50}">
            <c:out value="买一台捷安特"></c:out>
        </c:when>
        <c:otherwise>
            <c:out value="那就骑共享单车"></c:out>
        </c:otherwise>
    </c:choose>
    
    <!-- 循环   简单for循环  -->
    <%--<c:forEach begin="1" end="10" step="1" varStatus="status">--%>
    <%--    &lt;%&ndash;<p>今天是7月16号</p>&ndash;%&gt;--%>
    <%--    ${status.current}--%>
    <%--</c:forEach>--%>
    
    <%
        List list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        request.setAttribute("content",list);
    
    %>
    
    <!-- 循环 遍历 集合
        items:  作用域中需要遍历的集合对象,一把配合el表达式获取使用
        var  :   使用var给集合中的元素命名,把这些元素存放到作用域中,一般配合el表达式使用
     -->
    
    <c:forEach var="str" items="${content}">
        <c:out value="${str}"></c:out>
    </c:forEach>
    
    </body>
    </html>
    
    
  • 相关阅读:
    【转】P2P通信原理与实现(C++)
    【转】P2P通信标准协议(二)之TURN
    【转】P2P之UDP穿透NAT的原理与实现
    【转】P2P的原理和常见的实现方式
    【转】linux中man使用技巧
    【转】go编译时,加入svn版本信息
    各种移动GPU压缩纹理的使用方法
    Unity贴图压缩格式设置
    关于U3D贴图格式压缩
    可能会导致.NET内存泄露的8种行为
  • 原文地址:https://www.cnblogs.com/conglingkaishi/p/15256318.html
Copyright © 2011-2022 走看看