JSP 内置对象

  • JSP如何实现获取客户端请求及响应?

通过,请求与响应对象,请求与响应对象是通过内置对象存在的。

  • 内置对象

内置对象(也称隐含对象,有9个):不需要预先声明就可以在脚本代码和表达式中随意使用

一、HTTP协议

​ 针对网络上的客户端与服务器端在执行http请求的时候,遵守的一种规范。规定了客户端在访问服务器端的时候,要带上哪些东西,服务器端返回数据的时候,也要带上什么东西。

  • 版本

1.0: 请求数据,服务器返回后,将会断开连接
1.1: 请求数据,服务器返回后,连接还会保持着。除客户端关闭连接。该连接有一定的时间限制,如果长时间空着,那么后面会服务器也会断掉。

JSP 内置对象
JSP 内置对象

1、Http请求数据

​ 请求的数据里面包含三个部分内容 : 请求行 、 请求头 、请求体。

  1. 请求行

    Request URL: 请求路径

    Request Method: 请求方式

  2. 请求头

    Accept: 客户端向服务器端表示,我能支持什么类型的数据。
    Referer: 真正请求的地址路径,全路径
    Accept-Language: 支持语言格式
    User-Agent: 用户代理 向服务器表明,当前来访的客户端信息。
    Content-Type: 提交的数据类型。经过urlencoding编码的form表单的数据
    Accept-Encoding: gzip, deflate (压缩算法) 。
    Host : 主机地址
    Content-Length: 数据长度
    Connection : Keep-Alive 保持连接
    Cache-Control : 对缓存的操作

  3. 请求体

    浏览器真正发送给服务器的数据,通常是键值对数据。

2、Http响应数据

​ 响应的数据里面包含三个部分内容 : 响应行 、 响应头 、响应体。

  1. 响应行

    Status Code: 状态码

  2. 响应头

    Server: 服务器类型
    Content-Type: 服务器返回给客户端内容类型
    Content-Length: 返回的数据长度
    Date: 通讯的日期,响应的时间

  3. 响应体

    Response服务器返回的html页面等信息。

二、request、out、response对象

  • request: 封装了由WEB浏览器或其它客户端生成HTTP请求的细节(参数,属性,头标和数据)
  • out: 代表输出流的对象
  • response: 封装了由WEB浏览器或其它客户端生成HTTP请求的细节(参数,属性,头标和数据)
  • request作用域:

用户的请求周期,指在一次请求的全过程中有效,即从http请求到服务器处理结束,返回响应的整个过程,存放在HttpServletRequest对象中。在这个过程中可以使用forward方式跳转多个jsp。在这些页面里你都可以使用这个变量。

1、request 对象及常用方法

​ request 对象代表来自客户端的请求信息,如在FORM表单中填写的信息,是最常用的对象。客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。

方法(部分) 描述
String getParameter(String strTextName) 获取表单或URL提交信息
Enumeration getParameterNames() 返回可用参数的枚举
String[] getParameterValues(String name) 返回包含参数name的所有值的数组

更多参见:入口

2、response对象及常用方法

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

方法(部分) 描述
print(dataType dt) 输出Type类型的值
println(dataType dt) 输出Type类型的值然后换行
flush() 刷新输出流

3、response对象及常用方法

​ response对象是对客户端的响应,可以通过response对象来组织发送到客户端的数据,需要向客户端发送文字时直接使用。它是HttpServletResponse类的实例。

方法(部分) 描述
String getCharacterEncoding() 返回响应用的是何种字符编码
ServletOutputStream getOutputStream() 返回响应的一个二进制输出流
PrintWriter getWriter() 返回可以向客户端输出字符的br/>一个对象
void setContentLength(int len) 设置响应头长度

三、session、application、exception对象

1、session对象及常用方法

​ session对象是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication 开始,直到客户端与服务器断开连接为止,用于跟踪会话。它是HttpSession类的实例。

会话

会话是代表用户第一次进入当前系统直到退出系统或关闭浏览器,在此期间与服务器的一系列交互。

