jsp的域深入

来源:互联网 发布:户型图数据录入 编辑:程序博客网 时间:2024/06/08 12:32

首先,jsp有9大内置对象:


9个内置对象就不用说,大家或多或少都使用过,但是,这些内置对象有其对应的作用范围,即作用域:


发现作用域主要有4个:page,session,request,application:





现在,我们就这4个域进行研究:

首先第一步,写一个form表单,用于将数据传递到第二个页面:

第二步,在第二个页面中,把获取的数据传入这个域所代表的对象中;

第三部,进行page域的测试;

第四部,进行session域的测试;

第五步,进行request域的测试;

第六步,进行application域的测试。


第一步,先写一个from表单,用于获取数据:

<form method="post" action="JSP/second.jsp">    <table>    <tr>    <td>    <b>用户名:</b>    </td>    <td>    <input type="text" name = "user">    </td>    </tr>    <tr>    <td>    <b>密    码:</b>    </td>    <td>    <input type="password" name = "pswd">    </td>    </tr>    <tr>    <td>    <b>性    别:</b>    </td>    <td>    男<input type="radio" name = "sex" value="男" checked="checked">    女<input type="radio" name = "sex" value="女">    </td>    </tr>    <tr>    <td>    <b>年    龄:</b>    </td>    <td>    <input type="text" name = "age">    </td>    </tr>    <tr>    <td>    <input type="reset" value = "重置">    </td>    <td>    <input type="submit" value="提交">    </td>    </tr>    </table>    </form>

效果如下:


第二步,在第二个页面中,把获取的值进行传入:
<%String nameString = null;String pswdString = null;String sexString = null;String ageString = null;String nmString = request.getParameter("user");String pdString = request.getParameter("pswd");String sString = request.getParameter("sex");String aString = request.getParameter("age");nameString = new String(nmString.getBytes("ISO-8859-1"),"UTF-8");pswdString = new String(pdString.getBytes("ISO-8859-1"),"UTF-8");sexString = new String(sString.getBytes("ISO-8859-1"),"UTF-8");ageString = new String(aString.getBytes("ISO-8859-1"),"UTF-8");session.setAttribute("name", nameString);session.setAttribute("pswd", pswdString);session.setAttribute("sex", sexString);session.setAttribute("age", ageString);request.setAttribute("name", nameString);request.setAttribute("pswd", pswdString);request.setAttribute("sex", sexString);request.setAttribute("age", ageString);pageContext.setAttribute("name", nameString);pageContext.setAttribute("pswd", pswdString);pageContext.setAttribute("sex", sexString);pageContext.setAttribute("age", ageString);application.setAttribute("name", nameString);application.setAttribute("pswd", pswdString);application.setAttribute("sex", sexString);application.setAttribute("age", ageString);%>

效果如下:


第三部,进行page域测试,发现,page域就是当前页面的作用范围:

所以,在当前页面对传入的值进行提取:

<%String namepageContextString = (String)pageContext.getAttribute("name");String namesessionString = (String)session.getAttribute("name");String namerequestString = (String)request.getAttribute("name");String nameapplicationString = (String)application.getAttribute("name");String pswdpageContextString = (String)pageContext.getAttribute("pswd");String pswdsessionString = (String)session.getAttribute("pswd");String pswdrequestString = (String)request.getAttribute("pswd");String pswdapplicationString = (String)application.getAttribute("pswd");String sexpageContextString = (String)pageContext.getAttribute("sex");String sexsessionString = (String)session.getAttribute("sex");String sexrequestString = (String)request.getAttribute("sex");String sexapplicationString = (String)application.getAttribute("sex");String agepageContextString = (String)pageContext.getAttribute("age");String agesessionString = (String)session.getAttribute("age");String agerequestString = (String)request.getAttribute("age");String ageapplicationString = (String)application.getAttribute("age");%>

效果如下:


发现所有的域对象都可以获取到值,说明,4大域在单个的页面内全部有效。


第四步,进行session测试,跳转到一个新的jsp页面,直接提取4大域对象的值:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>fourjsp page</title>    <meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">-->  </head>    <body>  <%  String namepageContextString = (String)pageContext.getAttribute("name");  String namesessionString = (String)session.getAttribute("name");  String namerequestString = (String)request.getAttribute("name");  String nameapplicationString = (String)application.getAttribute("name");  String pswdpageContextString = (String)pageContext.getAttribute("pswd");  String pswdsessionString = (String)session.getAttribute("pswd");  String pswdrequestString = (String)request.getAttribute("pswd");  String pswdapplicationString = (String)application.getAttribute("pswd");  String sexpageContextString = (String)pageContext.getAttribute("sex");  String sexsessionString = (String)session.getAttribute("sex");  String sexrequestString = (String)request.getAttribute("sex");  String sexapplicationString = (String)application.getAttribute("sex");  String agepageContextString = (String)pageContext.getAttribute("age");  String agesessionString = (String)session.getAttribute("age");  String agerequestString = (String)request.getAttribute("age");  String ageapplicationString = (String)application.getAttribute("age");   %>    客户信息:<br>    pageContext:<br>    姓名:<%=namepageContextString %><br>    密码:<%=pswdpageContextString %><br>    性别:<%=sexpageContextString %><br>    年龄:<%=agepageContextString %><br>    session:<br>    姓名:<%=namesessionString %><br>    密码:<%=pswdsessionString %><br>    性别:<%=sexsessionString %><br>    年龄:<%=agesessionString %><br>    request:<br>    姓名:<%=namerequestString %><br>    密码:<%=pswdrequestString %><br>    性别:<%=sexrequestString %><br>    年龄:<%=agerequestString %><br>    application:<br>    姓名:<%=nameapplicationString %><br>    密码:<%=pswdapplicationString %><br>    性别:<%=sexapplicationString %><br>    年龄:<%=ageapplicationString %><br>  </body></html>
效果如下:


发现page域对象和request域对象无法获取到值,说明,通过链接打开新的页面,导致request和page域失效,即page和request域的作用范围暂时是单个页面。

第五步,进行request域测试,在第二个页面中加入以下代码:

<jsp:forward page="/JSP/four.jsp"></jsp:forward>

然后,回到第一个信息输入页面:

进行数据输入:



点击提交:


发现page失效,但是request没有失效,而且,url是第二个页面的url,但是显示的页面是第四个页面,

在看看加入的代码,是一个jsp的动作转发:


所以,发现request域的范围>page,但是小于session和application域:

接下来我们测试session,发现session域的范围是一次会话,所以,我们关闭浏览器,直接输入第四个页面的url:


发现session的域对象失效,但是application域对象仍然有效,

到了这里,可以认为

page-------单个页面

request--------请求范围---------url未变

session--------一次会话--------浏览器未关闭

application---------一个项目周期----------服务器未关闭




到了这里,4大域的范围就全部清楚了。