从零开始的JSP(2)

JSP内置对象

JSP内置对象是Web容器创建的一组对象,不使用new关键就可以使用的内置对象。
比如上面的九九乘法表中的out。
JSP九大内置对象:
out、request、response、session、application、Page、PageContext、exception、config

out对象

out对象是JspWriter类的实例,是向客户端输出内容常用的对象。
常用的方法:

  1. void println() 向客户端打印字符串
  2. void flush() 将缓冲区内容输出到客户端
  3. void clear() 清除缓冲区内容,如果在flush之后调用抛出异常
  4. void chearBuffer() 清除缓冲区内容
  5. int getBufferSize() 返回缓冲区以字节数的大小,如果不设立缓冲区则为0
  6. int getRemaining() 返回缓冲区剩余大小
  7. boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常
  8. void close() 关闭输出流
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <%
    out.println("<h2>两句诗</h2>");
    out.println("苟利国家生死以<br/>");
    out.println("岂因祸福避趋之<br/>");
    %>
    <hr>
    <br/>缓冲区大小:<%= out.getBufferSize() %>
    <br/>缓冲区剩余大小:<%= out.getRemaining() %>
    <br/>是否自动清除缓冲区大小:<%= out.isAutoFlush() %>

request对象

get和post的的区别

  1. get:以明文的方式通过URL提交数据,数据在URL中可以看到。提交的数据最多不超过2KB。安全性较低但效率比post方式高。合适提交数量不大,但安全性不高的数据。比如:搜索、查询等功能。
  2. post: 将用户提交的信息封装在HTML的头部信息内。适合提交数据量较大,安全性高的用户信息。比如:注册、修改、上传等功能。

客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效,常用方法如下:

  1. String getParameter(String name) 返回name指定的参数值
  2. String [] getParameterValues(String name) 返回包含参数name的所有值的数组
  3. void setAttribute(String, Object) 存储此请求中的属性
  4. Object getAttrubute(String name) 返回指定属性的属性值
  5. String getContentType() 返回请求体的MIME类型
  6. String getProtocol() 返回请求用的协议类型和版本号
  7. String getServerName() 返回接受请求的服务器主机名

下面是一个提交参数的页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<form action="request.jsp" name="registerForm" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>爱好:</td>
<td>
<input type="checkbox" name="favorite" value="read">阅读
<input type="checkbox" name="favorite" value="sport">运动
<input type="checkbox" name="favorite" value="music">音乐
<input type="checkbox" name="favorite" value="poem">诗词
</td>
</tr>
<tr>
<td colspan="2"><input type="submit"></td>
</tr>
</table>
</form>

处理参数的请求的页面(request.jsp)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%
//设置接受请求时中文乱码的问题
request.setCharacterEncoding("utf-8");
%>
//获取请求参数
<%= request.getParameter("username") %>
<%
//通过参数favorite获取属性值的数组
String [] fav = request.getParameterValues("favorite");
if(fav != null) {
for (String s : fav) {
out.println(s + "&nbsp&nbsp&nbsp");
}
}
%>

其他的request对象的用法

1
2
3
4
5
6
7
8
9
10
11
12
13
<%
request.setAttribute("password", "pockbandit");
%>
<%= request.getAttribute("password") %><br/>
<%= request.getContentType() %><br/>
<%= request.getProtocol() %><br/>
<%= request.getServerName() %><br/>
<%= request.getServerPort() %><br/>
请求文件的长度:<%= request.getContentLength() %><br/>
请求客户端的IP地址:<%= request.getRemoteAddr() %><br/>
请求的真实路径:<%= request.getRealPath("reqeust.jsp") %><br/>
请求的上下文路径:<%= request.getContextPath() %><br/>

Response对象

response对象包含了响应客户请求的有关信息,但是在JSP中很少直接使用它,它是HttpServletResponse类的实例。response对象具有页面的作用域,即访问一个页面时,该页面的response对象只能对这次的访问有效,其它页面的response对象对象当前页面无效。常用方法如下:

  1. String getCharacterEncoding() 返回响应用的是何种字符编码
  2. void setContentType(String type) 设置响应的MIME类型
  3. PrintWriter getWriter() 返回可以向客户端输出字符的一个对象
  4. sendRedirect(java.lang.String location) 重定向客户端的请求
