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