问题?什么是javabean?原理是什么?用来干什么?
一、定义及原理:JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。属性名称符合这种模式,其他Java 类可以通过自省机制发现和操作这些JavaBean 的属性。用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包。JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。其实最重要的一个是它的本质是一二封装类,用来封装数据和中转数据的(个人理解)。
二、用法:
1、特殊写法
a、必须有默认的构造方法
b、所有字段定位私有的
c、提供公有的getter或setter方法,属性
d、一般实现java.io.Serializable
2、一定要符合Java的命名规范
3.bean类的例子
package com.dp.javaweb.domain;
import java.io.Serializable;
public class bean implements Serializable{
//80%的类都实现这个接口,虽然并不是都用,但是养成良好的习惯是好的
private String username;
private String password;
private boolean marry;
public bean() {//这个无参数构造方法,在使用jsp动作元素的时候就有用了。详情看以下的javabean的动作元素篇
// TODO Auto-generated constructor stub
}
public bean(String username, String password, boolean marry) {
super();
this.username = username;
this.password = password;
this.marry = marry;
}//
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 boolean isMarry() {//is和get是一样的
return marry;
}
public void setMarry(boolean marry) {
this.marry = marry;
}
}
生成getter和setter方法是有快捷键的,包括带参数的构造方法,快捷键是shift+alt+s找到以下图片处
***三、JSP中操作JavaBean的动作元素
1.jsp:useBean
作用:用于在指定域范围内查找指定名称的JavaBean对象,找到了就直接使用;没有找到,创建一个,并放到指定的域范围内。
属性:
id:必须的。JavaBean的名称
class:JavaBean的完整类名
scope:域范围。默认是page范围。可选值:page request session application
注意:如果该标签有主体内容,只在创建新对象时才会执行。
2.jsp:setProperty(必须先使用useBean)
作用:调用JavaBean的setter方法。还能自动类型转换,仅限基本类型
属性:
property:必须的。属性名称。比如setName,名称是username。
可以使用通配符*。使用前提是请求参数的名称与属性的名称完全一致。
name:必须的。哪个对象的?即jsp:useBean中的id的取值。
value:属性的取值。支持直接量;支持表达式(<%=表达式%>)。
param:请求参数名(这个的使用看以下例子)
3.jsp:getProperty(必须先使用useBean)
作用:调用JavaBean的getter方法。
property:必须的。属性的名称。比如getName,名称是username。
name:必须的。哪个对象的?即jsp:useBean中的id的取值。
动作元素使用例子:1.jsp结合上面的javabean类使用
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.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>
<jsp:useBean id="p" class="com.dp.javaweb.domain.bean" scope="page">aa</jsp:useBean>
<!-- aa值在查找到对象就不输出,否则就是创建对象时才输出 -->
<%=p.getUsername()%><!-- 这样就利用了产生的对象操作bean中的属性及方法了 -->
<!-- 那大家想一想,上面这个动作标签做了那些事呢?接下来我们用java代码说明: -->
<%--
com.dp.javaweb.domain.bean p=null;
synchronized{//查找指定范围及名称的JavaBean对像
p=(com.dp.javaweb.domain.bean)pageContext.getAttribute("p",PageContext.PAGE_SCOPE);
if(p==null){
p=new com.dp.javaweb.domain.bean();
//如果没有找到p属性,在这里就新建对象,但是没有无参数构造方法就不行
pageContext.setAttribute("p", p);//建一个名叫牌的对象放到bean类中
}
}
找到就继续操作嘛
--%>
<% String s="123456" ;%>
<jsp:setProperty property="password" name="p" value="<%=s %>"/>
<%=p.getPassword() %>
<br/>---------------- 利用请求参数名设置JavaBean的各种属性 ---------------------<br/>
<!-- http://localhost:8080/day10/1.jsp?name=abc&gender=female --><!-- 访问方式 -->
<jsp:setProperty property="username" name="p" param="username"/>
<jsp:setProperty property="password" name="p" param="password"/>
<%=p.getUsername() %><br/>
<%=p.getPassword()%><br/>
<hr/>
<!--http://localhost:8080/day10/1.jsp?username=abc&password=female 请求参数的名和属性的名称一样,就可以使用通配符* -->
<!-- 访问方式 -->
<jsp:setProperty property="*" name="p"/>
<jsp:getProperty property="username" name="p"/>
<jsp:getProperty property="password" name="p"/>
<jsp:getProperty property="marry" name="p"/>
</body>
</html>
结果: