Servlet与JSP

重定向302+Location消息头
(1)什么是重定向?
服务器通知浏览器向某个地址发送请求

    注:服务器可以通过发送302状态码以及Location消息头(该消息头的值是一个地址,一般称之为重定向地址给浏览器),
    浏览器收到之后,会立即向重定向地址发送请求.

![](imgs/day04/redirect.png)

(2)如何重定向
response.sendRedirect(String url);
    
    url:重定向地址

(3)重定向的一个细节
重定向之前,容器回先清空response对象上存放的所有数据

    注:实体内容为空

 

  setTimeout(function(){
                    location="list";
    },1000);   //一秒钟后访问,与重定向无关    


(4)重定向的特点
- 重定向的地址url是任意的       
- 重定向之后浏览器的地址会发生变化   


JSP java server page
(1) jsp是什么?
sun公司指定的一种服务器端的动态页面技术规范

    注:因为虽然可以使用Servlet生成动态页面,但是过于频繁(需要使用大量的out.println()语句),并且不好维护
    (修改页面,就必须修改java源代码,所以sun公司才制定了jsp规范).
    
    jsp是一个以.jsp为后缀的文件(主要内容为html和少量的java代码),容器会将jsp文件转换成一个对应的Servlet然后运行.

    jsp的本质就是一个Servlet,只不过是容器自动生成的

(2) jsp文件中可以添加哪些内容?
1)html(css、js)
    
    直接写即可

2)java代码
- 方式一:java代码片段<br>

    <% java代码 %>

- 方式二:jsp表达式

    <%= java表达式 %>


![](imgs/day04/jspBD.png)


3)隐含对象
- 什么是隐含对象?
    
    在jsp里面内,不需要说明,直接可以使用的对象:
    `out`,`request`,`response`,

- 为什么可以直接用隐含对象?

    容器在将jsp转换成对应的Servlet时,会自动添加获得这么对象的代码

4)jsp指令
- 什么是指令?

    通过指令可以告诉容器,将jsp转换成Servle时进行一些额外的处理,比如导包.

- 语法:

     <%@ 指令名 属性=值 %>

     注:如果有多个指令用空格隔开

- page指令

    import属性:指定要导入的包名,比如:
    <%@page import="java.util.*,java.text.*"%>

    如果要导多个包,使用`,`隔开.或者再写一个page

    contentType属性:设置response.setContentType()的值"text/html;charset=utf-8"
    影响由jsp生成的servlet的Java文件的编码方式

    pageEncoding属性:告诉容器(Tomcat),在读取jsp文件的内容时,使用该属性指定的字符集去解码

    `实际开发中,在本地服务器运行正常,换一台服务器出现乱码?`



(3) jsp文件如何执行的?
1) 阶段一:容器先将jsp转换成一个对应的Servlet
- html(css,js)------>在service方法中,使用out.write()输出
- <% java代码块%>---------->在service方法里面不改变
- <%= %>-------------->在service方法中使用out.print()输出
2) 阶段二:容器调用该Servle
- 需要将Servlet编译,然后实例化,调用对应的service方法。




为什么jsp第一次运行时比较慢,后来就块了?
        第一次访问jsp时,需要将jsp中的java代码转化为对应的java类,客户端发送请求到容器,容器才会将jsp转化为对应的servlet


转发

(1)什么是转发?
- 一个web组件将未完成的处理,通过容器交给另外一个web组件继续做

    注:web组件:指的是`servlet`或者是`jsp`

(2)如何转发?
- step1:绑定数据到请求对象上

        request.setAttribute(String name,Object obj);
    
        注:name---绑定名
           obj---绑定值
            String request.getAttribute(String name);//依据绑定名得到绑定值,有可能返回空值

- step2:获得转发器

        RequestDispatcher rd = request.getRequestDispatcher(String url);
        
        注:url:另外一个web组件的地址(转发的地址),通常是一个jsp(常用)或者servlet,通常是一个servlet获得数据之后转发给jsp来展现.
        
        通常情况下:reqeust.getRequestDispatcher(url).forward(request,response);

- step3:转发

        rd.forward(request,response);    



(3)转发的特点
- 转发的地址是有限制的,要求属于同一个web应用
- 转发之后浏览器地址栏地址不变(服务器内部跳转,浏览器是不知道的)

登录操作分析






转发和重定向的区别
 1) 能否共享请求对象?
- 转发可以共享request:转发是一次请求和响应期间的行为
- 重定向不可以共享request:重定向是两次请求与响应的行为

    注:当请求到达容器,容器创建request对象和response对象,当response发送完毕,容器会销毁两个对象,也就是说,request对象和response对象的生存时间是一次请求和响应期间存在.

 2) 目的地是否有限制?
- 转发要求转发地址属于同一个web应用
- 重定向地址是任意的

 3) 浏览器地址栏是否有变化?
- 转发没有变化
- 重定向有变化

 4) 一件事是否已经做完?
- 转发是一件事没有做完,让另一个web组件继续做这件事
- 重定向是一件事已经做完,再做另外一件事

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值