session作用域:会话期间

设置session有效时间的方法:
session.setMaxlnactivelnterval(int second)参数为秒
如果设置session有效时间为5分钟,则为:
​ session.setMaxlnactivelnterval(5*60);

方法(部分) 描述
long getCreation Time() 返回SESSION创建时间
public String getld() 返回SESSION创建时JSP引擎为它设的惟一ID号
long getLastAccessed Time() 返回此SESSION里客户端最近一次请求时间
int getMaxlnactivelnterval() 返回两次请求间隔多长时间此SESSION被取消(s)
void setMaxlnactivelnterval() 设置两次请求间隔多长时间此SESSION被取消(s)

2、application

​ application对象实现了用户间数据的共享,可存放全局变量,可用于页面访问量统计等。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。

application: 提供了关于服务器版本,应用级初始化参数和应用内资源绝对路径方式
application作用域: web容器的生命周期

方法(部分) 描述
Object getAtribute(String name) 返回给定名的属性值
Enumeration getAttributeNames() 返回所有可用属性名的枚举
void setAttribute(String name,Object obj) 设定属性的属性值
void removeAttribute(String name) 删除属性及其属性值

3、exception对象及常用方法

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

<!-- 指定产生异常时跳转的页面 -->
<%@ page contentType="text/html;charset=UTF-8" language="java"  errorPage="error.jsp" %>
<!-- 指定该页面是异常处理页面 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
方法(部分) 描述
String getMessage() 返回描述异常的消息
String tostring() 返回关于异常的简短描述消息
void printStackTrace() 显示异常及其栈轨迹

四、page、pageContext、config对象

1、page对象

​ page对象指向当前JSP页面本身,类似于类中的this 指针,它是java.lang.Object类的实例。page对象代表了正在运行的由JSP文件产生的类对象。

2、pageContext对象及常用方法

​ pagecontext 对象提供了对JSP页面内所有的对象及名字空间的访问,可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext。

<%= request.getParameter("name")%>
<!-- 通过pageContext.getRequest()方法实现上句 -->
<%= pageContext.getRequest().getParameter("name")%>
方法(部分) 描述
JspWriter getOut() 返回当前客户端响应被使用的JspWriter 流(out)
HttpSession getSession() 返回当前页中的HttpSession对象(session)
ServletRequest getRequest() 返回当前页的 ServletRequest对象(request)
Object getPage() 返回当前页的Object对象(page)
ServletResponse getResponse() 返回当前页的ServletResponse对象(response)
Exception getException() 返回当前页的Exception对象(exception)
ServletConfig getServletConfig() 返回当前页的 ServletConfig对象(config)
servletContext getServletContext() 返回当前页的 ServletContext对象(application)
void include(String relativeURLPath) 在当前位置包含另一页面

3、config对象及常用方法

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

方法 描述
ServletContext getServletContext() 返回包含服务器相关信息的所有servletContext对象
getInitParameter(String name) 获取初始化参数值
getInitParameterNames() 返回 servlet初始化所需所有参数的枚举
  • 配置JSP页面

    在web.xml文件中的进行,**JSP被当成Servlet配置,**为Servlet配置参数使用init-param元素,该元素可以接受param-name和param-value分别指定参数名和参数值。


<servlet>    
	<!--指定servlet的名字-->  
	<servlet-name>config</servlet-name>    
	<!--指定哪一个JSP页面配置成Servlet-->  
	<jsp-file>/abc.jsp</jsp-file>  
	<!--配置名为name的参数,值为Tim-->  
	<init-param>    
		<param-name>name</param-name>    
		<param-value>Tim</param-value>    
	</init-param>    
	<!--配置名为age的参数,值为15-->  
	<init-param>    
		<param-name>age</param-name>    
		<param-value>15</param-value>    
	</init-param>    
</servlet>    
<servlet-mapping>   
	<!--指定将config Servlet配置到/atthis路径-->   
	<servlet-name>config</servlet-name>    
	<url-pattern>/atthis</url-pattern>
</servlet-mapping>