1
2
3
4
5
6
7
8
9
10
11
12
<%
response.setContentType("text/html;charset=utf-8");
out.println("this is out object");
PrintWriter outer = response.getWriter();
outer.println("PrintWriter输出流的内容会优先于out实例的输出流<br/>");
%>
<%= response.getCharacterEncoding() %><br/>
<%--<%--%>
<%--//请求重定向--%>
<%--response.sendRedirect("register.jsp");--%>
<%--%>--%>

请求重定向和请求转发

请求重定向:客户端行为,response.sendRedirect(),本质上讲等同于两次请求,前一次的请求对象不会被保存,地址栏的URL地址会改变。
举个例子:A页面请求将数据提交到C页面,但是实际上A请求B, B在请求C,此时C不能接收到A的数据
请求转发:服务器行为,request.getRequestDispatcher().forword(request, response)是一次请求,转发会请求对象会保存,地址栏的URL地址不会改变。

Session对象

session概念:

在服务器的内存中保存着不同用户的session。

  1. session表示客户端与服务器的一次回话
  2. Web中的session指的是用户在浏览某个网站时,从进入网站到浏览关闭所经过的这段时间,也就是用户浏览网站所花费的时间
  3. session实际上是一个特定的时间概念

session对象的概念

sessioin对象是HttpSession类的实例。

  1. session对象在第一个JSP页面被装载时自动创建,完成会话期间管理。
  2. 从一个客户打开浏览器并连接到服务器开始,到客户端关闭浏览器离开这个服务器结束,称为一个会话。
  3. 当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象。

session对象常用方法如下:

  1. long getCreationTime() 返回session创建时间
  2. String getId() 返回session被创建时JSP引擎将它设为唯一ID号
  3. Object SetAttribute(String name, Object Value) 设置属性及其值绑定到此次会话
  4. Object getAttrubute(String name) 返回属性的值,找不到返回null
  5. String [] getValueNames() 返回一个包含此session中所有可能的属性数组
  6. int getMaxInactiveInterval() 返回session的生命周期(单位秒)

下面是session.jsp的使用页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date d = new Date(session.getCreationTime());
session.setAttribute("name", "ackerman");
session.setAttribute("man", "manman");
session.setAttribute("number", 34);
// session的生命周期只有10秒
session.setMaxInactiveInterval(10);
%>
session创建时间:<%= d %><br/>
session的ID编号:<%= session.getId() %><br/>
session取属性值:<%= session.getAttribute("name") %><br/>
session属性数组:<%
String [] names = session.getValueNames();
if(names != null){
for(String s: names){
out.println(s + "&nbsp;&nbsp;&nbsp;");
}
}
%><br/>
<a href="session2.jsp" target="_blank">跳转页面,验证session的有效性</a>

下面是跳转的session2.jsp

1
2
<%= session.getAttribute("name") %><br/>
<%= session.getId() %>

session的生命周期

创建阶段:当客户端第一次访问某个jsp或者Servlet时候,服务器会为当前会话创建一个SessionId,每当客户端向服务端发送请求时,都会将此Id携带过去,服务端会对此SessionId进行校验。

活动阶段:

  1. 某次会话当中通过超链接打开的新页面都属于同一次会话
  2. 只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一个项目资源属于同一次会话。
  3. 除非本次会话所有页面都关闭后再重新访问某个JSP或者Servlet将会创建新的会话。(原有会话还存在,旧的sessionId仍然存在于服务端,只不过再也没有客用户端会携带此Id进行访问)。

销毁阶段:有三种方式可以销毁session会话

  1. 调用了session.invalidate()方法
  2. session过期(设置的MaxInactiveInterval过期时间或者web.xml设置过期时间)
  3. 服务器重新启动

application对象

