pagecontext详解&JSP动作标签&Javabean设计

本文深入探讨JSP中PageContext对象的功能与使用,包括其作为域对象的角色、代理其他域对象的能力,以及如何获取内置对象。同时,文章详细解析JavaBean规范,包括属性、构造器、序列化要求及其实例化过程,展示了如何通过内省和Apache Commons BeanUtils库进行属性填充。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

的PageContext对象: 

  (1)作用:作为域对象使用(以后常用):    
  域对象:范围:当前的页面有效: 
  
   四个方法: 
   存: 
   取出: 
   移除: 
   获得所有的属性的名称:返回的是一个枚举: 
   
   ( 2)能够代理其他的域对象:请求会话应用程序 
   
   //域对象存的方法: 
   pageContext.setAttribute(String attName,Object obj); 
   pageContext.setAttribute(String attName,Object obj,int value); 诠释值; 指定存放的域: 
   
   int value:取值: 
      int value:----------- ------------------------- ----默认不指定,也是存在PageContext域对象当中: 
      PageContext.PAGE_SCOPE -----------存放在PageContext域对象当中: 
      PageContext.REQUEST_SCOPE - = - 存放在请求域对象当中: 
      PageContext .SESSION_SCOPE ---------存放在session domain对象当中: 
      PageContext.APPLICATION_SCOPE ----存在在应用程序域对象当中: 
    
   
   //取值: 
   pageContext.getAttribute(String attName); 返回的是一个Object类型: 
   pageContext.getAttribute(String attName,int value); 指定了从具体的
   
   某个域当中进行查询.readAttribute(String attName); 从全域当中查询:查询的顺序:pageContext的会话的应用的请求的程序的  
        全域当中都不存在指定的属性名称,返回空。   
        
 作用(1)和(2)的例子如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP '01-pageContext.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>
    <%
       //作用一: 作为域对象来使用:演示作为域对象的作用:
        
      /*  pageContext.setAttribute("username", "lisi");
       pageContext.setAttribute("username", "lisi2",PageContext.PAGE_SCOPE);//
        // 获得PageContext域对象当中的属性: 
       String name =(String)  pageContext.getAttribute("username");
       out.println("pageConext:"+name); */
       //作用二: 可以代理其他的域对象: 
       
       //request 域对象当中: 
       /* pageContext.setAttribute("username", "wangrequest", PageContext.REQUEST_SCOPE);
      
       //String reqName = (String)request.getAttribute("username");
       //out.println("req:"+reqName);
       out.println("<br/>");
       String reqName2= (String)pageContext.getAttribute("username",  PageContext.REQUEST_SCOPE);
       out.println("req2:"+reqName2); */
       
       
       //代理session 域: 
  /*      pageContext.setAttribute("username", "session", PageContext.SESSION_SCOPE); 
       out.println("<br/>");
       //从session 域对象当中获得: 
      String session_name=(String)  pageContext.getAttribute("username",PageContext.SESSION_SCOPE);
      out.println("session:"+ session_name);
      out.println("<br/>"); */
      
      // 代理application域: 
        pageContext.setAttribute("username", "application",PageContext.APPLICATION_SCOPE);
        String app_name=(String)  pageContext.getAttribute("username",PageContext.APPLICATION_SCOPE);
        out.println("application:"+app_name);
        out.println("<br/>");
         
     %>
     
     <hr/>
     
     <!-- 方法:  -->
     <%
    	
    	String username = (String)pageContext.findAttribute("username");
     	out.println("username:"+username);
      %>
      
     
  </body>
</html>

       
  (3)获得其他的八个内置对象: 
  JspWriter getOut():获取出内置对象;
ServletConfiggetServletConfig():获取配置内置对象;
ObjectgetPage():获取页面内置对象;
ServletRequestgetRequest():获取请求内置对象;
ServletResponsegetResponse():获取响应内置对象;
HttpSessiongetSession():获取会话内置对象;
ServletContextgetServletContext():获取应用程序内置对象;
ExceptiongetException():获取异常内置对象;

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP '02-pageContext.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>
   <%
     //作用三: 获得其他的八个内置对象: 
     JspWriter out1= pageContext.getOut();
     out1.println("<p>获得out对象</p>");
      
      //获得request 对象: 需要强制转换成子类对象: 
     HttpServletRequest req= (HttpServletRequest)pageContext.getRequest();
     
     HttpSession session1 =   pageContext.getSession();
     
    %>
    
    
  </body>
</html>

   
   
   
 三:jsp的动作标签: 
 1:作用:替代java代码: 
 
 
 2:使用jsp完成重定向或者是转发:
 转发: 
 <jsp:forward page =“”/> 
 
 包含: 
 <jsp:include page =“”/> 

重定向:

<c:redirect url =“”> 

转发的代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP '03-forward.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>
    <!-- 使用嵌入java代码的形式: 完成jsp 之间的转发:  -->
  <%--  
    <%
       request.setAttribute("USERNAME", "wangdaoyan"); 
       
       request.getRequestDispatcher("/jsp/04-forward.jsp").forward(request, response);
     %>
     
   --%>
     
     
     <!-- 使用jsp 的动作标签: 完成转发:  -->
     
     <%--
           <jsp:forward page="/jsp/04-forward.jsp"/>
      --%>
   
      <%--
     <jsp:include page="/jsp/05-include.jsp"></jsp:include>
     
      --%>
      
      <!-- 使用include  或者是  forward  双标签 : 传递参数: -->
      <%--
      <jsp:forward page="/jsp/04-forward.jsp">
      	  <jsp:param value="xxxxx" name="USERNAME"/>
      </jsp:forward>
    --%>
   
   <!-- 使用include 双标签: 完成参数的传递:  -->
   
   
  </body>
</html>

被转发的代码:

