javaweb:JavaBean及内省

什么是JavaBean

lJavaBean是一个遵循特定写法的Java类,它通常具有如下特点:

这个Java类必须具有一个无参的构造函数

属性私有化。

私有化的属性必须通过public类型的getset方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。

JavaBeanJ2EE开发中,通常用于封装数据,对于遵循以上写法的JavaBean组件,其它程序可以通过反射技术实例化JavaBean对象,并且通过反射那些遵守命名规范的方法,从而获知JavaBean的属性,进而调用其属性保存数据

JavaBean的属性

lJavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性。每个属性通常都需要具有相应的settergetter方法,setter方法称为属性修改器,getter方法称为属性访问器。

l属性修改器必须以小写的set前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,name属性的修改器名称为setNamepassword属性的修改器名称为setPassword

l属性访问器通常以小写的get前缀开始,后跟属性名,且属性名的第一个字母也要改为大写,例如,name属性的访问器名称为getNamepassword属性的访问器名称为getPassword

一个JavaBean的某个属性也可以只有set方法或get方法,这样的属性通常也称之为只写、只读属性。

例如封装user:

user.java

package cn.itcast.domain;

import java.util.Date;

public class User {
	
	private String username;
	private String password;
	private double money;
	private Date birthday;
	
	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 double getMoney() {
		return money;
	}
	public void setMoney(double money) {
		this.money = money;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

}

bean1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<h3>在JSP中封装数据</h3>
<form action="/day12/action/bean/bean2.jsp" method="post">
	姓名:<input type="text" name="username" /><br/>
	密码:<input type="password" name="password" /><br/>
	<input type="submit" value="提交" />
</form>

<h3>在JSP中使用动作标签来封装数据</h3>
<form action="/day12/action/bean/bean3.jsp" method="post">
	姓名:<input type="text" name="username" /><br/>
	密码:<input type="password" name="password" /><br/>
	<input type="submit" value="提交" />
</form>


<h3>在JSP中把数据提交到Servlet程序中</h3>
<form action="/day12/user" method="post">
	姓名:<input type="text" name="username" /><br/>
	密码:<input type="password" name="password" /><br/>
	<input type="submit" value="提交" />
</form>

<h3>在JSP中把数据提交到Servlet程序中(BeanUtil封装数据)</h3>
<form action="/day12/user2" method="post">
	姓名:<input type="text" name="username" /><br/>
	密码:<input type="password" name="password" /><br/>
	余额:<input type="text" name="money" /><br/>
	生日:<input type="text" name="birthday" /><br/>
	<input type="submit" value="提交" />
</form>

</body>
</html>





 bean2.jsp

<%@page import="cn.itcast.domain.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<h3>把数据封装User对象中</h3>
<%
	String username = request.getParameter("username");
	String password = request.getParameter("password");
	// 完成封装
	User user = new User();
	user.setUsername(username);
	user.setPassword(password);
	// 在后台的程序中传输user对象
%>

<%= user.getUsername() %>
<%= user.getPassword() %>

</body>
</html>







方式二:使用JSP的动作标签封装数据

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<h3>使用JSP的动作标签封装数据</h3>
<jsp:useBean id="u" class="cn.itcast.domain.User" scope="page"></jsp:useBean>
<jsp:setProperty property="*" name="u"/>

<h4>查看数据</h4>
<jsp:getProperty property="username" name="u"/>
<jsp:getProperty property="password" name="u"/>


</body>
</html>

JSP中使用JavaBean :

lJSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为:

l<jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件。

l<jsp:setProperty>标签:用于在JSP页面中设置一个JavaBean组件的属性。

l<jsp:getProperty>标签:用于在JSP页面中获取一个JavaBean组件的属性。

<jsp:useBean>标签

l<jsp:useBean>标签用于在指定的域范围查找指定名称的JavaBean对象:

如果存在则直接返回该JavaBean对象的引用。

如果不存在则实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围中。

l常用语法:

  <jsp:useBean id="beanName" class="cn.itcast.Test"