注意:如果希望JSP页面可以获取web.xml配置文件中的配置信息就必须通过为该JSP页面在web.xml文件中分配的路径来访问页面,因为只有这样访问JSP页面才会让配置文件起作用。

五、案例分析

1、数据类 Emp、DBUtil

// Emp类
public class Emp {
    private String account;
    private String name;
    private String password;
    private String email;

    public Emp(String account, String name, String password, String email) {
        this.account = account;
        this.name = name;
        this.password = password;
        this.email = email;
    }

    public String getAccount() { return this.account; }
    public void setAccount(String account) {  this.account = account; }
    public String getName() { return this.name; }
    public void setName(String name) { this.name = name; }
    public String getPassword() { return this.password; }
    public void setPassword(String password) { this.password = password; }
    public String getEmail() { return this.email; }
    public void setEmail(String email) { this.email = email; }
}
// DBUtil类
public class DBUtil {
    public static Map<String, Emp> map = new HashMap<>();
    static {  //静态代码块
        map.put("1001", new Emp("1001", "A1", "123", "[email protected]"));
        map.put("1002", new Emp("1001", "B2", "123", "[email protected]"));
        map.put("1003", new Emp("1001", "C3", "123", "[email protected]"));
        map.put("1004", new Emp("1001", "D4", "123", "[email protected]"));
    }

    // 判断用户名和密码是否正确
    public static boolean selectEmpByAccoutAndPassword(Emp emp){
        boolean flage = false;
        for(String key : map.keySet()){
            Emp e = map.get(key);
            if(emp.getAccount().equals(e.getAccount())
            && emp.getPassword().equals(e.getPassword()))
                return true;
        }
        return false;
    }
}

2、index.jsp 页面

<body>
  <!--
  pageContext的作用:
  1、forward方法  完成请求的转发
  2、include方法  实现页面之间的包含关系
  3、pageContext  方法获取其他的内置对象,getRequest,getSession...
  -->
<%
  //pageContext.include("header.jsp");
  //pageContext.forward("a.jsp?name=moc");
%>
  page的基本信息:<%= this.getServletInfo()%>
  <br />
  <a href="/jsp/denga"> 按下</a>
</body>

JSP 内置对象

3、web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

<servlet>
    <servlet-name>logab</servlet-name>
    <jsp-file>/logon.jsp</jsp-file>
    <init-param>
        <param-name>age</param-name>
        <param-value>10</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>logab</servlet-name>
    <url-pattern>/denga</url-pattern>
</servlet-mapping>
</web-app>

4、logon.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>人事管理系统</title>
</head>
<body>
    config对象:<%= config.getServletName()%>
    <br>
    config获得的初始化参数:<%= config.getInitParameter("age")%>

    <%
        // pageContext作用域只在当前作用域有效
        pageContext.setAttribute("age", 12);
    %>
    <br>
    pageContext作用域获取的值:<%= pageContext.getAttribute("age") %>
    <%
        request.setAttribute("name", "description");
        // 将请求和响应转发给 result.jsp
        //request.getRequestDispatcher("result.jsp").forward(request, response);
    %>
    <h3 align="center">人事管理系统登录界面</h3>
    <hr>
    <!-- action代表服务器端的处理程序 -->
    <form action="control.jsp">
        <table>
            <tr>
                <td>
                    账号:
                </td>
                <td>
                    <input type="text" name="account" />
                </td>
            </tr>
            <tr>
                <td>
                    密码:
                </td>
                <td>
                    <input type="password" name="password" />
                </td>
            </tr>
            <tr>
                <td>
                    <input type="submit" value="登录" />
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

JSP 内置对象

5、control.jsp页面.

<%@ page contentType="text/html;charset=UTF-8" language="java"  errorPage="error.jsp" %>
<%@ page import="moc.test01.bean.*, moc.test01.db.*" %>
<%@ page import="java.util.Map" %>
<html>
<head>
    <title>人事管理系统</title>