application对象的概念:

  1. application对象实现了用户间数据的共享,可存放全局变量
  2. application开始于服务器的启动,终止于服务器的关闭
  3. 在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作
  4. 在任何地方对appication对象属性的操作,都会影响到其他用户对其的访问
  5. 服务器的启动和关闭决定了application对象的生命周期
  6. application对象是ServletContext类的实例

application对象的常用方法:

  1. void setAttribute(String name, Object value)
  2. Object getAttribute(String name)
  3. Enumeration getAttributeNames() 返回所有可用属性的枚举
  4. String getServerInfo() 返回JSP引擎名字和版本号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<h1>在当前页面测试application</h1>
<%
application.setAttribute("city", "xiamen");
application.setAttribute("name", "ackerman");
application.setAttribute("number", 34);
%>
<hr>
所在城市:<%= application.getAttribute("city")%><br/>
已有属性:<%
Enumeration e = application.getAttributeNames();
while(e.hasMoreElements()){
out.println(e.nextElement() + "<br/>");
}
%>
引擎版本:<%= application.getServerInfo() %>

如果我们在该项目的其他页面中,进行城市、属性和版本进行相同的查询工作,会得到一样的结果(除非服务器关闭)。

Page对象

page对象就是指向当前JSP页面本身,有点像类中的this指针,它是java.lang.Object类的实例。常用方法如下:

  1. class getClass() 返回此Object类
  2. int hashCode() 返回此Object的hash码
  3. boolean equals(Object obj) 判断此Object是否与指定的Object对象相等
  4. void copy(Object obj)把此Object拷贝到指定的Object对象中
  5. Object clone() 克隆此Object对象
  6. String toString()
  7. void notify() 唤醒一个等待的线程
  8. void notifyAll()
  9. void wait(int timeout) 使一个线程处于等待直到timeout结束或唤醒
  10. void wait() 使一个线程一直处于等待直到被唤醒

pageContext对象

概念:

  1. pageContext对象提供了对JSP页面内所有的对象及名字空间的访问
  2. pageContext对象可以访问本页所在的session,也可以取本页面所在的appication的某一个属性值
  3. pageContext对象相当于页面中所有功能的集大成者
  4. pageContext对象的本类名也叫作pageContext

常用方法:

  1. JspWriter getOut() 返回当前客户端响应被使用的JspWriter流(out)
  2. HttpSession getSession() 返回当前页面中的HttpSession对象(session)
  3. Object getPage() 返回当前页面的Object对象(page)
  4. ServletRequest getRequest() 返回当前页面的ServletRequest对象(request)
  5. ServletResponse getResponse() 返回当前页面的ServletResponse对象(response)
  6. void setAttribute(String, Object)
  7. Object getAttribute(Strring, int) 在指定范围内取属性的值
  8. int getAttributeScope(String) 返回某属性的作用范围
  9. void forward(String relativeUrlPath) 使当前页面重导到另一页面,浏览器的地址不会被改变
  10. void include(String relativeUrlPath) 在当前位置包含另一文件

Config对象

config对象是在一个servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化要用到的参数(通过属性名和属性值构成)以及服务器有关的信息(通过传递一个ServletContext对象)。
常用的方法如下:

  1. ServletContext getServletContext() 返回含有服务器相关信息的ServletContext对象
  2. String getInitParameter(String name) 返回初始化参数的值
  3. Enumeration getInitParameterNames() 返回Servlet初始化所需所有参数的枚举

Exception对象

exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生了这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象。
常用方法如下:

  1. String getMessage() 返回描述异常的消息
  2. String toString() 返回关于异常的简短描述信息
  3. void printStackTrace() 显示异常及其栈轨迹
  4. Throwable FillStackTrace() 重写异常的执行栈轨迹
1
2
3
4
5
6
<%@page errorPage="exception.jsp" %>
<h1>测试异常页面</h1>
<%
System.out.println(100/0);
%>

下面是exception.jsp

1
2
<%= exception.getMessage()%><br/>
<%= exception.toString() %><br/>