  scope="page|request|session|application"/>

 

üid属性用于指定JavaBean实例对象的引用名称和其存储在域范围中的名称。

üclass属性用于指定JavaBean的完整类名(即必须带有包名)。

üscope属性用于指定JavaBean实例对象所存储的域范围,其取值只能是pagerequestsessionapplication等四个值中的一个,其默认值是page

<jsp:useBean>执行原理:

l<jsp:useBean id="currentDate" class="java.util.Date"/>

l翻译成的Servlet源码:

java.util.Date currentDate = null;

synchronized (_jspx_page_context) {

  currentDate = (java.util.Date)             _jspx_page_context.getAttribute(

  "currentDate", PageContext.PAGE_SCOPE);

  if (currentDate == null){

  currentDate = new java.util.Date();

  _jspx_page_context.setAttribute("currentDate",

  currentDate, PageContext.PAGE_SCOPE);

  }

 }   

带标签体的<jsp:useBean>标签

l语法:

  <jsp:useBean ...> 

  Body 

  </jsp:useBean>

l功能:

  Body部分的内容只在<jsp:useBean>标签创建JavaBean的实例对象时才执行。

<jsp:getProperty>标签:

l<jsp:getProperty>标签用于读取JavaBean对象的属性,也就是调用JavaBean对象的getter方法,然后将读取的属性值转换成字符串后插入进输出的响应正文中。

l语法:

  <jsp:getProperty name="beanInstanceName" property="PropertyName" />

üname属性用于指定JavaBean实例对象的名称,其值应与<jsp:useBean>标签的id属性值相同。

üproperty属性用于指定JavaBean实例对象的属性名。

l如果一个JavaBean实例对象的某个属性的值为null,那么,使用<jsp:getProperty>标签输出该属性的结果将是一个内容为“null”的字符串。

内省(Introspector) JavaBean:

l什么是JavaBean和属性的读写方法?

l访问JavaBean属性的两种方式:

直接调用beansetXXXgetXXX方法。

通过内省技术访问(java.beans包提供了内省的API)

内省技术是基于反射技术的

通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。

内省beanutils工具包

链接: https://pan.baidu.com/s/1m16SgTL4n0xlQqO2X8S7TA 提取码: sgrk 

 

lApache组织开发了一套用于操作JavaBeanAPI,这套API考虑到了很多实际开发中的应用场景,因此在实际开发中很多程序员使用这套API操作JavaBean,以简化程序代码的编写。

lBeanutils工具包的常用类:

BeanUtils

populate(Object bean, Map properties)

自定义转换器

ConvertUtils.regsiter(Converter convert, Class clazz)

传入日期类型的Date.class

UserServlet.java:

package cn.itcast.servlet;

import java.io.IOException;
import java.util.Date;
import java.util.Map;

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

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;

import cn.itcast.domain.MyConverter;
import cn.itcast.domain.User;

/**
 * 使用BeanUtils来封装数据
 * @author Administrator
 *
 */
public class User2Servlet extends HttpServlet {
	
	private static final long serialVersionUID = 4587417600858959675L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取数据
		Map<String, String []> map = request.getParameterMap();
		// 创建User对象
		User user = new User();
		
		// 完成注册(告诉封装数据的时候,遇到Date类型的时候,按着我给你传入对象的方式来解决)
		ConvertUtils.register(new MyConverter(), Date.class);
		
		// 可以使用工具类进行封装(导入包)
		try {
			BeanUtils.populate(user, map);
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 看结果
		System.out.println("用户名:"+user.getUsername());
		System.out.println("密码:"+user.getPassword());
		System.out.println("余额:"+user.getMoney());
		System.out.println("生日:"+user.getBirthday());
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

}



当遇到日期类型的时候,需要编写如下代码进行转换,要不后台会出现null 错误:

Myconvertor.java:

package cn.itcast.domain;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.beanutils.Converter;

/**
 * 完成日期转换
 * @author Administrator
 *
 */
public class MyConverter implements Converter{
	
	/**
	 * obj:用户输入的数据
	 */
	public Object convert(Class clazz, Object obj) {
		// 把obj转换日期类型
		String str = (String) obj;
		// 把字符串转换日期
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		Date date;
		try {
			// 转换
			date = format.parse(str);
		} catch (ParseException e) {
			e.printStackTrace();
			throw new RuntimeException("转换日期错误");
		}
		return date;
	}

}






 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值