</head>
<body>
    <!-- 获取账号和密码,通过调用DBUtil当中的方法验证账号和密码的正确性
        1. 正确,返回true,显示登录成功
        2. 错误,返回false, 显示错误信息。

        request: 获取请求信息
        getParameter(String name): 可以通过表单的name属性来获取控件的值

        out: 输出流对象,输出指定信息
        println(): 打印输出信息并换行

    -->
    <!-- 以下结果为null,是因为requset的作用域 -->
    从request对象中获取key为name对应的值:<%= request.getAttribute("name") %>


    <!-- 获得request的编码方式 -->
    <h3>响应的字符编码集:<%= response.getCharacterEncoding() %></h3>
<%
    String account = request.getParameter("account");
    String password = request.getParameter("password");

    // out.println("账号:" + account + ", 密码:" + password);
    Emp emp = new Emp(account, null, password, null);
    boolean flag = DBUtil.selectEmpByAccoutAndPassword(emp);
    Map<String, Emp> map = DBUtil.map;

    if(flag == true){
        Object o = application.getAttribute("count");
        if(o == null){
            application.setAttribute("count", 1);

        }else{
            int count = Integer.parseInt(o.toString());
            application.setAttribute("count", count + 1);
        }

        session.setAttribute("account", account);  // 账户信息放入会话作用域
%>
    <h3 align="right">访问量:<%= application.getAttribute("count")%></h3>
    <h3 align="right">登录账户:<%= session.getAttribute("account") %></h3>
    <h3 align="center">欢迎来到人事管理系统的首页</h3>
    <hr>
    <table align="center" border="1" width="500px">
        <tr>
            <td>
                账号
            </td>
            <td>
                员工姓名
            </td>
            <td>
                <a href="http://www.baidu.com">邮箱</a>
            </td>
            <td>
                修改
            </td>
        </tr>
        <%
            for(String key : map.keySet()){
                Emp e = map.get(key);
                %>
                    <tr>
                        <td>
                            <%= e.getAccount() %>
                        </td>
                        <td>
                            <%= e.getName() %>
                        </td>
                        <td>
                            <%= e.getEmail() %>
                        </td>
                        <td>
                            <!-- 相邻两个页面传递数据,可以通过URL参数来传递
                             规则:
                                资源?key1=value1&key2=value2
                             -->
                            <a href="update.jsp?account=<%=e.getAccount()%>&name=<%=e.getName()%>&email=<%=e.getEmail()%>">修改</a>
                        </td>
                    </tr>
                <%
            }
        %>
    </table>
<%
    }
    else
        //out.println("用户名和密码错误");
    throw new Exception("账号和密码错误"); // 500
%>
</body>
</html>

JSP 内置对象

6、update.jsp界面

<body>
    <h3>员工更新界面</h3>
    <hr>
    <h3 align="right">登录账号:<%= session.getAttribute("account") %></h3>
    <form action="update_data.jsp">
        <table align="center" border="1" width="500px">
            <tr>
            <td>账号</td>
            <td><input type="text" name="account" value="<%=request.getParameter("account")%>"/></td>
            </tr>
            <tr>
                <td>姓名</td>
                <td><input type="text" name="name" value="<%=request.getParameter("name")%>" /></td>
            </tr>
            <tr>
                <td>邮箱</td>
                <td><input type="text" name="email" value="<%=request.getParameter("email")%>" /></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit"></td>
            </tr>
        </table>
    </form>
</body>

JSP 内置对象

7、update_data.jsp页面

<body>
    <%
        Map<String, Emp> map = DBUtil.map;
        Emp emp = map.get(request.getParameter("account"));
        emp.setName(request.getParameter("name"));
        emp.setEmail(request.getParameter("email"));
    %>
    <h3 align="center">修改员工信息成功。</h3>
</body>

JSP 内置对象

8、error.jsp页面

<body>
    <!---
        1、exception对象只能在错误页面页面中使用,page加入一个属性isErrorPage="true"
        2、有一个页面出现了异常,在页面中指定一个错误处理的页面,page指令当中,errorpage来指定。
     -->
    <%= exception.getMessage() %>
</body>

JSP 内置对象