欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

javaweb:JavaBean及内省

程序员文章站 2022-06-15 10:13:39
...

什么是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;
	}

}






 

 

 

 

相关标签: JavaBean