JSP的刨根问底

2020-3-22    前端达人

JSP的刨根问底

  • 一.概念
  • 二.原理
  • 三.脚本
  • 四.内置对象
  • 五.注释
  • 六.编译指令
  • 七.动作指令


  • 点击查看原图


    这篇文章从一个初学者的角度,复习一波JSP。






    一.概念
    Java Server Pages: java服务器端页面

    可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
    用于简化书写!!!
    二.原理
    本质是一个Servlet

    三.脚本
    定义:Jsp定义java代码的方式

    <% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
    <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
    <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
    四.内置对象
    对象名 实现接口或继承类 作用
    PageContext 当前页面共享数据,还可以获取其他八个内置对象
    request HttpServletRequest 一次请求访问的多个资源(转发)
    session HttpSession 一次会话的多个请求间
    application ServletContext 所有用户间共享数据
    response HttpServletResponse 响应对象
    page Object 当前页面(Servlet)的对象 this
    out JspWriter 输出对象,数据输出到页面上
    config ServletConfig Servlet的配置对象
    expection Throwable 异常对象
    五.注释
    1.html注释
    <!-- -->:只能注释html代码片段
    2.jsp注释
    <%-- --%>:可以注释所有

    六.编译指令
    作用
    用于配置JSP页面,导入资源文件

    格式
    <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
    分类
    1.page
    配置JSP页面的
    1. contentType:等同于response.setContentType()
    *设置响应体的mime类型以及字符集
    * 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
    2.import:导包
    3. errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
    4.isErrorPage:标识当前也是是否是错误页面。
    * true:是,可以使用内置对象exception
    * false:否。默认值。不可以使用内置对象exception
    2.include
    页面包含的。导入页面的资源文件

     <%@include file="top.jsp"%>
    3.导入资源
    导入资源

     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      prefix:前缀,自定义的
    1
    七.动作指令
    作用
    动作指令与编译指令不间,编译指令是通知 Servlet 引擎的处理消息,而动作指令只是运行时的脚本动作。编译指令在将JSP 编译成 Servlet 时起作用:处理指令通常可替换成 Java脚本,是 JSP脚本的标准化写法。

    分类
    指令 作用
    jsp:forward 执行页面转向,将请求的处理转发到下一个页面。
    jsp:param 用于传递参数,必须与其他支持参数曲标签一起使用。
    jsp:include 用于动态引入一个 JSP 页面。
    jsp:plugin 用于下载 JavaBean 或 Applet 到客户端执行。
    jsp:useBean 使用 JavaBean。
    jsp:setProperty 修改 JavaBean 实例的属性值。
    jsp:getProperty 获取 JavaBean 实例的属性值。
    具体细节:
    jsp:forward:
    动作把请求转到另外的页面。可以转发静态的HTML页面,也可以转发动态的JSP页面,或者转发到容器中的servlet jsp:forward标记只有一个属性page。 page属性包含的是一个相对URL。 page的值既可以直接给出,也可以在请求的时候动态计算。

    jsp:param
    用于设定参数值,这个指令不能单独使用 可以与以下三个指令结合使用:
    jsp:include :用于将参数值出入被导入页面
    jsp:forword : 用于将参数值传入被转向页面
    jsp:plugin : 用于将参数值传入页面中javaBean的实例

    jsp:include
    (拿目标页面插入原有页面)该动作是一个动态的include指令,也用于带入某个页面,他不会导入被include页面的编译指令,仅仅导入页面的body内容插入到本页面
    该动作把指定文件插入正在生成的页面。其语法如下:   flush:用于指定输出缓存是否转移到被导入的文件中, true:包含在被导入的文件中 false:包含在源文件中
    前面已经介绍过include指令,它是在JSP文件被转换成Servlet的时候引入文件,而这里的jsp:include动作不同,插入文件的时间是在页面被请求的时候。j
    sp:include动作的文件引入时间决定了它的效率要稍微差一点,而且被引用文件不能包含某些JSP代码(例如不能设置HTTP头),但它的灵活性却要好得多。
    jsp:plugin

    用于下载服务器端的javaBean或applet到客户端)
    jsp:plugin动作用来根据浏览器的类型,插入通过Java插件运行Java Applet所必需的OBJECT或EMBED元素。

    <jsp:plugin  
      type="bean | applet"   : 被执行的java程序的类型
      code="classFileName" :被执行的文件名,必须以  .class 结尾
      codebase="classFileDirectoryName"   :被执行文件的所在目录
      [ name="instanceName" ] :给程序起一个名字用来标识该程序
      [ archive="URIToArchive, ..." ] :指向一些要预先载入的将要使用到的类
      [ align="bottom | top | middle | left | right" ] :
      [ height="displayPixels" ]
      [ width="displayPixels" ]
      [ hspace="leftRightPixels" ] 
      [ vspace="topBottomPixels" ]
      [ jreversion="JREVersionNumber | 1.1" ]   :能正确运行改程序必须的JRE的版本
      [ nsplug inurl="URLToPlugin" ]  
      [ iepluginurl="URLToPlugin" ] >
      [ <jsp:params>
      [ <jsp:param name="parameterName" value="{parameterValue | <%= expression %>}" /> ]+
      </jsp:params> ]
      [ <jsp:fallback> text message for user </jsp:fallback> ]  :当不能正确显示该Applet时,显示该指令中的文本提示
     <jsp:plugin>
    



    jsp:useBean
    useBean:用于在jsp页面中初始化一个java实例(如果多个jsp中需要重复使用某段代码,可以把这段代码定义成java类在页面中引用)
    jsp:useBean动作用来装载一个将在JSP页面中使用的JavaBean。这个功能非常有用,因为它使得我们既可以发挥Java组件重用的优势,同时也避免了损失JSP区别于Servlet的方便性。
    jsp:useBean动作最简单的语法为:<jsp:useBean id=“JavaBean的名称” class=“package.class"包名.类名” scope=“有效范围”/>

    这行代码的含义是:“创建一个由class属性指定的类的实例,然后把它绑定到其名字由id属性给出的变量上”。不过,就象我们接下来会看到的,定义一个scope属性可以让Bean关联到更多的页面,它可接受四个值:request、session、page、application。此时,jsp:useBean动作只有在不存在同样id和scope的Bean时才创建新的对象实例,同时,获得现有Bean的引用就变得很有必要。
    获得Bean实例之后,要修改Bean的属性既可以通过jsp:setProperty动作进行,也可以在Scriptlet中利用id属性所命名的对象变量,通过调用该对象的方法显式地修改其属性。这使我们想起,当我们说“某个Bean有一个类型为X的属性foo”时,就意味着“这个类有一个返回值类型为X的getFoo方法,还有一个setFoo方法以X类型的值为参数”。  有关jsp:setProperty动作的详细情况在后面讨论。但现在必须了解的是,我们既可以通过jsp:setProperty动作的value属性直接提供一个值,也可以通过param属性声明Bean的属性值来自指定的请求参数,还可以列出Bean属性表明它的值应该来自请求参数中的同名变量。
    在JSP表达式或Scriptlet中读取Bean属性通过调用相应的getXXX方法实现,或者更一般地,使用jsp:getProperty动作。
    注意,包含Bean的类文件应该放到服务器正式存放Java类的目录下,而不是保留给修改后能够自动装载的类的目录。例如,对于Java Web
    Server来说,Bean和所有Bean用到的类都应该放入classes目录,或者封装进jar文件后放入lib目录,但不应该放到servlets下。
    id:javaBean的实例名 class: javaBean的实现类 scope:指定javaBean实例的生存范围
    page:javaBean仅在该页面有效 request:javaBean在本次请求中有效 session:
    javaBean在本次session内有效 application:
    javaBean在本应用内一直有效  下面是一个很简单的例子,它的功能是装载一个Bean,然后设置/读取它的message属性。
    关于jsp:useBean的进一步说明   使用Bean最简单的方法是先用下面的代码装载Bean:   <jsp:useBean id=“name” class=“package.class” />
    然后通过jsp:setProperty和jsp:getProperty修改和提取Bean的属性。 不过有两点必须注意。   第一,我们还可以用下面这种格式实例化Bean: <jsp:useBean …>   Body   </jsp:useBean>
    它的意思是,只有当第一次实例化Bean时才执行Body部分,如果是利用现有的Bean实例则不执行Body部分。正如下面将要介绍的,jsp:useBean并非总是意味着创建一个新的Bean实例。
    第二,除了id和class外,jsp:useBean还有其他三个属性,即:scope、type、beanName。
    id:命名引用该Bean的变量。如果能够找到id和scope相同的Bean实例,jsp:useBean动作将使用已有的Bean实例而不是创建新的实例。
    class:指定Bean的完整包名。
    scope:指定Bean在哪种上下文内可用,可以取下面的四个值之一:page、request、session和application。  默认值是page,表示该Bean只在当前页面内可用(保存在当前页面的PageContext内)。
    request表示该Bean在当前的客户请求内有效(保存在ServletRequest对象内)。
    session表示该Bean对当前HttpSession内的所有页面都有效。
    最后,如果取值application,则表示该Bean对所有具有相同ServletContext的页面都有效。
    scope之所以很重要,是因为jsp:useBean只有在不存在具有相同id和scope的对象时才会实例化新的对象;
    如果已有id和scope都相同的对象则直接使用已有的对象,此时jsp:useBean开始标记和结束标记之间的任何内容都将被忽略。
    type:指定引用该对象的变量的类型,它必须是Bean类的名字、超类名字、该类所实现的接口名字之一。请记住变量的名字是由id属性指定的。
    beanName:指定Bean的名字。如果提供了type属性和beanName属性,允许省略class属性。

    jsp:setProperty
    jsp:setProperty用来设置已经实例化的Bean对象的属性,有两种用法。
    首先,你可以在jsp:useBean元素的外面(后面)使用jsp:setProperty,    …

    第二种用法是把jsp:setProperty放入jsp:useBean元素的内部, …

    jsp:setProperty动作有下面四个属性:name:表示要设置属性的是哪个Bean。  property:表示要设置哪个属性。有一个特殊用法:如果property的值是"",表示所有名字和Bean属性名字匹配的请求参数都将被传递给相应的属性set方法。  value:value属性是可选的。该属性用来指定Bean属性的值。字符串数据会在目标类中通过标准的valueOf方法自动转换成数字、boolean、Boolean、byte、Byte、char、Character。例如,boolean和Boolean类型的属性值(比如“true”)通过Boolean.valueOf转换,int和Integer类型的属性值(比如"42")通过Integer.valueOf转换。  value和param不能同时使用,但可以使用其中任意一个。  Param:param是可选的。它指定用哪个请求参数作为Bean属性的值。如果当前请求没有参数,则什么事情也不做,系统不会把null传递给Bean属性的set方法。因此,你可以让Bean自己提供默认属性值,只有当请求参数明确指定了新值时才修改默认属性值。  例如,下面的代码片断表示:如果存在numItems请求参数的话,把numberOfItems属性的值设置为请求参数numItems的值;否则什么也不做。    如果同时省略value和param,其效果相当于提供一个param且其值等于property的值。进一步利用这种借助请求参数和属性名字相同进行自动赋值的思想,你还可以在property(Bean属性的名字)中指定“”,然后省略value和param。此时,服务器会查看所有的Bean属性和请求参数,如果两者名字相同则自动赋值。  下面是一个利用JavaBean计算素数的例子。如果请求中有一个numDigits参数,则该值被传递给Bean的numDigits属性;numPrimes也类似。  JspPrimes.jsp

    20200321215032100.jpg
    jsp:getProperty
    jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出。
    jsp:getProperty有两个必需的属性,即:name,表示Bean的名字;property,表示要提取哪个属性的值。

    END!!!有什么意见可以提出来!
    长路漫漫,JAVA为伴!!!
    ————————————————
    版权声明:本文为CSDN博主「福尔摩东」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_43688587/article/details/105017469

日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档