接收请求并获得参数

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP '04-forward.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>
  <%
     String name=(String) pageContext.getAttribute("USERNAME",pageContext.REQUEST_SCOPE);
  //   out.println(name);
     
     // 获得参数: 
    String param =  pageContext.getRequest().getParameter("USERNAME");
    out.println("param:"+param);
   %>
    This is my forward JSP page. <br>
  </body>
</html>


 
 传递参数: 
 <jsp:param name =“”value =“”/> 
 注意:jsp param标签,不能单独的使用:作为一个子标签使用: 
 传递:name:属性的名称: 
     value:属性的值:  


     
四:javaBean的的的: 

JavaBean的中的是一种规范,是对类的要求,他要求的的的Java类的成员变量提供的吸气和二传手方法方法,这样的成员变量成为属性。

 官方说的有点难懂,

 

新建一个实体类,关于名称规范如下:

/ *
     * javaBean:设计实体类的规范: 
     * 
     * 1:具备属性:set get后边的内容: 
     * 2:提供无参数构造器: 
     * 3:序列化:实现序列化接口: 
     *
     * domain:官方建议:实体类: 
     * entry:实体: 
     * vo:value object 
     * pojo:plain origin java object普通的java对象: 
     *  
     * mapper:  
     * bean: 
     *  
     * dao: 
     * daoImp: 
     * service: 
     * sericeImp: 
     * web.servlet : 
     *动作:
     *控制器:  
     * /

package com.yidongxueyuan.domain;

import java.io.Serializable;

/*
 * 标准javaBean 
 */
public class User implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
// 系统和 《------》
	
	private String username; 
	private String password;
	
//	private boolean isMarried ;// 全局是一个boolean 类型的时候, 一般情况 set / get一般都是使用is。 
	
	
	
	
	/*
	 * boolean类型 get 和 set 方法可以是is 开头: 
	public boolean isMarried() {
		return isMarried;
	}
	public void setMarried(boolean isMarried) {
		this.isMarried = isMarried;
	}*/
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}
	// 无参数构造器: 提供: 
	public User() {
		super();
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + "]";
	}
	
	
	
	
	
	
	
}

上面代码中返回值是布尔类型的话,属性名称开头一般都是

下面灰色部分不是属性,下面的方法才是,但一般是一样的。


 (1)规范:

a;必须提供getter / setter方法

b;提供无参的构造器

c;必须序列化(因为数据传输的时候都是二进制


(2)内省:(了解)封装好了。

内省的木匾是得到javabean属性的读写方法的反射对象,通过反射对javabean属性进行操作的一组API。例如名字叫做用户名的javabean属性,通过两个方法对象(get set方法)来操作这个对象。 


  内省类:Introspector getBeanInfo(Calss clazz);   
      将clazz信息全部的封装BeanInfo这个对象“:   BeanInfo对象:

封装对象的全部信息:getPropertyDescriptors返回的数组类型: 

 PropertyDescriptor:封装了属性:

获得写的方法:getWriteMethod

获得读取方法:getReadMethod

返回的方法实例:方法:可以使用反射,调用方法:invoke(bean,价值);

(3)apache组织提供的jar包:将内省已经进行了封装:commons - BeanUntis

jar封装的代码实例如下:

封装前:

package com.yidongxueyuan.domain;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class TestUser {
	public static void main(String[] args) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		//需求:将map 集合当中的数据封装到user 对象当中: 
		
		
		//1:准备一个map 集合: 
		Map<String,String> map = new HashMap<String,String>(); 
		
		map.put("username", "lisi");
		map.put("password", "123");
		
		/*
		 * 传统的方式: 
		 * 
		 * 1: 获得一个user 对象: 
		 * 2: map key 对应的值: 
		 * 3: user 对象的set 方法: 将值设置: 
		 */
		
		/* 
		 * 通过内省的方式: 完成: 
		 * 1: 内省类: Introspector  获得对象: BeanInfo 对象: 
		 */
		
		//通过一个内省类: 将User 对象当中所有的信息都封装到BeanInfo当中: 
		BeanInfo userInfo = Introspector.getBeanInfo(User.class);
		
		
		// 获得BeanInfo 这个对象当中所有的属性:封装到了 PropertyDescriptor 对象: 
		PropertyDescriptor[] propertyDescriptors = userInfo.getPropertyDescriptors();
		
		
		//遍历: 得到数组当中的具体的某个属性: 
		
		User user = new User(); 
		for (PropertyDescriptor pd : propertyDescriptors) {
			String name = pd.getName();
			// System.out.println(name);//获得属性的名称: 
			
			//获得map 对象的值: 
			String value = map.get(name);
			
			//底层通过反射: 将value 值 设置到 user 对象当中的属性去:
			if(value!=null){//说明从map 集合对象当中获得了值:
				
				Method  method= pd.getWriteMethod();// 对象的写的方法: 
				method.invoke(user, value); 
				
//				pd.getReadMethod();
			}
			
		}
		
		System.out.println(user);
		
	}
}

封装后:

package com.yidongxueyuan.domain;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

public class TestUser2 {
	public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		/*
		 * 使用jar 包: 将map 集合的数据封装到 对象: 
		 */
		
		//1:准备一个map 集合: 
		Map<String,String> map = new HashMap<String,String>(); 
		
		map.put("username", "lisi");
		map.put("password", "123");
		
		User user = new User(); 
		// 2: 使用jar 包: 直接将数据封装到User 对象当中: 
		BeanUtils.populate(user, map);
		
		System.out.println(user);
		
		//取值: 
		String property = BeanUtils.getProperty(user, "username");
		
		BeanUtils.setProperty(user, "username", "wangwu");
		
		System.out.println(user);
		
	}
}


      

 





     

 
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方-教育技术博主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值