JavaWeb学习——JSP基础
一、JSP概述
JSP全称Java Server Pages,本质是servlet。
运行在web容器中,接收客户端请求并产生响应。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
二、JSP组成
一个完整的.jsp后缀文件包含以下组成成分:
1. 静态内容
静态数据在输入文件中的内容和输出给HTTP响应的内容完全一致,即客户端浏览网页源文件所见数据。这些数据(如html)定义了网页的基本骨架,即页面的外观和结构。
2. JSP指令
指令是JSP语法元素的第一种类型。它们指示JSP转换器如何翻译JSP页面为Servlet。
语法格式:
<%@...... %> //注意'@'符号
其中主要的指令类型有:page指令、include指令和taglib指令。
①page指令
可以使用page指令来控制JSP转换器转换当前JSP页面的某些方面。
<%@ page attribute1="value1", attribute2="value2", ... %>
一些常用的属性列表:
import:定义一个或多个本页面中将被导入和使用的Java类型。例如:import=“java.util.*”。可以通过在两个类型间加入“ , ”分隔符来导入多个类型。此外JSP默认导入如下包:java.lang、javax.servlet、javax.servlet.http、javax.servlet.jsp。
errorPage:定义当出错时用来处理错误的页面。
isErrorPage:表示本页是一个错误处理页面。
contentType:定义本页面隐式对象response的内容类型,默认是text/html。
pageEncoding:定义本页面的字符编码,默认是ISO-8859-1。
language:定义本页面的脚本语言类型,默认是Java,这在JSP2.2中是唯一的合法值。
②include指令
可以使用include指令将其他文件中的内容包含到当前JSP页面。被包含的文件就好像是该Jsp文件中的一部分,会被同时编译执行,一个页面中可以有多个include指令。
<%@ include file="url" %>
③taglib指令
允许用户使用标签库定义新的定义标签,在JSP中启用定制行为。这部分以后会在之后涉及。
3. JSP脚本
用于在JSP页面执行Java代码。
语法:
<% Java代码 %>
可以在其中定义变量,编写方法,但不能定义方法。多个脚本片段间可以互相访问。
4. JSP声明
用来定义能在JSP使用的变量和方法。
语法:
<%! Java代码 %>
定义的变量和方法的作用域为当前页面和包含的页面。
5. JSP表达式
每个表达式都会被JSP容器执行,并使用隐式对象out的打印方法输出结果。
<%= Java表达式 %>
JSP容器首先执行表达式,并将计算结果传递给out.print()。
6.注释
①隐式注释,在客户端源码中不可见
<%-- JSP注释 --%>
<% //Java注释 %>
②显式注释,在客户端源码可见
<!-- html注释 -->
三、JSP生命周期
JSP生命周期就是从创建到销毁的整个过程,类似于servlet的生命周期,区别在于JSP生命周期还包括将JSP编译成servlet。
以下是JSP生命周期中所走过的几个阶段:
- 编译阶段:servlet容器编译Servlet源文件,生成Servlet类。
- 初始化阶段:加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法。
- 执行阶段:调用与JSP对应的servlet实例的服务方法。
- 销毁阶段:调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例。
JSP编译:当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。
编译的过程包括三个步骤:
- 解析JSP文件。
- 将JSP文件个转为servlet。
- 编译servlet。
JSP初始化:容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。如果您需要执行自定义的JSP初始化任务,复写jspInit()方法就行了。
一般来讲程序只初始化一次,servlet也是如此。通常情况下您可以在jspInit()方法中初始化数据库连接、打开文件和创建查询表。
JSP执行:这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。当JSP网页完成初始化后,JSP引擎将会调用_jspService()方法。
_jspService()方法需要一个HttpServletRequest对象和一个HttpServletResponse对象作为它的参数。_jspService()方法在每个request中被调用一次并且负责产生与之相对 应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等等。
JSP清理:JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切。
jspDestroy()方法在JSP中等价于servlet中的销毁方法。当您需要执行任何清理工作时复写jspDestroy()方法,比如释放数据库连接或者关闭文件夹等等。
四、JSP内置对象
指不加声明和创建就可以在JSP脚本中使用的成员变量。
JSP预先定义了9个这样的对象:
名称 | 类型 |
request | javax.servlet.http.HttpServletRequest |
response | javax.servlet.http.HttpServletResponse |
session | javax.servlet.http.HttpSession |
application | javax.servlet.ServletContext |
out | javax.servlet.jsp.JspWriter |
page | java.lang.Object |
pageContext | javax.servlet.jsp.PageContext |
exception | java.lang.Throwable |
config | javax.servlet.ServletConfig |
1. request
request对象的作用是与客户端交互,收集客户端的Form、Cookies、超链接,或者收集服务器端的环境变量。
- 服务器在接收到客户端的请求之后,会创建request对象和response对象;
- 服务器会通过request对象把客户的数据,包括请求信息都封装到这个对象里面;
- 所以我们在控制层,servlet里面就是service方法里面通过request得到很多数据,并对信息进行相应的业务处理,最后反馈给用户结果;
- 这个结果我们是通过response来封装的,并带到用户面前;
- 当这整个过程结束之后,request和response对象的周期也就结束了,他们的生命范围就是用户的一次请求和得到的一次结果的反馈。
所提供的方法可以将它分为四大类:
(1)储存和取得属性方法;
void
setAttribute(String name, Object value) 设定name属性的值为value
Enumeration getAttributeNamesInScope(
int
scope) 取得所有scope 范围的属性
Object getAttribute(String name) 取得name 属性的值
void
removeAttribute(String name) 移除name 属性的值
(2)取得请求参数的方法
String getParameter(String name) 取得name 的参数值
Enumeration getParameterNames() 取得所有的参数名称
String [] getParameterValues(String name) 取得所有name 的参数值
Map getParameterMap() 取得一个要求参数的Map
(3)能够取得请求HTTP 标头的方法
String getHeader(String name) 取得name 的标头
Enumeration getHeaderNames() 取得所有的标头名称
Enumeration getHeaders(String name) 取得所有name 的标头
int
getIntHeader(String name) 取得整数类型name 的标头
long
getDateHeader(String name) 取得日期类型name 的标头
Cookie [] getCookies() 取得与请求有关的cookies
(4)其他的方法
String getContextPath() 取得Context 路径(即站台名称)
String getMethod() 取得HTTP 的方法(GET、POST)
String getProtocol() 取得使用的协议 (HTTP/1.1、HTTP/1.0 )
String getQueryString() 取得请求的参数字符串,不过,HTTP的方法必须为GET
String getRequestedSessionId() 取得用户端的Session ID
String getRequestURI() 取得请求的URL,但是不包括请求的参数字符串
String getRemoteAddr() 取得用户的IP 地址
String getRemoteHost() 取得用户的主机名称
int
getRemotePort() 取得用户的主机端口
String getRemoteUser() 取得用户的名称
void
getCharacterEncoding(String encoding) 设定编码格式,用来解决窗体传递中文的问题
2. response
response对象用于动态响应客户端的请示,控制发送给用户的信息,并将动态生成响应。response具有页面作用域,即访问一个页面时,该页面的response只对这次访问有效,其他页面的response对象对当前页面无效。
方法说明:
- String getCharacterEncoding() 返回响应用的是何种字符编码
- ServletOutputStream getOutputStream() 返回响应的一个二进制输出流
- PrintWriter getWriter() 返回可以向客户端输出字符的一个对象
- void setContentLength(int len) 设置响应头长度
- void setContentType(String type) 设置响应的contentType类型
- void add(Cokkie cookie) 在客服端添加cookie
- sendRedirect(java.lang.String location) 重新定向客户端的请求,属于客户端行为,相当于二次请求,不会保存上次请求数据。
request.getRequestDispatcher("request.jsp").forward(request, response); 定向转发
转发是在服务器发挥作用,forward方法将提交信息在页面间传递,request不会丢失,地址栏不会变;
out
对象实际上是PrintWriter对象的带缓冲的版本(在
out
对象内部使用PrintWriter对象来输出数据),
可以通过page指令的buffer属性来调整缓冲区的大小,默认的缓冲区是8kb。 out
对象能把结果输出到网页上。
out
主要是用来控制管理输出的缓冲区(buffer)和输出流(output stream)。
方法说明:
void
clear( ) 清除输出缓冲区的内容
void
clearBuffer( ) 清除输出缓冲区的内容
void
close( ) 关闭输出流,清除所有的内容
int
getBufferSize( ) 取得目前缓冲区的大小(KB)
int
getRemaining( ) 取得目前使用后还剩下的缓冲区大小(KB)
boolean isAutoFlush( ) 回传
true
表示缓冲区满时会自动清除;
false
表示不会自动清除并且产生异常处理
long
getCreationTime() 取得session产生的时间,单位是毫秒
String getId() 取得session 的ID
long
getLastAccessedTime() 取得用户最后通过这个session送出请求的时间
long
getMaxInactiveInterval() 取得最大session不活动的时间,若超过这时间,session 将会失效
void
invalidate() 取消session 对象,并将对象存放的内容完全抛弃
boolean isNew() 判断session 是否为
"新"
的会话
void
setMaxInactiveInterval(
int
interval)
设定最大session不活动的时间,若超过这时间,session 将会失效
5. application
int
getMajorVersion() 取得Container主要的Servlet API版本
int
getMinorVersion() 取得Container次要的Servlet API 版本
String getServerInfo() 取得Container的名称和版本
String getMimeType(String file) 取得指定文件的MIME 类型
ServletContext getContext(String uripath) 取得指定Local URL的Application context
String getRealPath(String path) 取得本地端path的绝对路径
void
log(String message) 将信息写入log文件中
void
log(String message, Throwable throwable) 将stack trace 所产生的异常信息写入log文件中
application对象也有setAttribute等方法。
- getException 返回exception隐式对象
- getPage 返回page隐式对象
- getRequest 返回request隐式对象
- getResponse 返回response隐式对象
- getServletConfig 返回config隐式对象
- getServletContext 返回application隐式对象
- getSession 返回session隐式对象
- getOut 返回out隐式对象
PageContext对象提供取得属性的方法:
Object getAttribute(String name,
int
scope) 回传name 属性(范围为scope;类型为Object)
Enumeration getAttributeNamesInScope(
int
scope)
回传所有属性范围为scope 的属性名称,回传类型为Enumerationint
getAttributesScope(String name) 回传属性名称为name 的属性范围
void
removeAttribute(String name) 移除属性名称为name 的属性对象
void
removeAttribute(String name,
int
scope) 移除属性名称为name,范围为scope 的属性对象
void
setAttribute(String name, Object value,
int
scope)
指定属性对象的名称为name、值为value、范围为scopeObject findAttribute(String name) 寻找在所有范围中属性名称为name 的属性对象
8. config
config对象是一个servlet初始化时,JSP引擎向他传送信息所用,此信息包括servlet初始化所要用到的参数以及服务器的有关信息。
9. exception