JSP要点和JSP转发原理剖析

1、什么是jsp(java server page java服务器端页面技术)?

    1)定义
        sun公司制订的一种服务器端动态页面生成技术规范。
    2)理解
        a,因为直接使用servlet,虽然也可以生成动态页面,但是比较繁琐(需要使用out.println语句),并且维护困难(如果页面发生改变,必须修改java代码),所以,sun在servlet规范制订之后,又添加了jsp规范。
        b,jsp其实就是一个以".jsp"为后缀的文本文件,在该文件中可以添加html和少量的java代码,该文件会被容器(比如tomcat)转换成一个.java文件(其实就是一个servlet类),然后调用这个servlet。

2、如何写一个jsp文件?

    step1,写一个以".jsp"为后缀的文件。
    step2,在该文件里面,可以添加如下的内容:
        1)html(css,javascript)
            直接写即可(不用out.println)
        2)java代码
            a, java代码片断
            <%  java代码;    %>
            b, jsp表达式
            <%=  java表达式 %>    
        3)指令
            a,什么是指令?
            告诉容器,在容器将.jsp文件转换成.java文件时做一些额外的处理,比如导包。
            b,基本语法
            <%@指令名称 属性名称=属性值 %>
            c,page指令
                import属性:导包,比如
                            <%@page     import="java.util.*"%>
                            <%@page import="java.util.*,java.text.*"%>
                contentType属性:设置
                            response.setConentType的内容,比如
                            <%@page contentType="text/html;charset=utf-8"%>
                pageEncoding属性:告诉容器jsp文件的编码。因为容器需要读jsp文件的内容(也就是说,需要解码,某些容器,如果没有该属性,默认情况下会按照iso-8859-1去解码,会产生乱码问题)。
        4)隐含对象
            a,什么是隐含对象?
                在jsp文件里面可以直接使用的对象,比如out,request,response。
            b,为什么可以直接使用这些隐含对象?
                因为容器会自动添加创建这些对象的语句。

3、jsp是如何运行的?

    step1,容器要将.jsp文件转换成.java文件(其实就是一个servlet类)。
        a, html(css,javascript)  --->
                            在service方法里,使用out.write输出。(out.write方法会将null转换成""输出)
        b,<%        %>   ----->
                            在service方法里,照搬。
        c, <%=     %>    ----->
                             在service方法里,使用out.print输出。
    
    step2,容器调用servlet(step1中生成的servlet)来处理请求。

4、转发

    (1)什么是转发?
        一个web组件(servlet/jsp)将未完成的处理通过容器交给另外一个web组件继续完成。
        最常见的情况:
            一个servlet获得数据,然后转发给一个jsp来展现这些数据。
    (2)如何转发?
        step1,绑订数据到request对象上。
            request.setAttribute(String name,Object value);
            说明:
                name:绑订名称
                value:绑订值
        step2,获得转发器
            RequestDispatcher rd = request.getRequestDispatcher(String uri);
                说明:
                    url : 转发的目的地
        step3,转发
            rd.forward(request,response);
        request对象的其它和绑订相关的方法:
            依据绑订名称找到绑订值,如果找不到对应的值,返回null。
            Object request.getAttribute(String name);
            解除绑订
            request.removeAttribute(String name)
    (3)转发的流程
        1、浏览器发送*.do请求。
        2、创建两个对象(请求对象request、响应对象response)
        3、容器调用servlet
        4、servlet进行逻辑处理,访问数据库
        5、将4中得到的集合数据绑定到request对象中
        6、servlet组件通知容器调用另外一个组件*.jsp,此时request和response对象会作为参数通过rd.forward(request,response)传入*.jsp(实际上也是一个servlet,先将jsp转为servlet,再调用servlet的service()方法),转发前会将响应对象里的数据清空;
        7、jsp可获得5中绑定的数据

        8、jsp写响应数据到response响应对象中

        9、容器从响应对象中读数据

       10、将读到的打包并发送给浏览器   

        容器主要通过以上5-7步实现转发,具体流程图如下:

 

    (4)编程需要注意的问题

        a,转发之前,不能够调用out.close方法。

        b,转发之前,容器会清空response对象上缓存的数据。

    (5)转发的特点

        a,转发之后,浏览器地址栏的地址不变。

        b,转发的目的地必须是同一个应用内部某个web组件的地址。

5、转发与重定向比较

    1)是否共享request对象

        转发所涉及的各个web组件可以共享同一个request对象,而重定向不行。
        request对象和response对象的生存时间很短暂(当容器收到请求之后会立即创建这两个对象,当响应发送完毕,容器会立即销毁这两个对象)。
        重定向是两次请求,很显然不能共享同一个request对象。
    2)转发之后,浏览器地址栏的地址不变;重定向会变。
    3)转发的目的地限于同一个应用,面重定向目的地没有限制。
    4)转发是一件事情没有做完,让另外一个组件继续做,而重定向是一件事情已经做完,然后再做另外一件事情。

      

转载请注明出处:

http://blog.csdn.net/daijin888888/article/details/51121027

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值