`

JSP课件

    博客分类:
  • jsp
阅读更多
JSP出现的原因
Servlet的缺陷:1、写静态页面必须部署后才能看到效果,很难控制页面的外观。
              2、 从技术角度来说Servlet是Java代码和HTML静态代码的混合代码。
              3、从市场竞争角度来说,微软推出了ASP产品。
JSP的改进   :1、JSP是标签式的文本文件(区Servlet是Java文件)
2、JSP不需要编译(实际上是由服务器自动监测JSP文件的变化,由服务器将其翻译成Java代码后然后再进行编译并在第一次请求时创建一个Servlet实例。正因为如此,第一次访问JSP页面时会后延迟)
3、JSP不用写配置文件
4、JSP以静态代码为主,Java代码为辅。Servlet反之。
JSP从本质上来说内核还是Servlet,但与Servlet不是替代关系而是一种互补的关系。JSP适合于写显示层的动态页面,而Servlet则适合写控制层的业务控制(页面转发)。
JSP往纯标签方向发展,Servlet往纯代码方向发展,他们以Servlet内核(请求响应式的工作方式)往两个方向发展。
*********************************************************************
JSP简介:
        JSP分为静态页面代码和动态代码(动态生成静态内容的部分)。
JSP在部署应用时该讲JSP页面放在对应应用的跟目录下   
JSP被容器自动翻译成Java源文件其保存路径为:
        Tomcat/work/Catalina/localhost/应用目录
    JSP编程原则:少写代码多写标签(简化页面开发)。
*********************************************************************
JSP的优点:
1、静态内容和表示逻辑相分离。
2、减化了开发过程
3、支持软件重用
4、自动翻译和编译
5、扩展性强
6、平台无关的
7、是J2EE蓝图的一部分
*********************************************************************
JSP语法元素分为三大块:指令、动作和代码
指令
    用于从JSP发送一个信息到容器上。他用来设置全局变量,声明类,要实现的方法和输出内容等。指令在JSP整个文件内有效。它为翻译阶段提供了全局信息。
    格式<%@………%>
代码(脚本)
    动作又分为4块:声明、表达式、代码块和注释
1、声明:<%!…….%>
用来定义在产生的类文件中的类的属性和方法。不能声明类。
由于servlet是工作在多线程环境下,所以尽量不要在servlet方法体外声明成员变量。
2、表达式:<%=……..%>
在JSP请求处理阶段计算他的值,表达式生成的代码是Service方法中的一个代码片断。
JSP对于声明的处理:1、计算表达式的值
                       2、将值转换成String
                       3、用out.println发送标签
3、代码段:<%………%>
是一段可以在处理请求时间执行的Java代码。可以产生输出,也可以是一些流程控制语句。在代码段中定义的变量为service方法中的局部变量。
4、注释:
显示注释:<!――……..――>
        隐式注释:<%――……――%>

                                   
*********************************************************************
组件:对底层API有用的类进行封装,简化开发者开发的难度。
      封装了若干对象的结构,完成一个相对独立的功能
      为了重用封装成一个黑盒,对用户是透明的
*********************************************************************
在JSP中为什么引入JavaBean?
    将底层的API的类封装在组件中,增强页面(JSP)的可读性,增强了代码的复用性。
    Bean主要负责计算,JSP则负责显示结果。

<jsp:useBean id = "BeanName" class = "className"  sope="范围域">
该标签表示创建或使用一个对象。
例:
<jsp:useBean id="user" class="com.tarena.User" scope="session" />
<%--
    1)创建或查找session范围内的一个类型为com.tarena.User的JavaBean对象。
    首先调用session.getAttribute(id的值);
    判断返回值是否为null,如果为null,创建一个类型为com.tarena.User的JavaBean对象
    并将该对象以id的值为KEY保存到session的属性中(sesssion.setAttribute(id的值,JavaBean对象))
    2)声明的一个脚本语言中的临时变量,名字为id的值,值为JavaBean对象。
--%>   

BeanName:bean的引用变量名同时还是Session中的key(该属性名是我们自定义的)
className:类的全名
范围域:page|request|session|application,就是指定创建好的JavaBean对象放在那个范围对象中。
page:当前页面有效
request:同一次请求中有效
session:在于对应用户的会话中有效
application:服务器开启时创建,服务器关闭时销毁。

<jsp:setProperty  name="name"  property="propertyName"  param="paramName"/>
name="name:javaBean标识名
property="propertyName:javaBean属性名
param="paramName":要传的参数名
通过标签来调用对象的方法。
Jsp内部会根据propertyName前加上set查找并调用到对应的set方法。
注意:要使用该标签,对应的类必须符合JavaBean规范。

<jsp:getProperty  name="name"  property="propertyName" />
name="name:javaBean标识名
property="propertyName:javaBean属性名      
注:该标签完全可以用更简练的表达式来取代。<%=name.getpropertyName()%>
*********************************************************************
JavaBean的定义:
1、是一个普通的Java类
2、在结构上没有预先的规定,不需要容器,不需要继承类或实现接口
3、要求必须放在包中,要求实现Serializable接口
4、要求有一个无参的构造方法.
5、属性的类型必须保持唯一,返回值必须和set方法参数类型一致
6、对每个属性要有对应的get和set方法。注:隐藏属性可以没有
7、可以有外观作为显示控制,事件机制。
*********************************************************************
在JSP中新建一个Bean或引用一个Bean实例的过程:
        先去指定的范围找session中的key对应的属性(对象),如果session中没有则new一个JavaBean,并将该对象作为session中的key保存,通过<JSP:setProperty…../>来初始化新建的Bean。
    注:<JSP:setProperty…../>该标签只有在new一个JavaBean时才会生效,如果session中有对应对象则忽略该标签。
    <JSP:setProperty name="beanName" Property="propertyName" value="String constant"/>
*********************************************************************
常用的指令标签
1、指定包名:
<%@ page  import="Java.util.Collection"%>  //注:包名后不用;号
2、指定一个Http会话中这个页面是否参与
<%@page session = "true|false"%>  //注:默认为ture
3、定义该页面出现异常时调用的页面
<%@page errorPage="error.jsp"%>
4、指定页面是否为异常处理页面
<%@page  isErrorPage="true|false"%>
5、定义JSP中输出流的编码和页面响应的MIME类型
<%@page  contentType="test/html; charset=GBK"%>
MIME:多用途互联网邮件扩展协议。
6、指定JSP页面的编码
<%@page  pageEncoding="GBK"%>
7、标签库指令
<%@tablelib%>
*********************************************************************
常用的动作标签
1、<jsp:param>
    以健值对的形式传递一个或多个参数给动态页面,一般结合<JSP:include>、<jsp:forward>、<JSP:plugin>标签一起使用。
    <jsp:Param  name="paramName"  value="paramValue"/>
2、<jsp:include>
    用于在当前JSP页面里动态的包含一个静态或动态页面资源,做到页面代码的复用。在运行上效率比<%@page include%>指令低,但可以动态增加内容。
    <jsp:include page="fileName" flush="true|false"/>
    flush="true|false"表示在包含另一个页面之前是否要自动刷新。
3、<jsp:forward>
    用于将请求转发到另一个JSP、servlet或静态资源文件。
    <jsp:forward page="url"/>
4、<jsp:setProperty>
    该操作和useBean一起协作,用来设置Bean的简单属性和索引属性(注:要求request中参数名与Bean中的对应属性同名)
    (1)<jsp:setProperty name="beanName" property="*"/>
            设置Bean属性的快捷方式,Jsp内在机制会将request中的参数与Bean对应的属性通过set方法赋值。
    (2)<jsp:setProperty name="beanName" property="propertyName"/>
            使用request中的一个参数来指定Bean中的一个属性值
    (3)<jsp:setProperty  name="beanName" property="propertyName" param="proName"/>
            在Bean属性的名字和request中参数名字不同时使用该方法,param指定的是request中的参数名,property对应bean中的属性名。
          注:在(1)(2)(3)中如果request对象的参数值中有空值那么对应的Bean属性将不会设定任何值。
    (4)<jsp:setProperty  name="beanName" property="propertyName" value="proValue"/>
            value是一个可选属性,使用指定的值来设定Bean的属性。
        注:不能在一个<jsp:setProperty>中同时使用param和value,两者都是设定Bean属性的值,不是方式不同而已。
    (5)<jsp:getProperty>
            用来访问一个Bean的属性,其对应的值将转成化为一个String,然后发送到输出流中,如果属性是一个对象,将调用toString()方法。
    <jsp:getProperty name="userSession" property="name"/>
        userSession:Bean名字(Id)
         name:属性名
     (6)<jsp:useBean>
            用来在Jsp页面中创建一个Bean实例,并指定他的名字以及作用范围。
    <jsp:useBean id="bean" scop="page|…."  TypeSpel/>
a、id:用来指定实例对象的变量名
b、scope="page|request|session|application"
用来指定Bean存在的范围以及ID变量名的有效范围
注:在创建Bean的Jsp文件中<%@page%>指令中必须指定Session=true,否则可能会导致致命的错位发生。
c、typespec可以是一下四者之一
class="className"
class="className" type="typeName"
beanName="beanName" type="typeName"
type="typeName"
注:class="className"表示bean的类路径和类名,这个class不能是抽象的,必须一个公用无参的构造器。
    type="typeName" type可以是一个类本身(class),也可以是一个类的父类,或者是一个类的接口。如果没有使用class或BeanName指定type,Bean将不会被实例化。
*********************************************************************
中文乱码问题:
1、页面中
2、传参过程中
3、数据库中
*********************************************************************
JSP中的内置对象:
    application、session、request、page、response、out、Config、exception
        名称                类型                              注释和范围
       request      javax.servlet.http.HttpServletRequest    request
       response     javax.servlet.http.HttpServletResponse   response
       pageContext  javax.servlet.jsp.PageContext            page
       session      javax.servlet.http.HttpSession           session
       application  javax.servlet.ServletContext             ServletContext
       out          javax.servlet.jsp.JspWriter              output stream
       config       javax.servlet.ServletConfig              ServletConfig
       page         javax.servlet.jsp. HttpJspPage           page
       Exception    java.lang.Throwable                      page
*********************************************************************
JSP中的自定义标签:
1.  什么是自定义标签
答:1) 用户自定义的Java语言元素, 实质是运行一个或者两个接口的JavaBean;
    2) 可以非常机密地和JSP的表示逻辑联系在一起,又具有和普通JavaBean相同的业务逻辑处理能力;
    2) 当一个JSP页面转变为servlet时,其间的用户自定义标签转化为操作一个称为标签hander的对象;
3) 可操作默认对象,处理表单数据,访问数据库以及其它企业服务;             

2.  自定义标签库的特点
答:1) 通过调用页面传递参数实现定制;
    2) 访问所有对JSP页面可能的对象;
    3) 修改调用页面生成的响应;
    4) 自定义标签间可相互通信;
    5) 在同一个JSP页面中通过标签嵌套,可实现复杂交互。

3.  如何使用自定义标签库
答:1) 声明标签库
2) 使标签库执行对Web应用程序可用

4.  声明标签库
答:1) 使用taglib指令声明标签库
    2) 语法:<%@taglib uri="URI" prefix="pre" %>
       注意:a. uri属性可以是绝对的,也可以是相对URL,该URL指向标记库描述符(TLD)文件;
             b. uri属性也可以是一个并不存在的URL,该URL为web.xml文件中将标记库描述符(TLD)文件的绝对URL到本地系统的一个映射;
    3) 范例:<%@taglib uri="/WEB-INF/template.tld" prefix="test" %>
<%@taglib uri="http://java.sun.com/jstl/core" prefix="core" %>      

5.  使标签库执行可用
答:方式一:在WEB-INF/classes目录下部署标记处理程序类;
方式二:将标记处理程序类打包成jar文件并置于WEB-INF/lib目录。

6.  几种典型的标签(疑问:可以有带主体而没有属性的标签么?)
答:1) 不带属性和主体的简单标签:<mytaglibs:SomeTag/>;
    2) 不带主体但有属性的标签:<mytaglibs:SomeTag user="TonyDeng"/>;
    3) 带有主体和属性的标签:<mytaglibs:SomeTag user="TonyDeng">
                             ...// 标签体
                             </mytaglibs:SomeTag>;
    注意:a. 属性列于start tag中,它是在标记库描述符(TLD)文件中指定,服务于标记库的自定义行为;
          b. 标签体位于start tag和end tag间,可以是任何合法的JSP内容或者标签;

7.  定义标签
答:1) 开发实现tag的类(tag handler);
    2) 编辑标记库描述符(TLD)文件;
3) 在web.xml中为标记库描述符(TLD)文件的绝对URL建立一个映射(该步骤可选);

8.  标记库描述符(TLD)文件
答:1) 一个描述标记库的XML文件;
    2) 内容开始是整个库的描述,然后是tag的描述;
3) 标记库描述符(TLD)文件用于Web Container确认tag以及JSP页面发展工具;

9.  实现tag的类(tag handler)
答:1) 是一些在引用了标签的JSP页面执行期间被Web Container调用以求自定义标签值的对象;
    2) 必须实现Tag, SimpleTag和BodyTag之一;
    3) 可以继承TagSupport和BodyTagSupport之一。

10. 标签库的接口和类的继承关系
答:表现形式一:
    a. 接口的继承关系:
       ☉ interface javax.servlet.jsp.tagext.JspTag
          ☉ interface javax.servlet.jsp.tagext.SimpleTag
          ☉ interface javax.servlet.jsp.tagext.Tag
             ☉ interface javax.servlet.jsp.tagext.IterationTag
             ☉ interface javax.servlet.jsp.tagext.BodyTag
    b. 类的继承关系:
       ☉ class javax.servlet.jsp.tagext.TagSupport (implements javax.servlet.jsp.tagext.IterationTag, java.io.Serializable)
          ☉ class javax.servlet.jsp.tagext.BodyTagSupport (implements javax.servlet.jsp.tagext.BodyTag)
☉ class javax.servlet.jsp.tagext.SimpleTagSupport (implements javax.servlet.jsp.tagext.SimpleTag)

    表现形式二:
                  (Interface)
                    JspTag
                      ↑
              |ˉˉˉˉˉˉˉˉ|   
           (Interface)      (Interface)
             Tag           SimpleTag ←--SimpleTagSupport
              ↑                          
               |                           
         (Interface) 
         IterationTag←--TagSupport
              ↑             ↑
               |              |
         (Interface)            |
           BodyTag   ←--BodyTagSupport



自定义标签库(中)                                            
11. 一个Tag处理程序类必须实现的方法
答:标签处理程序类型方法
    Simple                      doStartTag, doEndTag, release
    Attributes                  doStartTag, doEndTag, set/getAttribute...release
    Body,No Itrative and        doStartTag, doEndTag, release
    Evaluation 
    Body, Itrative Evaluation   doStartTag, doAterTag, doEndTag, release
    Body, Interaction           doStartTag, doEndTag, release, doInitbody, doAfterBody

12. 简单的标签处理程序类
答:1) 必须实现Tag接口的doStartTag()和doEndTag()方法;
    2) 因为不存在Body,doStartTag()方法必须返回SKIP_BODY;
    3) 如其余页面要执行,doEndTag()方法返回EVAL_PAGE, 否则返回SKIP_PAGE;
    4) 对于每一个标签属性,你必须在标签处理程序类里定义一个特性以及get和set方法以一致于JavaBeans体系惯例

13. 带Body的自定义标签
答:1) 必须实现Tag接口的doStartTag()和doEndTag()方法;
    2) 可以实现IterationTag接口的doAfterBody()方法;
    3) 可以实现BodyTag接口的doInitBody和setBodyContent方法;
    4) doStartTag方法可以返回SKIP_BODY、EVAL_BODY_INCLUDE、或者EVAL_BODY_BUFFERED(当你想使用BodyContent);
    5) doEndTag方法可以返回SKIP_PAGE或EVAL_PAGE;
6) doAfterBody方法可以返回EVAL_BODY_AGAIN, SKIP_BODY;

14. 定义脚本变量的标签(迭代的标签库)
答:1) 定义脚本标签的二个步骤:
       a. 在标记库描述符(TLD)文件中列明脚本变量;
       b. 定义标签扩展信息类(TEI)并且在TLD文件中包括这个类元素(tei-class);
    2) 变量必须在标签处理程序类中使用pageContext.setAttribute()方法设置;
    3) 标签扩展信息类(TEI)必须继承TagExtraInfo以及覆盖getVariableInfo()方法;
    4) 变量的范围可以是AT_BEGIN, NESTED, AT_END(标签扩展信息类(TEI)的VariableInfo中定义)之一;
    3)1.2的标签在内存中是可复用的。
15. 脚本变量的有效性
答:变量     |   有效性                   
    ---------------------------------------
    NESTED   | 标签中的参数在starttag到endtag之间是有效的
    AT_BEGIN | 标签中的参数在标签的开始到JSP页面结束是有效的
    AT_END   | 标签中的参数在标签的结束到JSP页面结束是有效的

自定义标签(下)
16.  Tag接口的方法
答:interface javax.servlet.jsp.tagext.Tag
    ------------------------------------------------------
    +EVAL_BODY_INCLUDE:int
    +EVAL_PAGE:int
    +SKIP_BODY:int
    +SKIP_PAGE:int
    ------------------------------------------------------
    +release():void
    +getParent():javax.servlet.jsp.tagext.Tag
    +setParent(javax.servlet.jsp.tagext.Tag):void
    +doEndTag():int
    +doStartTag():int
+setPageContext(javax.servlet.jsp.PageContext):void

17.  Tag的生命周期
答:1) setPageContext(javax.servlet.jsp.PageContext):void
    2) setParent(javax.servlet.jsp.tagext.Tag):void
    3) //setAttribute:void
    4) doStartTag():int
    5) doEndTag():int
6) release():void

18.  BodyTag和Tag接口的关系
答:interface javax.servlet.jsp.tagext.BodyTag      -->     interface javax.servlet.jsp.tagext.Tag
    ------------------------------------------
    +EVAL_BODY_AGAIN:int
    ------------------------------------------
    +doInitBody():void
    +setBodyContent (javax.servlet.jsp.tagext.BodyContext):void
+doAfterBody():int

19.  BodyTag的处理过程
答:1) setPageContext(javax.servlet.jsp.PageContext):void
    2) setParent(javax.servlet.jsp.tagext.Tag):void
    3) //setParent()
    4) doStartTag():int
    5) setBodyContent(javax.servlet.jsp.tagext.BodyContent):void
    6) doInitBody():void
    7) doAfterBody():int
    doEndTag():int
9) release():void

20.  SimpleTag接口的方法
答:javax.servlet.jsp.tagext.SimpleTag
    ------------------------------------------
    +doTag():void
    +getParent():JspTag
    +setJspBody(JspFragment jspBody):void
    +setJspContext(JspContext pc):void
    +setParent(JspTag parent):void

21.  SimpleTage接口的生命周期
答:1) new:
       每次遇到标签,容器构造一个SimpleTag的实例,这个构造方法没有参数。和红典的标签一样,SimpleTag不能缓冲,故不能重用,每次都需要构造新的实例。
    2) setJspContext()、setParent(): 只有这个标签在另一个标签之内时,才调用setParent()方法;
    3) 设置属性:调用每个属性的setter方法;
    4) setJspBody();
    5) doTag(): 所有标签的逻辑、迭代和Body计算,都在这个方法中;
    6) return
*********************************************************************
EL
    "."表示对javaBean属性的访问。
    EL中的隐含对象:param
    ${empty  student}判断对象是否为空
    这里需要注意的是如果student是一个集合,如果集合中没有元素的话,EL依然视他为空。
    EL是一种弱类型的语言
    <c:forEach begin="1" end="6" step="1" var="i">
        <h${i} align="center">${100 * i}</h${i}>
    </c:forEach>
在EL内置对象PageContext、pageScope、requestScope、sessionScope、ApplicationScope、
              Param、cookie、
*********************************************************************
JSTL
标准标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
关于刷新导致重复提交的问题:浏览器刷新的含义是重新执行最近的一个请求。



Expand - Collapse    * Jsp(Java Server Page)          o 附加知识
                + Web Server Apache、IIS
                      # 这些Server无法产生动态内容
                        需要通过WEB辅助应用如CGI、Servlet
          o  解释Jsp 文件原理
                + 通过request   第一次请求jsp文件 将翻译成java 文件
                  .然后编译成java,然后通过生成一个Servlet对象 如果下次访问将成绶存里拿
                  除非源jsp源文件有变化。
          o 变量定义及使用
                + 局部定义是按html文件的顺序,定义必需在使用前
                + 成员变量定义任意
          o 方法定义及使用
                + 不能定义在脚本里
          o Jsp指令
                + page
                      # import
                            * 类java导包
                      # Session
                            * 默认为true
                              跟request.getSession(true)一样
                            * 使用<% page sesion=false%>
                              跟request.getSession(false)一样
                      # errorPage
                            * 处理异常

                      # 设置指令  <%@   page errorPage="error.jsp"  %>
                + include
                      # 将目标包含进来
                        如果页面的框架
                            * <%@  include =""%>
                      # 在翻译时包含
                + taglib
          o Jsp 动作(Action)
                + forward
                      # 等价于request.dispatcher.forward();
                      #  <jsp:forward page="footer.jsp">
                          <jsp:param value="admin" name="name"/>
                          </jsp:forward>
                        等价于servlet
                        request.dispatcher.forward("").forward(req,resp);
                        里面的  <jsp:param value="admin" name="name"/>等价于 request.getParameter("name").
                + include
                      # 示:<jsp:include page="footer.jsp"></jsp:include>
                      # 可传参与include 指令不同
                        include 动作运行时触发
          o 隐含对象
                + request
                + response
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics