Web基础知识(11)- JSP
Posted 垄山小站
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web基础知识(11)- JSP相关的知识,希望对你有一定的参考价值。
JSP 隐式(内置)对象
为了简化页面的开发过程,JSP 提供了一些内置对象。
JSP 内置对象又称为隐式对象,它们由容器实现和管理。在 JSP 页面中,这些内置对象不需要预先声明,也不需要进行实例化,我们可以直接在脚本和表达式中使用。
JSP 中定义了 9 个内置对象:
对象 | 说明 |
request | 获取用户请求信息,类型是 javax.servlet.http.HttpServletRequest |
response | 响应客户端请求,并将处理信息返回到客户端,类型是 javax.servlet.http.HttpServletResponse |
out | 输出内容到 HTML 中,类型是 javax.servlet.jsp.JspWriter |
session | 用来保存用户信息,类型是 javax.servlet.http.HttpSession |
application | 所有用户共享信息,类型是 javax.servlet.ServletContext |
config | Servlet 配置对象,用于 Servlet 和页面的初始化参数,类型是 javax.servlet.ServletConfig |
pageContext | JSP 的页面容器,用于访问 page、request、application 和 session 的属性,类型是 javax.servlet.jsp.PageContext |
page | 类似于 Java 类的 this 关键字,表示当前 JSP 页面,类型是 javax.servlet.jsp.HttpJspPage |
exception | 该对象用于处理 JSP 文件执行时发生的错误和异常;只有在 JSP 页面的 page 指令中指定 isErrorPage 的取值 true 时,才可以在本页面使用 exception 对象,类型是 java.lang.Throwable |
*注:本文暂时不讨论 exception 对象,后期单独讨论 JSP 异常处理
JSP 的内置对象主要特点:
(1) 由 JSP 规范提供,不用编写者实例化;
(2) 通过 Web 容器实现和管理;
(3) 所有 JSP 页面均可使用;
(4) 只能在脚本和表达式中使用,在声明中不能使用。
1. JSP request 对象
JSP request 是 javax.servlet.http.HttpServletRequest 的实例对象,主要用来获取客户端提交的数据。
request 对象提供了一系列方法,可以获取请求参数信息、表单数据、HTTP 头信息、cookie 和 HTTP 请求方法等。request 对象常用方法如下表所示。
request 对象常用方法:
方法 | 说明 |
String getParameter(String name) | 获取请求参数 name 的值 |
Enumeration getParameterNames() | 获取所有参数名称 |
String[] getParameterValues(String name) | 获取请求参数 name 的所有值 |
Object getAttribute(String name) | 获取 name 属性的值 |
Enumeration getAttributeNames() | 返回所有属性的名称集合 |
void setAttribute(String key, Object value) | 给 key 对象赋 value 值 |
void removeAttribute(String name) | 删除指定的 name 属性 |
cookie[] getCookies() | 获取所有的 cookie 对象 |
HttpSession getSession() | 返回 request 对应的 session 对象,如果没有则创建一个 session 对象 |
HttpSession getSession(boolean create) | 返回 request 对应的 session 对象,如果没有,且 create 值为 true,则创建一个 session 对象 |
Enumeration getHeaderNames() | 返回 HTTP 头信息的名称集合 |
String getHeader(String name) | 获取 name 指定的 HTTP 头信息 |
String getMethod() | 获取 HTTP 请求方法/客户提交信息方式 |
示例,在 request.jsp 页面使用 getHeaderNames() 方法获取 HTTP 头信息,并遍历输出参数名称和对应值。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*"%> <!DOCTYPE html> <html> <head> <title>Request</title> </head> <body> <h2>Get Request Header Info</h2> <table width="100%" border="1" align="center"> <tr bgcolor="#949494"> <th>Parameter</th> <th>Value</th> </tr> <% Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) String paramName = (String) headerNames.nextElement(); out.print("<tr><td>" + paramName + "</td>\\n"); String paramValue = request.getHeader(paramName); out.println("<td> " + paramValue + "</td></tr>\\n"); %> </table> </body> </html>
2. JSP response 对象
JSP response 是 javax.servlet.http.HttpServletResponse 的实例对象。response 对象和 request 对象相对应,主要用于响应客户端请求,将处理信息返回到客户端。
response 对象的常用方法如下:
方法 | 说明 |
void addHeader(String name, String value) | 添加头信息(参数名称和对应值) |
void addCookie(Cookie cookie) | 添加 cookie 信息 |
void sendRedirect(String location) | 实现页面重定向 |
void setStatus(int status) | 实现页面的响应状态代码 |
void setContentType(String type) | 设置页面的 MIME 类型和字符集 |
void setCharacterEncoding(String charset) | 设定页面响应的编码类型 |
示例,response.jsp 代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Response</title> </head> <body> <% if ("POST".equals(request.getMethod())) String username = request.getParameter("username"); String password = request.getParameter("password"); if ("admin".equals(username) && "123456".equals(password)) response.sendRedirect("success.jsp"); else response.sendRedirect("failed.jsp"); else %> <h2>User Login</h2> <form method="post" action=""> <p>Username: <input type="text" name="username" value="admin"/></p> <p>Password: <input type="text" name="password" value="123456"/></p> <p><input type="submit" value="Login" /></p> </form> <% %> </body> </html>
success.jsp 代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <body> <h2>Login successfully!</h2> </body> </html>
failed.jsp 代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <body> <h2>Login failed, invalid username or password!</h2> </body> </html>
3. JSP out 对象
JSP out 是 javax.servlet.jsp.JspWriter 的实例对象。out 对象包含了很多 IO 流中的方法和特性,最常用的就是输出内容到 HTML 中。
out 对象的常用方法如下:
方法 | 说明 |
void print() | 将内容直接打印在 HTML 标签中 |
void println() | 类似于 print,唯一区别是 println 方法添加了换行符 |
void newLine() | 输出换行字符 |
void clear() | 清除页面缓冲区 |
boolean isAutoFlush() | 检查页面是否自动清除缓冲区 |
out 对象的方法相对比较简单,一般情况下很少使用。下面我们使用 out 对象的 print、println 和 newLine 方法将内容输出到 HTML 中。
示例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <body> <% out.print("JSP out object test page"); out.newLine(); out.println("Test println()"); out.print("Test print()"); %> </body> </html>
4. JSP session 对象
JSP session 是 javax.servlet.http.HttpSession 的实例对象,主要用来访问用户数据,记录客户的连接信息。
HTTP 协议是一种无状态的协议(即不保存连接状态的协议)。每次用户向服务器发出请求,且服务器接收请求并返回响应后,该连接就被关闭了,服务器端与客户端的连接被断开。此时,服务器端不保留连接的有关信息,要想记住客户的连接信息,就用到了 session 对象。
session 对象的常用方法如下:
方法 | 说明 |
void setAttribute(String name, Object value) | 将参数名和参数值存放在 session 对象中 |
Object getAttribute(String name) | 通过 name 返回获取相应的 value 值,如果 name 没有相应的 value 值,则返回 null |
void removeAttribute(String name) | 删除指定的 name 参数 |
Enumeration getAttributeNames() | 获取 session 对象中存储的所有参数 |
long getCreationTime() | 返回 session 对象创建的时间 |
String getId() | 获取 session 对象的 ID 值 |
boolean isNew() | 用于检查 session 对象是不是新对象,如果客户端禁用了 cookie ,则 session.isNew() 始终返回 true |
void invalidate() | 终止 session,即指定 session 对象失效 |
void setMaxInactiveInterval() | 设置 session 对象的有效时间,单位:秒 |
int getMaxInactiveInterval() | 获取 session 对象的有效时间,单位:秒 |
long getLastAccessedTime() | 获取上次访问 session 对象的时间 |
示例,session.jsp 代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>Response</title> </head> <body> <% if ("POST".equals(request.getMethod())) String username = request.getParameter("username"); String password = request.getParameter("password"); if ("admin".equals(username) && "123456".equals(password)) session.setAttribute("username", username); response.sendRedirect("success.jsp"); else out.print("<p>Login failed, invalid username or password!</p>"); else %> <h2>User Login</h2> <form method="post" action=""> <p>Username: <input type="text" name="username" value="admin"/></p> <p>Password: <input type="text" name="password" value="123456" /></p> <p><input type="submit" value="Login" /></p> </form> <% %> </body> </html>
success.jsp 代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <body> <p>Welcome, <%=(String)session.getAttribute("username")%></p> </body> </html>
5. JSP application 对象
JSP application 是 javax.servlet.ServletContext 的实例对象。在服务器部署应用和项目时,Web 容器仅创建一次 ServletContext 实例,也就是说 application 设置的任何属性和值可以用于整个应用(所有 JSP 页面)。
可以将 application 对象看作 Web 应用的全局变量。一般用于保存应用程序的公用数据。
application 对象在 Web 应用运行时一直存在于服务器中,非常占用资源,因此在实际开发中不推荐使用,否则容易造成内存不足等情况。
application 对象常用方法如下:
方法 | 说明 |
Object getAttribute(String attributeName) | 获取 attributeName(属性名称)对应的 object |
void setAttribute(String attributeName, Object object) | 设置 attributeName 对应的属性值 |
Enumeration getAttributeNames() | 返回 application 对象中所有的 attributeName |
void removeAttribute(String objectName) | 删除 application 对象中指定 attributeName 的属性 |
String getServerInfo() | 获取当前 Servlet 的版本信息 |
String getRealPath(String value) | 获取指定文件的实际路径 |
示例,application.jsp 代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <body> <% Integer count = (Integer) application.getAttribute("count"); if (count == null) count = 1; else count++; application.setAttribute("count", count); %> <p>Welcome to WebBasic, you are the <%=count%> visitor!</p> </body> </html>
6. JSP config 对象
JSP config 是 javax.servlet.ServletConfig 的实例对象,一般用于获取页面和 Servlet 的初始化参数。
config 对象的常用方法如下:
方法 | 说明 |
String getInitParameter(String paramname) | 获取指定的初始化参数值 |
Enumeration getInitParameterNames() | 获取当前页面所有的初始化参数值 |
ServletContext getServletContext() | 获取当前执行 Servlet 的 servletContext(Servlet 上下文)的值 |
String getServletName() | 获取当前执行 Servlet 的名称 |
在 web.xml 文件中定义 Servlet 名称和映射,然后使用 config 对象获取信息。
示例,web.xml 代码如下:
<servlet> <servlet-name>ConfigServlet</servlet-name> <jsp-file>/jsp/config.jsp</jsp-file> <init-param> <param-name>url</param-name> <param-value>http://www.test.com</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ConfigServlet</servlet-name> <url-pattern>/config</url-pattern> </servlet-mapping>
config.jsp 代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <body> <% String servletName = config.getServletName(); String url = config.getInitParameter("url"); out.print("Servlet Name: " + servletName + "<br>"); out.print("Url: " + url + "<br>"); %> </body> </html>
7. JSP pageContext 对象
pageContext 是 javax.servlet.jsp.PageContext 的实例对象。pageContext 对象表示整个 JSP 页面,可以获取或删除这些对象的任意属性:page、request、session、application
pageContext 常用的方法如下:
方法 | 说明 |
Object findAttribute (String AttributeName) | 按 page、request、session、application 的顺序查找指定的属性,并返回对应的属性值。如果没有相应的属性,则返回 NULL |
Object getAttribute (String AttributeName, int Scope) | 在指定范围内获取属性值。与 findAttribute 不同的是,getAttribute 需要指定查找范围 |
void removeAttribute(String AttributeName, int Scope) | 在指定范围内删除某属性 |
void setAttribute(String AttributeName, Object AttributeValue, int Scope) | 在指定范围内设置属性和属性值 |
Exception getException() | 返回当前页的 Exception 对象 |
ServletRequest getRequest() | 返回当前页的 request 对象 |
ServletResponse getResponse() | 返回当前页的 response 对象 |
ServletConfig getServletConfig() | 返回当前页的 ServletConfig 对象 |
HttpSession getSession() | 返回当前页的 session 对象 |
Object getPage() | 返回当前页的 page 对象 |
ServletContext getServletContext() | 返回当前页的 application 对象 |
Scope 的值: 1 - page;2 - request;3 - session; 4 - application;
示例,page_context.jsp 代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <body> <% pageContext.setAttribute("info", "page\'s value"); request.setAttribute("info", "request\'s value"); session.setAttribute("info", "session\'s value"); application.setAttribute("info", "application\'s value"); %> <p>pageContext.getAttribute("info"):<%=pageContext.getAttribute("info")%></p> <p>pageContext.getRequest().getAttribute("info"):<%=pageContext.getRequest().getAttribute("info")%></p> <p>pageContext.getSession().getAttribute("info"):<%=pageContext.getSession().getAttribute("info")%></p> <p>pageContext.getServletContext().getAttribute("info"):<%=pageContext.getServletContext().getAttribute("info")%></p> <hr> <p> pageContext.getAttribute("info", 1):<%=pageContext.getAttribute("info", 1)%></p> <p> pageContext.getAttribute("info", 2):<%=pageContext.getAttribute("info", 2)%></p> <p> pageContext.getAttribute("info", 3):<%=pageContext.getAttribute("info", 3)%></p> <p> pageContext.getAttribute("info", 4):<%=pageContext.getAttribute("info", 4)%></p> <hr> <% pageContext.setAttribute("info", "Change page\'s value", 1); pageContext.setAttribute("info", "Change request\'s value", 2); pageContext.setAttribute("info", "Change session\'s value", 3); pageContext.setAttribute("info", "Change application\'s value", 4); %> <p>执行 pageContext.setAttribute("info", "Change page\'s value", 1) 后</p> <p> pageContext.getAttribute("info"):<%=pageContext.getAttribute("info")%></p> <p>执行 pageContext.setAttribute("info", "Change request\'s value", 2) 后</p> <p> pageContext.getRequest().getAttribute("info"):<%=pageContext.getRequest().getAttribute("info")%></p> <p>执行 pageContext.setAttribute("info", "Change session\'s value", 3) 后</p> <p> pageContext.getSession().getAttribute("info"):<%=pageContext.getSession().getAttribute("info")%></p> <p>执行 pageContext.setAttribute("info", "Change application\'s value", 4) 后</p> <p> pageContext.getServletContext().getAttribute("info"):<%=pageContext.getServletContext().getAttribute("info")%></p> <% pageContext.removeAttribute("info"); %> <p>执行 pageContext.removeAttribute("info") 后</p> <p> pageContext.getAttribute("info"):<%=pageContext.getAttribute("info")%></p> <p> request.getAttribute("info"):<%=request.getAttribute("info")%></p> <p> session.getAttribute("info"):<%=session.getAttribute("info")%></p> <p> application.getAttribute("info"):<%=application.getAttribute("info")%></p> </body> </html>
8. JSP page 对象
JSP page 的实质是 java.lang.Object 对象,相当于 Java 中的 this 关键字。page 对象是指当前的 JSP 页面本身,在实际开发中并不常用。
page 对象的常用方法如下:
方法 | 说明 |
class getClass() | 返回当前页面所在类 |
int hashCode() | 返回当前页面的 hash 代码 |
String toString() | 将当前页面所在类转换成字符串 |
boolean equals(Object obj) | 比较对象和指定的对象是否相等 |
void copy (Object obj) | 把对象复制到指定的对象中 |
Object clone() | 复制对象 |
示例
下面通过一个简单的例子来演示 page 中的方法。page.jsp 代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <body> <% Object obj = null; %> <p>返回当前页面所在类:<%=page.getClass()%></p> <p>返回当前页面的 hash 代码:<%=page.hashCode()%></p> <p>转换成 String 类的对象:<%=page.toString()%></p> <p>page 和 obj 比较:<%=page.equals(obj)%></p> <p>page 和 this 比较:<%=page.equals(this)%></p> </body> </html>
以上是关于Web基础知识(11)- JSP的主要内容,如果未能解决你的问题,请参考以下文章