JSP&Servlet学习笔记-4

  1. Jsp 九大内置对象及四大作用域概述
在 Jsp 开发中,Jsp 提供了 9 个内置对象,这些内置对象将由容器为用户进行实例化,用户直接使用即可。这个9 个内置对象分别是:pageContext,request,response,session,application,config,out,page,exception;
常用的是前面 5个,需要熟练掌握;
在 Jsp 开发中,可以保存数据,Jsp 提供了四种数据保存范围;分别是 page,request,session,application;
  1. Jsp 四大作用域
范围说明底层实现类
Page 范围只在一个页面中保存数据javax.servlet.jsp.PageContext(抽象类)
Request 范围只在一个请求中保存数据javax.servlet.http.HttpServletRequest(接口)
Session 范围在一次会话范围中保存数据,仅供单个用户使用javax.servlet.http.HttpSession(接口)
Application 范围在整个服务器上保存数据,所有用户共享javax.servlet.ServletContext(接口)
  1. page范围例子
  • pageScope.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>forward</title>
</head>
<body>
	<%
		//设置两个page范围的数据 key -> value
		pageContext.setAttribute("name", "page小明");
		pageContext.setAttribute("age", 12);
	%>
	<%
		//读取值
		String name = (String) pageContext.getAttribute("name");
		Integer age = (Integer) pageContext.getAttribute("age");
	%>
	<font>姓名:<%=name %></font><br/>
	<font>年龄:<%=age %></font>
</body>
</html>

注意,如果是拷贝的工程,URL要使用原来的工程名。

4. request范围例子

  • requestScope.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>forward</title>
</head>
<body>
	<%
		//设置两个request范围的数据 key -> value
		request.setAttribute("name", "request小明");
		request.setAttribute("age", 12);
	%>
	<jsp:forward page="requestTarget.jsp"></jsp:forward>
</body>
</html>
  • requestTarget.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>forward</title>
</head>
<body>
	<%
		//读取值
		String name= (String)request.getAttribute("name");
		int age=(Integer)request.getAttribute("age");
	%>
	<font>姓名:<%=name %></font><br/>
	<font>年龄:<%=age %></font><br/>
</body>
</html>
  1. session范围例子
    有效期默认30分钟。
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>forward</title>
</head>
<body>
	<%
		//设置两个session范围的数据 key -> value
		session.setAttribute("name", "session小明");
		session.setAttribute("age", 12);
	%>
	<%
		//读取值
		String name = (String) session.getAttribute("name");
		Integer age = (Integer) session.getAttribute("age");
	%>
	<font>姓名:<%=name %></font><br/>
	<font>年龄:<%=age %></font>
</body>
</html>

只要客户端浏览器不关闭,就能够取到值。必须是同一个会话。

  1. application范围例子
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>forward</title>
</head>
<body>
	<%
		//设置两个application范围的数据 key -> value
		application.setAttribute("name", "application小明");
		application.setAttribute("age", 12);
	%>
	<%
		//读取值
		String name = (String) application.getAttribute("name");
		Integer age = (Integer) application.getAttribute("age");
	%>
	<font>姓名:<%=name %></font><br/>
	<font>年龄:<%=age %></font>
</body>
</html>
  1. 获取Http头信息
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ page import="java.util.*" %>   注意如何在jsp中导包
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>forward</title>
</head>
<body>
	<%
		// 获取头信息
	    Enumeration enu=request.getHeaderNames();
	    while(enu.hasMoreElements()){
	        String headerName=(String)enu.nextElement();
	        String headerValue=request.getHeader(headerName);
	%>
	<h4><%=headerName %>&nbsp;~&nbsp;<%=headerValue %></h4>
	<%
	    }
	%>
</body>
</html>

<% %>的java代码片段可以穿插在html标记文本中。

  1. response 对象
response 内置对象和 request 内置对象是相对应的,response 内置对象用于响应客户请求,向客户端输出信息;
底层实现是javax.servlet.HttpServletResponse 接口
1,自动刷新应用。
2,页面重定向应用 客户端跳转。
3,操作 cookie 应用 post和get 方法比较。 post 放数据包里,get 放 Url 后。 get 数据量小,不安全;
4,cookie 和 session 的比较。cookie 信息是存客户端的,session 信息是存服务器的;
  • 定时刷新页面案例
    整体刷新页面,效率较差。
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ page import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>forward</title>
</head>
<body>
	<%
		//每个一秒刷新一次页面
		response.setHeader("refresh", "1");
		//获取当前时间
		Date myDate = new Date();
	%>
	当前时间:<%=myDate.toLocaleString()%>
</body>
</html>
  • 重定向客户端跳转
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ page import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>forward</title>
</head>
<body>
	<%
		//重定向,客户端跳转(客户端地址会变)
		response.sendRedirect("index.html");
	%>
</body>
</html>
  • 操作cookie
    登陆页面response03.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登陆</title>
<%
	String userName = null;
	String pwd = null;
	Cookie[] cookies=request.getCookies();
	for(Cookie cookie:cookies){
		if(cookie.getName().equals("userInfo")){
			userName=cookie.getValue().split("-")[0];
			pwd=cookie.getValue().split("-")[1];
		}
	}
	
	if(userName==null){
		userName="";
	}
	
	if(pwd==null){
		pwd="";
	}
