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>&nbsp;&nbsp; pageContext.getAttribute("info"):<%=pageContext.getAttribute("info")%></p>
             <p>执行 pageContext.setAttribute("info", "Change request\'s value", 2) 后</p>
             <p>&nbsp;&nbsp; pageContext.getRequest().getAttribute("info"):<%=pageContext.getRequest().getAttribute("info")%></p>
             <p>执行 pageContext.setAttribute("info", "Change session\'s value", 3) 后</p>
             <p>&nbsp;&nbsp; pageContext.getSession().getAttribute("info"):<%=pageContext.getSession().getAttribute("info")%></p>
             <p>执行 pageContext.setAttribute("info", "Change application\'s value", 4) 后</p>
             <p>&nbsp;&nbsp; pageContext.getServletContext().getAttribute("info"):<%=pageContext.getServletContext().getAttribute("info")%></p>
 
             <%
                 pageContext.removeAttribute("info");
             %>
             <p>执行 pageContext.removeAttribute("info") 后</p>
             <p>&nbsp;&nbsp; pageContext.getAttribute("info"):<%=pageContext.getAttribute("info")%></p>
             <p>&nbsp;&nbsp; request.getAttribute("info"):<%=request.getAttribute("info")%></p>
             <p>&nbsp;&nbsp; session.getAttribute("info"):<%=session.getAttribute("info")%></p>
             <p>&nbsp;&nbsp; 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的主要内容,如果未能解决你的问题,请参考以下文章

Java Web基础:JSP工作原理和基础概念

JSP基础知识

Java Web基础 --- Jsp 综述(下)

JSP基础

JavaEE-01 JSP动态网页基础

JSP Web第七章整理复习 Servlet基础知识