您的位置:首页 > Web前端 > JavaScript

6、JSP内置对象

2013-04-01 19:49 417 查看
JSP有九个内置对象:

- Request ——请求对象

- Response—— 响应对象

- PageContext ——页面上下文对象

- Session ——会话对象

- Application ——应用程序对象

- Out ——输出对象

- Config ——配置对象

- Page ——页面对象

- Exception ——异常对象

out内置对象有println方法,它是对生成的html源代码换行,而不是浏览器显示中的换行,浏览器页面中的换行用<br>标签



重点内置对象:request,session,application

1、request和response

“request”对象代表的是来自客户端的请求,例如在form表单中填写的信息等,是最常使用的对象。它的方法使用较多的是getParameter、getParameterNames和getParameterValues,通过调用这几个方法来获取请求对象中所包含的参数的值。

“response”对象代表的是对客户端的响应,也就是说可以通过“response”对象来组织发送到客户端的数据。但是由于组织方式比较的底层,所以不建议普通读者使用,需要向客户端发送文字时直接使用“out”对象即可。

对于request,它的getParameter方法是getParameterValues方法的特例,表示请求的参数值只有一个,如果请求参数值有多个,请使用getParameterValues方法。在多选框的情况下,需要使用getParameterValues方法来获取用户所选择的多个复选框的值。

对于如下的页面:

<body>
<form action="result.jsp" method="post">

username:<input type="text" name="username"><br>
password:<input type="password" name="password"><br>
age:<input type="text" name="age">
age1:<input type="text" name="age">
<input type="submit" value=" submit" >  
<input type="reset" value="reset" >
</form>
</body>


result.jsp中:

<body>
<% String username = request.getParameter("username");
String password = request.getParameter("password");

out.println("username:" + username +"<br>");
out.println("password:" + password + "<br>");

String[] values = request.getParameterValues("age");
for(String value : values)
{
System.out.println(value);
}

String value1 = request.getParameter("age");
System.out.println(value1);
%>
</body>


values是一个字符串数组,打印出age和age1的内容,value1只打印出匹配的第一个值。

 “response”对象代表的是对客户端的响应,也就是说可以通过“response”对象来组织发送到客户端的数据。但是由于组织的方式比较底层,所以不建议普通读者使用,需要向客户端发送文字时直接使用“out”对象即可。“response”一般是用在文件下载。

2、session对象:“session”对象代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用,比如在线购物、客户轨迹跟踪等。

    - HTTP是无状态(stateless)协议;、Web Server对每个客户端请求都没有历史记忆;session用来保存客户端状态信息

三个jsp页面演示session值的传递:

session1.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>My JSP 'session1.jsp' starting page</title>
</head>
<body>
<form action="session2.jsp">
姓名:<input type="text" name="username">
<input type="submit" value="submit">
</form>
</body>
</html>

session2.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>My JSP 'session2.jsp' starting page</title>
</head>
<body>
<%
String name = request.getParameter("username");
session.setAttribute("logName",name);
%>
你的名字:<%= name %>已经写入session
<a href="session3.jsp">check</a>
</body>
</html>

session3.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>My JSP 'session3.jsp' starting page</title>
</head>
<body>
<% String yourName =(String) session.getAttribute("logName");
if(yourName == null) {
%>
你还没有登录
<% } else { %>
"<%= yourName %>"已经登录
<% } %>
</body>
</html>

 

3、application对象——负责提供应用程序在服务器中运行时的一些全局信息,常用的方法有getMimeType和getRealPath等

4、out:“out”对象代表了向客户端发送数据的对象,与“response”对象不同,通过“out”对象发送的内容将是浏览器需要显示的内容,是文本一级的,可以通过“out”对象直接向客户端写一个由程序动态生成HTML文件。常用的方法除了print和println之外,还包括clear、clearBuffer、flush、getBufferSize和getRemaining,这是因为“out”对象内部包含了一个缓冲区,所以需要一些对缓冲区进行操作的方法。

5、config对象——提供一些配置信息,常用的方法有getInitParameter和getInitParameterNames,以获取Servlet初始化时的参数。

    page对象——代表了正在运行的由JSP文件产生的类对象,不建议一般读者使用。

    exception对象——代表了JSP文件运行时所产生的异常对象,此对象不能在一般JSP文件中直接使用,而只能在使用了“<%@ page isErrorPage="true" %>”的JSP文件中使用。

6、request、session、application比较

1)request请求对象:getAttribute,以对象形式返回特性名称的属性值。如果所给名称的属性不存在将返回空;setAttribute,设置

request1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<html>
<head>
<title>My JSP 'request1.jsp' starting page</title>
</head>
<body>
<form action="request2.jsp">
username:<input type="text" name="username">
<input type="submit" value="submit">
</form>
</body>
</html>