%>
</head>
<body>
	<form action="userLogin.jsp" method="post">
		<table>
			<tr>
				<td>用户名:
				<td />
				<td><input type="text" id="userName" name="userName" value="<%=userName %>"/>
				<td />
			<tr />
			<tr>
				<td>密码:
				<td />
				<td><input type="password" id="password" name="password" value="<%=pwd %>"/>
				<td />
			<tr />
			<tr>
				<td>记住密码:
				<td />
				<td><input type="checkbox" id="remember" name="remember"
					value="remember-me" />
				<td />
			<tr />
			<tr>
				<td><input type="submit" value="登陆" />
				<td />
				<td><input type="button" value="重置" οnclick="reset()" />
				<td />
			<tr />
		</table>
	</form>
</body>
<script type="text/javascript">
	function reset() {
		document.getElementById("userName").value = "";
		document.getElementById("password").value = "";
	}
</script>
</html>

主页userLogin.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ page import="javax.servlet.http.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>主页</title>
</head>
<body>
	<%
		String userName = request.getParameter("userName");
		String pwd = request.getParameter("password");
		String remember = request.getParameter("remember");
		System.out.println("userName:"+userName);
		System.out.println("password:"+pwd);
		System.out.println("remember:"+remember);
		
		if("remember-me".equals(remember)){
			Cookie userCookie=new Cookie("userInfo",userName+"-"+pwd);
			userCookie.setMaxAge(1*60*60*24*7); //cookie记录一个星期
			response.addCookie(userCookie); //保存cookie在客户端
			System.out.println("设置cookie成功");
		}
		response.sendRedirect("response03.jsp");
	%>
</body>
</html>

传统的form提交方式:
GET

POST

  1. out 对象
Out 内置对象主要用来向客户端输出各种类型的数据,同时还可以管理应用服务器上的输出缓冲区。所以 out 内置对象的方法是向客户端输出数据和管理缓冲区; 底层实现是 javax.servlet.jsp.JspWriter 抽象类

例子

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>out</title>
</head>
<body>
	<%
		out.println("<h1>");
		out.println("out输出显示");
		out.println("</h1>");
	%>
</body>
</html>
  1. config 对象
Config 内置对象是 JSP 页面通过 JSP 容器进行初始化时被传递的对象。底层实现是javax.servlet.ServletConfig 。在 Servlet初始化的时候,JPS 引擎通过 config 向它传递信息。这种信息可以是属性名和属性值匹配的参数,也可以是通过ServletContext 对象传递的服务器的有关信息;

改动配置文件web.xml需要重启Tomcat服务。
sysInit.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>sysInit</title>
</head>
<body>
	<%
		String jdbcName = config.getInitParameter("jdbcName");
		String dbURL = config.getInitParameter("dbURL");
	%>
	<h1>
		驱动名称:<%=jdbcName%></h1>
	<h1>
		连接地址:<%=dbURL%></h1>
</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>LearnJSP2</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	<servlet>
		<servlet-name>init</servlet-name>
		<jsp-file>/sysInit.jsp</jsp-file>
		<init-param>
			<param-name>jdbcName</param-name>
			<param-value>com.mysql.jdbc.Driver</param-value>
		</init-param>
		<init-param>
			<param-name>dbURL</param-name>
			<param-value>jdbc:mysql://localhost:3306/db_name</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>init</servlet-name>
		<url-pattern>/init</url-pattern>
	</servlet-mapping>
</web-app>

这里的“/sysInit.jsp”指WebContent目录。
“/init”对应的URL:

http://localhost:8080/项目名/init
  1. exception 对象
Exception 内置对象用来处理 JSP 文件在执行时发生的所有异常,它是 java.lang.Throwable 类的一个对象。

例子
exception01.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ page errorPage="error.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>out</title>
</head>
<body>
	<%
		int a = 1;
		int b = 0;
		out.println(a / b);
	%>
</body>
</html>

error.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ page isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>out</title>
</head>
<body>
	<%
		//开头要设置isErrorPage,否则exception内置对象不生效。
		//客户端原地址不会变,但内容跳转到此处。
		if (exception != null) {
			out.println("程序错误信息:");
			out.println(exception.getMessage());
		}
	%>
</body>
</html>
  1. pageContext 对象
pageContext 内置对象是一个比较特殊的对象。它相当于页面中所有对象功能的集合,即使用它可以访问到本页面中所有对象。pageContext 内置对象由 Jsp 容器创建并初始化,pageContext 对象提供了对 JSP 页面所有对象及控件的访问。

例子,看看pageContext是怎么当“老大”的:

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>out</title>
</head>
<body>
	<%
		pageContext.setAttribute("name01", "PageInfo");
		request.setAttribute("name02", "RequestInfo");
		session.setAttribute("name03", "SessionInfo");
		application.setAttribute("name04", "ApplicationInfo");
		
		out.println("使用pageContext<br/>");
		out.println("page中的属性值:"+pageContext.getAttribute("name01")+"<br/>");
		out.println("request中的属性值:"+pageContext.getRequest().getAttribute("name02")+"<br/>");
		out.println("session中的属性值:"+pageContext.getSession().getAttribute("name03")+"<br/>");
		out.println("application中的属性值:"+pageContext.getServletContext().getAttribute("name04")+"<br/>");
	%>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值