现在的位置: 首页 > 综合 > 正文

6、JSP内置对象

2018年05月26日 ⁄ 综合 ⁄ 共 8839字 ⁄ 字号 评论关闭

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比较消耗内存。
 

抱歉!评论已关闭.