对应书本第7章
总说:数据流,从哪流到哪;数据的存储与运算;
JavaBean就是将java代码封装成处理某种业务逻辑的类,在jsp中调用此类即可,简化jsp页面。

一般过程:先看看整个页面需要哪些数据,把整个页面的数据整体看成一个类写一个类,之后如果需要其他的方法可以再写其他类,在jsp中直接调用类即可。

JavaBean种类:
传统应用中,JavaBean主要用于实现一些可视化界面,如窗体、按钮等,称为可视化的JavaBean,一般用于Swing程序中;
目前JavaBean主要用于实现一些业务逻辑或封装一些业务对象,称为非可视化的JavaBean,用在java web 中。

例1:验证邮箱地址是否合法?

首先是创建一个Email类,放在1/Java Resources/src/com.lyq.bean包下
#############Email.java

package com.lyq.bean;

import java.io.Serializable;
/**
 * 邮件对象JavaBean
 * @author Li YongQiang
 */
public class Email implements Serializable {
    //  serialVersionUID 值
    private static final long serialVersionUID = 1L;
    // Email地址
    private String mailAdd;
    // 是否是一个标准的Email地址
    private boolean eamil;
    /**
     * 默认无参的构造方法
     */
    public Email() {
    }
    /**
     * 构造方法
     * @param mailAdd Email地址
     */
    public Email(String mailAdd) {
        this.mailAdd = mailAdd;
    }
    /**
     * 是否是一个标准的Email地址
     * @return 布尔值
     */
    public boolean isEamil() {
        // 正则表达式,定义邮箱格式
        String regex = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"; 
        // matches()方法可判断字符串是否与正则表达式匹配
        if (mailAdd.matches(regex)) { 
            // eamil为真
            eamil = true;
        }
        // 返回eamil
        return eamil;
    }
    public String getMailAdd() {
        return mailAdd;
    }
    public void setMailAdd(String mailAdd) {
        this.mailAdd = mailAdd;
    }
}

#################index.jsp
################### result.jsp

动作标签
JSP页面尽量避免java代码,用动作标签来代替java代码,动作标签来调用java类的方法。
例,有个类public class Produce

关于类对象的set和get总结:
例
<jsp:useBean id="produce" class="com.lyq.bean.Produce"></jsp:useBean>
SET:
// 调用一系列属性的set方法,property里放属性名,name里放对象名
<jsp:setProperty property="name" name="produce" value="洗衣机"/>
如果类Produce的属性名和页面index.jsp中多个文本框的名称相同,比如name、age、sex等,可以一次性直接多个赋值
<jsp:setProperty property="*" name="produce"/>

GET:
<jsp:getProperty property="count" name="produce"/>  或
<%= produce.getPrice() %>

例7.5
编写对字符转码的JavaBean,解决乱码问题

###############################News.java

