JavaBean技术
一、JavaBean介绍
在JSP网页开发的初级阶段,并没有所谓的框架与逻辑分层的概念,JSP网页代码是与业务逻辑代码写在一起的。这种零乱的代码书写方式,给程序的调试及维护带来了很大的困难,直至JavaBean的出现,这一问题才得到了改善。
1、JavaBean概述
在JSP网页开发初级阶段,并没有框架与逻辑分层概念产生,需要将Java代码嵌入到网页中,对JSP页面中的一些业务逻辑进行处理,如字符串处理、数据库操作等。
如果使HTML代码与Java代码相分离,将Java代码单独封装成为一个处理某种业务逻辑的类,然后在JSP页面中调用此类,则可以减低HTML代码与Java代码之间的耦合度,简化JSP页面,提高Java程序代码的重用性及灵活性。这种与HTML代码相分离,而使用Java代码封装的类,就是一个JavaBean组件,。在Java Web开发中,可以使用JavaBean组件来完成业务逻辑的处理。
2、JavaBean种类
起初,JavaBean的目的是为了将可以重复使用的代码进行打包。在传统的应用中,JavaBean主要用于实现一些可视化界面,如一个窗体、按钮、文本框等,这样的JavaBean称之为可视化JavaBean。随着技术的不断发展与项目的需求,目前JavaBean主要用于实现一些业务逻辑或封装一些业务对象,这样的JavaBean并没有可视化的按钮,所有又称之为非可视化JavaBean。
可视化的JavaBean一般应用于Swing的程序中,在Java Web开发中并不会采用,而是使用非可视化的JavaBean,实现一些业务逻辑或封装一些业务对象。
例子如下:
public class Email implements Serializable { private static final long serialVersionUID=1L; private String mailAdd; private boolean email;//是否是个标准的Email地址 public Email(){ } public Email(String mailAdd) { this.mailAdd = mailAdd; } public String getMailAdd() { return mailAdd; } public void setMailAdd(String mailAdd) { this.mailAdd = mailAdd; } public boolean isEmail() { String regex="\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";//正 则表达式,定义邮箱格式 if(mailAdd.matches(regex)){//判断字符串是否和正则表达式匹配 email=true;//email为真 } return email; } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form name="form1" action="result.jsp" method="post"> <table width="450" height="250" align="center" border="1"> <tr> <td colspan="2" align="center"> <b>邮箱认证系统</b> </td> </tr> <tr> <td align="right">邮箱地址</td> <td> <input type="text" name="mailAdd"> </td> </tr> <tr> <td align="center" colspan="2"> <input type="submit" value="提 交"> </td> </tr> </table> </form> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <jsp:useBean id="email" class="lyt.email.Email"></jsp:useBean> <jsp:setProperty name="email" property="*"></jsp:setProperty> <jsp:getProperty name="email" property="mailAdd"></jsp:getProperty> <%=email.isEmail()%> </body> </html>虽然在JavaBean的规范中,要求JavaBean对象提供默认无参构造方法,但除了默认无参构造方法外,JavaBean也可以根据相关属性提供构造方法。
二、JavaBean的应用
JavaBean是Java语言所写成的可重用组件,它可以应用于系统的很多层,如PO、VO、DTO、POJO等,其应用十分广泛。
1、获取JavaBean属性信息
在JavaBean对象中,为了防止外部直接对JavaBean属性的调用,,通常将JavaBean中的属性设置为私有的(private),但需要为其提供公共的(public)访问方法,也就是getXXX()方法。
例子:
public class Produce { private String name="机械键盘"; private double price=1880.5; public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <jsp:useBean id="produce" class="lyt.produce.Produce"></jsp:useBean> <div> <ul> <li>商品名称:<jsp:getProperty name="produce" property="name"> </jsp:getProperty></li> <li>价格:<jsp:getProperty name="produce" property="price"> </jsp:getProperty></li> </ul> </div> </body> </html>本示例通过<jsp:useBean>标签实例化商品的JavaBean对象,<jsp:getProperty>标签获取JavaBean中的属性信息。
2、对JavaBean属性赋值
编写JavaBean对象要遵循JavaBean规范,在JavaBean规范中的访问器setXXX()方法,用于对JavaBean中的属性赋值,如果对JavaBean对象提供了setXXXX()方法,在JSP页面中就可以通过<jsp:setProperty>对其进行赋值。
3、如何在JSP页面中应用JavaBean
在JSP页面中应用JavaBean非常简单,主要通过JSP动作标签<jsp:useBean>、<jsp:getProperty>、<jsp:setProperty>来实现对JavaBean对象的操作,但所编写的JavaBean对象要遵循JavaBean规范,只有严格遵循JavaBean规范,在JSP页面中才能够方便地调用及操作JavaBean。
将JavaBean对象应用到JSP页面中,JavaBean的生命周期可以自行设置,它存在于4中范围内,分别为page、request、session和application,默认情况下,JavaBean作用于page范围内。
例如:
public class Person { private String name;//名字 private int age;//年龄 private String sex;//性别 private String add;//地址 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAdd() { return add; } public void setAdd(String add) { this.add = add; } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form name="form1" action="reg.jsp"> <table align="center" width="400" height="200" border="1"> <tr> <td align="center" colspan="2" height="40"> <b>添加用户信息</b> </td> </tr> <tr> <td align="right">姓名:</td> <td> <input type="text" name="name"> </td> </tr> <tr> <td align="right">年龄</td> <td> <input type="text" name="age"> </td> </tr> <tr> <td align="right">性别:</td> <td> <input type="text" name="sex"> </td> </tr> <tr> <td align="right">地址:</td> <td> <input type="text" name="add"> </td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="添加"> </td> </tr> </table> </form> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <%request.setCharacterEncoding("UTF-8");%> <jsp:useBean id="person" class="lyt.com.Person" scope="page"> <jsp:setProperty name="person" property="*"></jsp:setProperty><!--接收表单数据--> </jsp:useBean> <table align="center" width="400"> <tr> <td align="right">姓名:</td> <td> <jsp:getProperty name="person" property="name"></jsp:getProperty> </td> </tr> <tr> <td align="right">年龄:</td> <td> <jsp:getProperty name="person" property="age"></jsp:getProperty> </td> </tr> <tr> <td align="right">性别:</td> <td> <jsp:getProperty name="person" property="sex"></jsp:getProperty> </td> </tr> <tr> <td align="right">地址:</td> <td> <jsp:getProperty name="person" property="add"> </jsp:getProperty> </td> </tr> </table> </body> </html>表单中信息中的属性名称最好设置为JavaBean中的属性名称,这样就可以通过“<jsp:setProperty property="*"/>”的形式接受所有参数,这种方式可以减少程序中的代码量。
如果所处理的表单信息中包含中文信息,通过JSP内置对象request获取的参数值将会出现中文乱码现象,此时可以通过request.setCharacterEncoding()方法指定字符编码格式进行解决。
表单中的属性名称与JavaBean中的属性名称不一致时,可以通过<jsp:setProperty>标签中的param属性来指定表单中的属性。如表单中的用户名username,可以使用<jsp:setProerty name="person" property="name" param="username"/>对其进行赋值。
三、在JSP中应用JavaBean
JavaBean在JSP页面中应用十分广泛,几乎所有的JSP页面中,所有的实体对象及业务逻辑的处理都有JavaBean封装,因此,JavaBean与JSP之间的关系十分密切。
1、解决中文乱码的JavaBean
在JSP页面中,处理中文字符经常会出现字符乱码的现象,特别是通过表单传递中文数据时容易产生。它的解决方法很多,如将request的字符集指定为中文字符集,编写JavaBean对中文乱码字符进行转码。
例子:
public class News { private String title; private String content; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
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("ISO-8859-1"),"UTF-8");//对字符进 行编码处理 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return text;//返回后的字符串 } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form name="form1" action="release.jsp" method="post"> <table align="center" width="450" height="260" border="1"> <tr> <td align="center" colspan="2"> <b>新闻发布</b> </td> </tr> <tr> <td align="right">标题</td> <td> <input type="text" name="title"> </td> </tr> <tr> <td align="right">内容</td> <td> <textarea name="content" cols="40" rows="8"></textarea> </td> </tr> <tr> <td colspan="2" align="center"> <input type="submit" value="发布"> </td> </tr> </table> </form> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>新闻发布结果</title> </head> <body> <jsp:useBean id="news" class="lyt.bean.News"></jsp:useBean><!--实例化News对象--> <jsp:useBean id="encoding" class="lyt.bean.CharactorEncoding"></jsp:useBean><!--实例化CharactorEncoding--> <jsp:setProperty name="news" property="*"></jsp:setProperty><!--对News对象 中的属性赋值--> <%=encoding.toString(news.getTitle())%> <%=encoding.toString(news.getContent())%> </body> </html>通过<jsp:useBean>标签实例化JavaBean对象,如果在JSP页面中使用java代码调用JavaBean对象中的属性和方法,所使用的JavaBean对象的变量名称为<jsp:useBean>标签中的id属性。
2在JSP页面中用来显示时间的JavaBean
JavaBean是java语言所写成的可重用组件,它可以是一个实体类对象,也可以是一个业务逻辑的处理,但编写JavaBean要遵循JavaBean规范。
例子:
public class DateTime { private String dateTime;//日期与时间 private String week;//星期 private Calendar calendar=Calendar.getInstance() ;//Calendar对象 /** * 获得当前日期及时间 * @return 日期及时间的字符串 */ public String getDateTime(){ Date currentDate=Calendar.getInstance().getTime();//获得当前时间 SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH点mm分ss秒");//实例化 SimpleDateFormat dateTime=sdf.format(currentDate);//格式化日期时间 return dateTime;//返回日期及时间的字符串 } public String getWeek(){ String[] weeks={"星期日","星期一","星期二","星期三","星期四","星期五","星 期六"};//定义数组 int index=calendar.get(Calendar.DAY_OF_WEEK);//获取一星期的某天索引 week=weeks[index-1];//获取星期几 return week; } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>时钟走动</title> <body> <style type="text/css"> #clock{ width: 420px; height: 80px; background: #EOEOEO; font-size: 25px; font-weight: bold; border: solid 5px orange; padding: 20px; } #week{ padding-top: 15px; color: #0080FF; } </style> <meta http-equiv="Refresh" content="1"> </head> <body> <jsp:useBean id="dateTime" class="lyt.date.DateTime" scope="application"></jsp:useBean> <div align="center"> <div id="clock"> <div id="time"> <jsp:getProperty name="dateTime" property="dateTime"></jsp:getProperty> </div> <div id="week"> <jsp:getProperty name="dateTime" property="week"></jsp:getProperty> </div> </div> </div> </body> </html>因为获取当前日期的JavaBean对象DateTime并不涉及更多的业务逻辑,所以实例中将它的作用域设置为application。这样做的好处是,在JSP页面中第一次调用该对象时实例化一个DateTime对象,以后再次调用时不需要再次实例化DateTime,因为它在application范围内已经存在。
为了实现网页中时钟的走动效果,可以通过不断刷新页面的方法来获取当前时间,实例中通过在<head>标签内加入代码<meta http-equiv="Refresh" content="1">来实现,加入代码后,网页每隔1s自动刷新网页一次,这样就可以显示时钟走动效果了。
3、将数组转化成字符串的JavaBean
在程序开发中,将数组转换成为字符串是经常被用到的,如表单中的复选框,在提交之后它就是一个数组对象,由于数组中对象在业务逻辑处理中不方便,所以在实际应用过程中通常将其转换成字符串后再进行处理。
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; } }
public class Convert { /** * 将数组转换为字符串 * @param arr 数组 * @return 字符串 */ public String arr2Str(String[] arr){ StringBuffer sb=new StringBuffer(); if(arr!=null&&arr.length>0){ for(String s:arr){ sb.append(s); sb.append(","); } if(sb.length()>0){ sb.deleteCharAt(sb.length()-1); } } return sb.toString(); } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="reg.jsp" method="post"> <div> <h1>调查问卷</h1> <hr/> <ul> <li>你经常用哪些编程语言开发程序</li> <li> <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="Python">Python </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="Sping MVC">Spring MVC </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> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <jsp:useBean id="paper" class="lyt.string.Paper"></jsp:useBean> <jsp:useBean id="convert" class="lyt.string.Convert"></jsp:useBean> <jsp:setProperty name="paper" property="*"></jsp:setProperty> <div> <h1>调查结果</h1> <hr/> <ul> <li> 你经常使用的编程语言: <%=convert.arr2Str(paper.getLanguages())%> </li> <li> 你目前掌握的技术: <%=convert.arr2Str(paper.getTechnics())%> </li> <li> 在学习中感觉有困难的部分: <%=convert.arr2Str(paper.getParts())%> </div> </li> </ul> </body> </html>至此,JavaBean技术讲完了。