• JSP学习笔记


    一,JSP简介

    • JSP---Java Server Pages
    • 拥有servlet的特性与优点(本身就是一个servlet)
    • 直接在HTML中内嵌JSP代码
    • JSP程序由JSP Engine先将它转换成Servlet代码,接着将它编译成类文件载入执行
    • 只有当客户端第一次请求JSP时,才需要将其转换、编译
    • 优点:
      • 优良的性能
        • 优于CGI,PHP,ASP
      • 平台无关性
        • 操作系统无关,Web服务器无关
      • 可扩展性
        •   tag的扩展机制,简化页面开发

    二,JSP基本语法

    JSP传统语法
    • Declaration 声明
    • Scriptlet  小程序段
    • Expression  表达式
    • Comment  注释
    • Directives  指令
    • Action 动作指令
    • 内置对象

    JSTL

    JSF

    1,JSP-Declaration

    基本语法:
      <%!  %>
      说明:在此声明的变量、方法都会被保留成唯一的一份,直到JSP程序停止执行
    body>
        <%! int count=0; %>//成员变量,相当于全局变量,因为jsp会先转换为servlet,servlet只new一个实例。可以定义方法
        <% int count2=0; %>//局部变量,不能定义方法
        <h>
            count:<%= ++count %><br>
            count2:<%= ++count2 %>
        </h>
      </body>

    2,Scriptlet

    基本语法:
       <%程序代码区%>
      可以放入任何的Java程序代码
    <!-- html注释,客户端源码可以看见 -->
      <%-- jsp注释 --%>
      <%
      // 注释1 java注释
      /*
          注释2
      */
      String bgColor=request.getParameter("bgColor");
      boolean hasColor;
      if(bgColor!=null){
          hasColor=true;
      }
      else{
          hasColor=false;
          bgColor="white";
      }
      %>
      <body BGCOLOR=<%= bgColor %>>
        <%
            if(hasColor){
                out.println("bgColor:"+bgColor);
            }
            else{
            out.println("background is white");
            }
         %>
      </body>

    3,表达式

    基本语法:
      <%=… …%>
      =后面必须是字符串变量或者可以被转换成字符串的表达式
      不需要以 ; 结束
      只有一行
    例:
      <%=“hello world”%>
      <%=i+1%>
      <%=request.getParameter(“name”)%>

     4,Derictive

    • Directive(编译指令)相当于在编译期间的命令
    • 格式:
      • <%@Directive 属性=“属性值”%>
    • 常见的Directive:
      • page
      • include
      • taglib
    a,Derictive-page
    指明与JSP Container 的沟通方式
    基本格式:
    <%@page language=“script language”|
    
      extends=“className”|
    
      import=“importList”|
    
      buffer=“none|kb size”|   --none:不缓冲,默认8k
    
      session=“true|false”|   --是否可以使用session,默认true
    
      autoFlush=“true|false”  --缓冲器是否自动清除,默认true
    
      isThreadSafe=“true|false”|  --默认false(永远不要设成true)
    
      info=“infoText”|    --任何字符
    
      errorPage=“errorPageUrl”|
    
      isErrorPage=“true|false”|
    
      contentType=“contentTyepInfo”|
      pageEncoding=“gb2312”
    
    %>

     b,Directive--include 编译期间的指令

    • 将指定的JSP程序或者HTML文件包含进来
    • 格式:
      •   <%@include file=“fileURL%>
    • JSP Engine会在JSP程序的转换时期先把file属性设定的文件包含进来,然后开始执行转换及编译的工作。(原封不动的把文件的代码copy到该位置,然后进行转换和编译,只生   成一个java和class)
    • 限制:
      • 不能向fileURL中传递参数
      • 不能abc.jsp?user=aaa

    5,Action

    Action(动作指令)在运行期间的命令
    常见的:
    • jsp:useBean
      •   jsp:setProperty
      •   jsp:getProperty
    • jsp:include
    • jsp:forward
      •   jsp:param
    • jsp:plugin
      •   嵌入applet

    a,jsp:include/jsp:param

    • 用于动态包含JSP程序或HTML文件等
    • 除非这个指令会被执行到,否则它是不会被Tomcat等JSP Engine编译。
    • 格式:
      •   <jsp:include page=“URLSpec” flush=“true”/>
      •   <jsp:include page=“URLSpec” flush=“true”>
        •       <jsp:param name=“ParamName” value=“paramValue”/>
      •     </jsp:include>
    • jsp:param用来设定include文件时的参数和对应的值
    • 和编译指令include的区别
      •   include编译指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入,然后再编译执行;而include指令在转换时期是不会被编译的,只有在客户端请求时期如果被执行到才会被动态的编译载入
      • Include不能带参数, 而<jsp:include>可以

    b,jsp:forward / jsp:param

    用于将一个jsp的内容传送到page所指定的JSP程序或者Servlet中处理(URL)
    格式:
    <jsp:forward page=“urlSpec” flush=“true”/>
    <jsp:forward page=“urlSpec”>

      <jsp:param name=“paramName” value=“paramValue”/>

     </jsp:forward>

    <jsp:param>用于指定参数和其对应的值
    例如:
    test.jsp
    forward.jsp / forforward.jsp 
    <jsp:forward page="forforward.jsp" />
    forward1.jsp / forforward1.jsp(with parameters)
    <jsp:forward page="forforward1.jsp">
        <jsp:param name="name" value="m" />
        <jsp:param name="oldName" value='<%=request.getParameter("name")%>' />
        <jsp:param name="roles" value="manager" />
    </jsp:forward>
    Forward的页面和forward到的页面用的是同一个request
    与此相对应的是
       response.sendRedirect
    <jsp:forward>与response.sendRedirect的区别
    • <jsp:forward>
    使用同一个request
    forward后的语句不会继续发送给客户端
    速度快
    服务器内部转换,
    可以传参数
    • response.sendRedirect
    是不同的request
    send后的语句会继续执行,除非return
    速度慢
    需要到客户端的往返,可以转到任何页面
    可以传参数,直接写在url后面
    c,jsp:useBean
    • 通过jsp:useBean,可以在JSP中使用定义好的Bean
    • Bean的基本要素:
      • 必须要有一个不带参数的构造器。在JSP元素创建Bean时会调用空构造器
      • Bean类应该没有任何公共实例变量,也就是说,不允许直接访问实例变量,变量名称首字母必需小写
      • 通过getter/setter方法来读/写变量的值,并且将对应的变量首字母改成大写
    • 基本用法:
      •   <jsp:useBean id="cb" class="bean.CounterBean" type="typeName" scope="page|request|session|application">       
          </jsp:useBean>
      • test.jsp/CounterBean.java 不要使用裸体类(规范要求)应该放在包里面
    <%@ page import="bean.*" %>
    
    <%--
    
    <% //response.sendRedirect("../servlet/ShowRs"); %>
    
    <% CounterBean cb = new CounterBean(); %>
    
    <font color="red" size="5">
        <%=cb.getCount()%>
    </font>
    --%>
    
    
    <jsp:useBean id="cb" class="bean.CounterBean">              <%-- 相当于 CounterBean cb = new CounterBean() --%>
    </jsp:useBean>
    
    <jsp:setProperty name="cb" property="count" value="23"/>     <%-- 相当于 cb.setCount(Integer.parseInt("23")) --%>
    <jsp:getProperty name="cb" property="count"/>                <%-- 相当于 out.print(cb.getCount()) --%>
        
        
    • jsp:useBean各项参数含义:
        id:对象实例名称
        scope:Bean作用的范围,默认为page,对整个jsp页面有效
        class:Bean类名称(全名)
        type:Bean实例类型,可以是本类,或其父类,或实现的接口,默认为本类
    • Scope各项参数的意义:
        page:仅涵盖使用JavaBean的页面,相当于局部变量
            PageBean.jsp/CounterBean.java)
        request:有效范围仅限于使用JavaBean的请求
          (RequestBean.jsp/RequestBean2.jsp/CounterBean.java)
        session:有效范围在用户整个连接过程中(整个会话阶段均有效)
          (SessionBean.jsp/Session2.jsp/CounterBean.java)
        application:有效范围涵盖整个应用程序。也就是对整个网站均有效
          (Application.jsp/Application2.jsp/CounterBean.java)
    • jsp:setProperty的格式:
        <jsp:setProperty name=“beanName”

          property=“propertyName” |property=“*”

          value=“property value” |param=“paramName”/>

        相当于beanName.setPropertyName(value)方法调用(setXxx()方法)
    • jsp:getProperty的格式:
        <jsp:getProperty name=“beanName” property=“propertyName”/>
        相当于beanName.getPropertyName()方法调用(getXxx()方法)
    • 建立表单参数和Bean属性之间的关联
        通过param指定表单元素的名称,通过perperty指定对应的Bean属性名称,由此建立这两个变量的关联
          (SaleEntry.jsp/SaleEntry.java,用url传递参数)
    <jsp:setProperty 
        name="entry"
        property="numItems"   
        param="numItems" />   //相当于<jsp:setProperty name="entry" property="numItems"  numItems=<%=reuest.getParameter("numItems")%> />
        通过*来设置所有属性和输入参数之间的关联
            (SayHelloBean.html/SayHelloBean.jsp/HelloBean.java)
    • 在建立Bean属性和表单参数之间的对应关系时,服务器会将对应的参数自动转换成和属性类型匹配的数据
    • 初步解释编码问题
      • <%=new String(hello.getName().getBytes("ISO8859_1"),"GBK")%>
      • request.setCharacterEncoding("gb2312");

    三,JSP内置对象

    JSP的内置对象
      out
      request
      response
      pageContext à用的很少
      session
      application
      config 用的很少
      exception
      Page 用的很少
    • JSP编程---out
        Out内置对象是一个缓冲的输出流,用来给客户端返回信息。它是javax.servlet.jsp.JspWriter的一个实例
        典型应用:向客户端输出内容
      常用方法:
        println():向客户端输出各种类型数据 write()
        newLine():输出一个换行符
        close():关闭输出流
        flush():输出缓冲区里的数据
        clearBuffer():清除缓冲区里的数据,同时把数据输出到客户端
        clear():清除缓冲区里的数据,但不把数据输出到客户端
        getBufferSize():返回缓冲区的大小
    • JSP编程--request
        request内置对象表示的是调用JSP页面的请求。通常,request对象是javax.servlet.http.HttpServletRequest接口的一个实例
        典型应用:通过request.getParameter(“paramName”)可以获得Form提交过来的参数值
        可以用此对象取得请求的Header、信息(如浏览器版本、语言和编码等)、请求的方式(get/post)、请求的参数名称、参数值、客户端的主机名称等
      常用方法:
        getMethod():返回客户端向服务器端传送数据的方法
        getParameter(String paramName):返回客户端向服务器端传送的参数值,该参数由paramName指定
        getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举类型数据(Enumeration)
        getParameterValues(String  name):获得指定参数的所有值,由name指定
        getRequestURI():获得发出请求字符串的客户端地址
        getRemoteAddr():获取客户端的IP地址
        getRemoteHost():获取客户端机器名称
        getServerName():获取服务器的名字
        getServletName():客户端所请求的脚本文件路径
        getServerPort():获取服务器端的端口
      对应类: javax.servlet.http.HttpServletRequest
    • JSP-response
        表示的是返回给客户端的响应
        是javax.servlethttp.HttpServletResponse接口的一个实例
        经常用于设置HTTP标题,添加cookie、设置响应内容的类型和状态、发送HTTP重定向和编码URL
      常用方法:
        addCookie(Cookie cookie):添加一个Cookie对象,用于在客户端保存特定的信息
        addHeader(String name,String value):添加HTTP头信息,该Header信息将发送到客户端
        containsHeader(String name):判断指定名字的HTTP文件头是否存在
        sendError(int):向客户端发送错误的信息
        sendRedirect(String url):重定向JSP文件
          和<jsp:forward>的区别
            sendRedirect通过客户端发起二次申请,不同的request对象
            Jsp:forward是同一个request,在服务器内部转发
        setContentType(String contentType):设置MIME类型与编码方式
    • JSP-Cookie
        Http协议的无连接性要求出现一种保存C/S间状态的机制
        Cookie:保存到客户端的一个文本文件,与特定客户相关
        Cookie以“名-值”对的形式保存数据
        通过getName和getValue的方式得到相应的名字和值
    • JSP—session & application
        <% @page session=“true”%>(默认)--表示session功能已经在jsp页面中启动
      session常用方法:
        void setAttribute(String name,Object value)
        Object getAttribute(String name)
        boolean isNew()
      application
        ServletContext
    四,Servlet和JSP的通信
    • 从JSP调用Servlet可用<jsp:forward>
         请求信息自动传递到Servlet
         或者通过sendRedirect
    <jsp:forward page="/servlet/ServletToJSP" />
    <%
    response.sendRedirect("../servlet/ShowParameters?a=b");
    %>
    • 从Servlet调用JSP使用
        RequestDispatcher接口的forward(req, res)方法
        请求信息需要显式传递(在req、res参数中)
        或者通过sendRedirect
    public class ServletToJSP extends HttpServlet {
        public void doGet (HttpServletRequest req,HttpServletResponse resp) {
            try {
                // 设置属性并将它提交给ServletUseJsp.jsp
                resp.setContentType("text/html;charset=gb2312");
                req.setAttribute ("servletName", "ServletToJsp");
                getServletConfig().getServletContext().getRequestDispatcher
                ("/servlet_jsp/ServletUseJsp.jsp").forward(req, resp);
            //.forward(req, resp)把servlet的请求发送到另一个页面
            //.include(req, resp)把另一个页面的内容包含在response中
    }
    catch (Exception e){ e.printStackTrace (); } } }
      例如:
        FromJspToServlet.jsp / ServletToJsp.java / ServletUseJsp.jsp
        forward可以用 ”/” 路径, 是指web app的根路径, servlet forward jsp的时候一定要用 “/”开头
        jsp sendRedirect到servlet应该用相对路径,因为这里”/”指网站的根路径 ,servlet sendRedirect jsp也是
  • 相关阅读:
    vue列表渲染之基本列表
    vue之列表排序计算属性的应用
    IDEA部署远程部署docker
    springboot多数据源《二》
    docker容器之间的通信方式
    batocera添加游戏
    DarwinStreamingServer
    ffmepg,视频流,Darwin Streaming Server, EasyDarwin
    @Cacheable unless的写法,绕不开的SpEL
    绘文字emoji
  • 原文地址:https://www.cnblogs.com/enjoy-life-clh/p/4044481.html
Copyright © 2020-2023  润新知