package com.lyq.bean;
public class News {}
###############################CharactorEncoding.java
package com.lyq.bean;
import java.io.UnsupportedEncodingException;
public class CharactorEncoding {
    public CharactorEncoding(){
    }
    /**
     * 对字符进行转码处理
     * @param str 要转码的字符串
     * @return 编码后的字符串
     */
    public String toString(String str){
        String text = "";
        // 判断要转码的字符串是否有效
        if(str != null && !"".equals(str)){
            try {
                // 将字符串进行编码处理
                text = new String(str.getBytes("iso8859-1"),"GB18030");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        // 返回后的字符串
        return text;
    }
}
###############################index.jsp
<body>
    <form action="release.jsp" method="post">
        <table align="center" width="450" height="260" border="1">
            <tr>
                <td align="center" colspan="2" height="40" >
                    <b>新闻发布</b>
                </td>
            </tr>
            <tr>
                <td align="right">标 题:</td>
                <td>
                    <input type="text" name="title" size="30">
                </td>
            </tr>
            <tr>
                <td align="right">内 容:</td>
                <td>
                    <textarea name="content" rows="8" cols="40"></textarea>
                </td>
            </tr>
            <tr>
                <td align="center" colspan="2">
                    <input type="submit" value="发 布">
                </td>
            </tr>
        </table>
    </form>
</body>
###############################release.jsp
<body>
    // news 是News的对象
    <jsp:useBean id="news" class="com.lyq.bean.News"></jsp:useBean>
    // encoding是CharactorEncoding的对象
    <jsp:useBean id="encoding" class="com.lyq.bean.CharactorEncoding"></jsp:useBean>
    // 相当于把index.jsp页面中输入的值赋值给类News的对象news
    <jsp:setProperty property="*" name="news"/>
    <div align="center">
        <div id="container">
            <div id="title">
                <%= encoding.toString(news.getTitle())%>
            </div>
            <hr>
            <div id="content" >
                <%= encoding.toString(news.getContent())%>
            </div>
        </div>
    </div>
</body>

在学了JSTL标签库及EL表达式后,或一些MVC框架后,就可以通过标签取代所有的java代码。

例:页面显示实时时间

首先是JavaBean,写一个DateBean.java:
package com.lyq.bean;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateBean {
    // 日期及时间
    private String dateTime;
    // 星期
    private String week;
    // Calendar对象
    private Calendar calendar = Calendar.getInstance();

    public String getDateTime() {
        // 获取当前时间
        Date currDate = Calendar.getInstance().getTime();
        // 实例化SimpleDateFormat
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH点mm分ss秒");
        // 格式化日期时间
        dateTime = sdf.format(currDate);
        // 返回日期及时间的字符串
        return dateTime;
    }

    public String getWeek() {
        String[] weeks = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
        int index = calendar.get(Calendar.DAY_OF_WEEK);
        // 获取星期几
        week = weeks[index - 1];
        return week;
    }
}

之后在index.jsp页面中调用类的方法即可。
但是index.jsp中需要有设置页面刷新的语句。

页面刷新

推荐用法一,因为尽量减少java代码的出现,法二用了java代码
每隔一秒刷新:
法一:
<head>
<title>电子时钟</title>
<meta http-equiv="Refresh" content="1"> 
</head>

法二:
<body>
    <% response.setHeader("refresh", "1"); %>
</body>

程序中常把数组转为字符串处理

例7.7

对调查问卷的复选框转化为字符串处理,效果如下:

bean java 理解 java bean技术_java


bean java 理解 java bean技术_bean java 理解_02

分析:首先对于这个页面的数据怎样用类存储。实际上复选框提交后是按照数组存储的。所以先写个类存储数据。
之后再写个类用来将数组转为字符串;
在jsp中调用类即可。
##########################Paper.java

package com.lyq.bean;

import java.io.Serializable;
public class Paper implements Serializable {
    private static final long serialVersionUID = 1L;
    // 编程语言
    private String[] languages;
    // 掌握技术
    private String[] technics;
    // 部分
    private String[] parts;

    public Paper(){
    }
    public String[] getLanguages() {
        return languages;
    }
    public void setLanguages(String[] languages) {
        this.languages = languages;
    }
    public String[] getTechnics() {
        return technics;
    }
    public void setTechnics(String[] technics) {
        this.technics = technics;
    }
    public String[] getParts() {
        return parts;
    }
    public void setParts(String[] parts) {
        this.parts = parts;
    }
}

##########################Convert.java

package com.lyq.bean;
public class Convert {
    public String arr2Str(String[] arr){
        StringBuffer sb = new StringBuffer();
        // 判断arr是否为有效数组
        if(arr != null && arr.length > 0){
            // 遍历数组
            for (String s : arr) {
                sb.append(s);
                sb.append(",");
            }
            if(sb.length() > 0){
                // 截取字符
                sb = sb.deleteCharAt(sb.length() - 1);
            }
        }
        return sb.toString();
    }
}

##########################index.jsp

<body>
    <form action="reg.jsp" method="post">
        <div>
            <h1>调查问卷</h1>
            <ul>
                <li>你经常用哪些编程语言开发程序:</li>
                <li>
                // 同一系列的复选框都拥有相同的name
                    <input type="checkbox" name="languages" value="JAVA">JAVA
                    <input type="checkbox" name="languages" value="PHP">PHP
                    <input type="checkbox" name="languages" value=".NET">.NET
                    <input type="checkbox" name="languages" value="VC++">VC++
                </li>
            </ul>
            <ul>
                <li>你目前所掌握的技术:</li>
                <li>
                    <input type="checkbox" name="technics" value="HTML">HTML
                    <input type="checkbox" name="technics" value="JAVA BEAN">JAVA BEAN
                    <input type="checkbox" name="technics" value="JSP">JSP
                    <input type="checkbox" name="technics" value="SERVLET">SERVLET
                </li>
            </ul>
            <ul>
                <li>在学习中哪一部分感觉有困难:</li>
                <li>
                    <input type="checkbox" name="parts" value="JSP">JSP
                    <input type="checkbox" name="parts" value="STRUTS">STRUTS
                </li>
            </ul>
                <input type="submit" value="提 交">
        </div>
    </form>
</body>

##########################reg.jsp

<body>
    <jsp:useBean id="paper" class="com.lyq.bean.Paper"></jsp:useBean>
    <jsp:useBean id="convert" class="com.lyq.bean.Convert"></jsp:useBean>
    <jsp:setProperty property="*" name="paper"/>
    <div>
        <h1>调查结果</h1>
        <hr/>
        <ul>
            <li>
                你经常使用的编程语言:<%= convert.arr2Str(paper.getLanguages()) %> 。
            </li>
            <li>
                你目前所掌握的技术:<%= convert.arr2Str(paper.getTechnics()) %> 。
            </li>
            <li>
                在学习中感觉有困难的部分:<%= convert.arr2Str(paper.getParts()) %> 。
            </li>
        </ul>
    </div>
</body>