request2.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>My JSP 'request2.jsp' starting page</title>
</head>
<body>
<% String username = request.getParameter("username"); %>
username:<%= username %>
<% request.setAttribute("username",username); %>
<%--
<jsp:forward page="request3.jsp"></jsp:forward>
--%>
<a href="request3.jsp">request3.jsp</a>
</body>
</html>

request3.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>My JSP 'request3.jsp' starting page</title>
</head>

<body>
<% String username =(String) request.getAttribute("username"); %>
<%= username %>
</body>
</html>


对于request2.jsp,如果使用<a href="request3.jsp">则点击链接时,request3.jsp显示null,如果request2.jsp使用<jsp:forward page="request3.jsp>这是请求转发,request3.jsp将显示request1.jsp中输入的名字。主要是看是不是在一次请求当中。

request的getParameter是客户端的请求信息,getAttribute则是服务器端以前通过setAttribute设置的信息,完全是服务器端的事情。

getAttribute与setAttribute方法一般都是成对出现的,首先通过setAttribute方法设置属性与属性值,然后通过getAttribute方法根据属性获取到与该属性对应的对象值(获取后一般需要进行向下类型转换,将属性值转换为真正地对象)。setAttribute与getAttribute方法都是在服务器端内部执行的,客户端不知道服务器端是否执行过这两个方法;

request的getParameter方法的作用是获取到客户端通过表单或url请求参数所发送过来的参数值,是客户端与服务器端之间的交互,服务器端想要获取到客户端发送过来的数据,就需要使用getParameter方法获取。没有与getPArameter方法对应的setParameter方法。

request对象内数据的存活范围就是在request对象的存活范围内,当客户端向服务器端发送一个请求,服务器端向客户端返回一个响应,该请求对象就被销毁了;之后在向服务器端发送新的请求时,服务器会创建新的request对象,该request对象与之前的request对象没有任何关系,因此也无法获得在之前的request对象中所存在的任何数据。

2)session对象也有getAttribute和setAttribute方法,session对象内数据的存活范围就是session对话的存活范围(只要浏览器不关闭,session对象就会一直存在),因此在同一个浏览器窗口中,无论向服务器端发送多少请求,session对象只有一个

3)application对象也有getAttribute和setAttribute方法,application 应用对象:存活范围最大的对象,只要服务器没有关闭,application对象中的数据就会一直存在,在整个服务器运行过程中,application对象只有一个

4)request、session以及application这3个对象的范围是逐个增加的:request只在一个请求的范围内;session是在浏览器窗口的范围内;application则是在整个服务器的运行过程中。

利用application编写网页计数器:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>My JSP 'application.jsp' starting page</title>
</head>
<body>
<%
if(application.getAttribute("counter") == null)
application.setAttribute("counter","1");
else
{
String strnum = null;
strnum = application.getAttribute("counter").toString();
int icount = 0;

icount = Integer.valueOf(strnum).intValue();
icount++;
application.setAttribute("counter",Integer.toString(icount));
}
%>
你是第<%= application.getAttribute("counter") %>位访问者!
</body>
</html>


7、关于<jsp:formard>转换为servlet,是使用了PageContext.forward方法来进行请求转发的

使用servlet来完成jsp:forward功能:

<%@ 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>My JSP 'myforward.jsp' starting 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>
<form action="MyForwardServlet">
username<input type="text" name="username">
<input type="submit" value="submit">

</form>
</body>
</html>


servlet

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyForwardServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String username = req.getParameter("username");

req.setAttribute("username", username);
RequestDispatcher rd = req.getRequestDispatcher("myResult.jsp");
rd.forward(req, resp);
}
}


 

<%@ 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>My JSP 'myResult.jsp' starting 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>
username:<%= request.getAttribute("username") %>
</body>
</html>


 servlet中使用setAttribute主要是设置通过客户端传来的参数然后查询数据库等获得的数据,然后在传递到下一个页面进行展示:

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyForwardServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String username = req.getParameter("username");

req.setAttribute("username", username);

List<String> list = new ArrayList<String>();
for(int i = 0;i < 100;i++)
{
list.add(String.valueOf(i));
}
req.setAttribute("list", list);
RequestDispatcher rd = req.getRequestDispatcher("myResult.jsp");
rd.forward(req, resp);
}
}

8、application的一些方法(application是ServletContext的对象):getMajorVersion、getMinorVersion、getResource、getRealPath——用的比较多,返回资源的绝对路径

9、关于<input type="hidden" >在进行不同网页之间传递信息时,通常使用hidden标签,而不是使用session来保存,因为session比较消耗内存。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: