的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);
}
}