服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

用jbuilderx开发web应用程序

  borland公司的jbuilder是世界领先的java开发环境。目前最新版本jbuilderx是一个开发企业级java应用的综合性跨平台环境,它在使jbuilder屡获殊荣的性能上,增加了很多新的特性,从而成为目前最强大的 java可视化开发环境。本文将通过一个简单的web项目,使您快速进入jbuilderx的殿堂。

  jbuilderx的功能极其丰富,本文不会也不可能面面俱到地介绍所有的功能,只会对涉及例子项目开发的一些容易忽视或不容易掌握的功能展开介绍,而对一些常见的功能将一点而过,或不提及,相信您可以在项目开发操作过程中自然掌握那些基本的功能。您也可以通过jbuilderx在线帮助文档来了解和掌握这些内容,推荐您阅读help->jbuilder toturials中前4个基础教程。

  项目介绍

  虽然jbuilderx可以用于开发桌面、无线、applet等应用程序,但80%以上的使用者用它开发j2ee的web应用程序,所以我设计了一个简单的web应用项目,亦步亦趋地带领您开发出一个可以运行的web应用程序。

  这个web项目只包含一个用户登录的功能,其系统框图如下:


图1. 系统框图

  其中web应用服务器为tomcat4.1,数据库服务器为oracle10g。

   这个项目包括以下内容:

  1) 用户表t_user:用于保存用户的信息

  2) 登录页面login.htm:让用户录入用户名和密码

  3) 用户信息javabean类userbean:包括三个属性,即用户id和用户密码及用户名

  4) 获取数据库连接类dsbean:获取数据库链接,以便操作数据库

  5) 用户登录处理页面execute.jsp:将用户id,用户密码和数据库中的比较,产生结果页面

  6) 异常处理页面error.jsp:当发生异常时转入异常处理页面,显示人性化的错误信息

  项目中各项部分的协作关系如下图:


图2. 系统中各部分的协作关系

  创建数据库

  首先以system用户登录oracle数据库,创建数据库用户:

create user test identified by test;grant connect,resource to test;

  用户信息表t_user,该包括三个字段,其表的结构如下:

字段名类型 注释
user_id varchar2(10) 用户id
user_name varchar2(20) 用户名
password varchar2(30) 用户密码

  以test用户登录数据库,运行以下语句sql,创建用户信息表:

create table t_user ( user_id varchar2 (10) primary key, user_name varchar2(20), password varchar2(30))/

  往表中插入两条用户信息:

insert into t_user values(‘zhangshang’,’张三’,’123456’);insert into t_user values(‘lisi’,’李四’,’abc’);commit;

  创建项目工程

  创建工程:file->new project出现下面的界面:


图3. 创建项目工程

  项目取名为loginpro,放置在d:/loginpro路径中,一路按next就可以了。

  创建完项目工程后,在工程下创建一个web模块:file->new...->左边树选择web->双击右边窗口的web module(war)项目->在弹出的窗口中点选create empty web module,按next->在弹出的窗口中按以下设置:


图4. 设置web模块路径和技术标准

  web模块的名称为loginweb,放置在项目路径下的loginweb子文件夹中,设置servlet和jsp的版本。在设置完后直接点击finish完成web模块的创建。

  特别提醒读者,如果您开发的是web项目,一定要创建web模块,只有这样,在工程中开发的java类在rebuild后,jbuilderx才会调用ant工具,将编译后的class文件同步到web模块的web-inf目录中。笔者曾经有一个朋友向我报怨说用jbuilder开发web程序很麻烦,原来他没有在工程中创建web模块,每次更改类后,都不辞辛苦地将编译后的类手工拷到到web应用的web-inf/classes目录下,殊不知,金光大道已经开通,而自己还在羊肠小道里挣扎。

  编写类

  本项目中包括两个类,一个是用户信息类userbean.java,另一个是获取数据库连接类dsbean.java。下面我们来编写这两个类:

  首先编写userbean.java类:file->new class...弹出如下的窗口:


图5. 编写类向导

  在类向导的窗口界面上录入类的名字userbean,包名默认的是项目的名称,您可以更改其他更用意义的包名,我们简单地接受默认的包名。按ok后,在编辑窗口中得到如下的类代码:

package loginpro;public class userbean { public userbean() { }}

  下面我们给userbean类添加3个属性:在userbean的编辑窗口的底部点击bean标签页->选择bean标签下的properties的子标签页->在properties页面中通过add property来添加类的属性,点击该按钮弹出属性窗口->在此窗口中添加属性。

  不过笔者以为这种常规的给类添加属性的方法比较笨拙,效率很低,您可以直接通过在类中键入全局变量,然后再按上面的步骤切换到properties标签页,jbuilderx会自动将全局变量列在这个页面中,通过钩选getter和setter列中的复选框,变量的set和get方法就自动产生了,笔者在编写程序的时候选择采用这种方法。添加全局变量后,userbean代码如下(其中粗体红色为新增的代码,下同):

package loginpro;public class userbean
{
 private string userid;
 private string username;
 private string password;
 public userbean() { }
}

  切换到properties页面,钩选所有的getter和setter



  切换回代码页面后,属性的get和set方法都自动生成了:

...
public class userbean
{
 ...
 public string getpassword()
 {
  return password;
 }
 public string getuserid()
 {
  return userid;
 }
 public string getusername()
 {
  return username;
 }
 public void setusername(string username)
 {
  this.username = username;
 }
 public void setuserid(string userid)
 {
  this.userid = userid;
 }
 public void setpassword(string password)
 {
  this.password = password;
 }
}

  编写好userbean后我们再来编写获取数据连接的dsbean,在编写这个类之前,因为该类需要用到oracle的jdbc包,所以我们需要将oracle jdbc的jar包加载到类库中,再将其引入项目工程里。

  目前oracle最新的版本是oracle10g,如果您安装了oracle10g,则jdbc包位于[oracle_home]/jdbc/lib/classes12.jar,如果您未安排数据库,您可以到这儿下载jdbc驱动包,它是向下兼容的。假设我们已经将其下载到d:/extra目录中,我们通过以下操作将其加载到jbuilderx的类库中:tools->点击configure libraries弹出configure libraries窗口,如图6,首先点击configure libraries窗口左下方的new...弹出new library wizard窗口,在窗口中给该类取一个名字叫jdbclib,再点击该窗口的add...按钮弹出select one or more directories窗口,定位到d:/extra目录,选取class12.jar,然后确认即可。


图6. 添加新类到jbuilderx类库中

  接下来我们需要在项目中引用类库中这个新的jar包,这样项目才可以访问这个jdbc的jar包:project->project properties在弹出的窗口左边的树中选择paths,按照图7的操作完成引用的任务:


图7. 添加jdbc的jar包到项目中

  需要指出的是,如果项目需要引用大量的外部jar包,则可以将这些jar包组织到一个目录下,然后将整个目录加入到类库,在项目工程中引用该目录对应的类库名就可以在项目中调用这些包了。当rebuild项目时,jbuilderx还会将这些包同步到web应用的目录中。

  现在万事俱备了,我们开始编写dsbean.java:

package loginpro;
import java.sql.*;
public class dsbean
{
 public static connection getconnection() throws sqlexception
 {
  try
  {
   class.forname("oracle.jdbc.driver.oracledriver");
  }catch (classnotfoundexception ex)
  {
   system.out.println("数据库驱动程序没有找到。");
  }
  return drivermanager.getconnection("jdbc:oracle:thin:@192.168.0.189:1521:ora9i", "test", "test");
 }
}

  我的数据库装在ip为192.168.0.189的机器上,数据库的sid是ora9i,读者在编写时必须根据您的数据库的具体情况作相应的更改。

  编写完这两个类后,我们可以在项目工程面板中右击loginpro.jpx,选择rebuild,来编译这两个类,编译完后的类不但会输出到d:/loginpro/classes目录下,同时还将同步到d:/loginpro/loginweb/web-inf/classes目录中,并且将会将项目中引用的外部包拷贝一份到d:/loginpro/loginweb/web-inf/lib目录下。值得注意的是,如果用make命令来编译,则类只会输出到d:/loginpro/classes中,而不会同步到d:/loginpro/loginweb/web-inf/classes目录。对j2ee的web目录结构的探讨超越本文内容,请自行阅读相关资料。
登录页面和处理页面

  编写用户登录的页面login.htm:file->new file...弹出以下对话框:


图8. 创建login.htm

  在编辑窗口键入以下的页面代码:

<html>
<body>
 <form name="form1" method="post" action="execute.jsp">
  <input type="text" name="userid">
  <input type="text" name="password">
  <input type="submit" name="submit" value="提交">
 </form>
</body>
</html>

  该登录页面接受用户输入的用户id和密码,提交给execute.jsp页面处理,下面我们来编写execute.jsp:file->new...->在object gallery窗口中左边的树中选择web->在右边窗口中双击javaserver page图标将弹出如下的对话框:


图9. jsp页面向导

  在该对话框中的name中键入jsp页面的名字:execute,点击next,在弹出的页面中再点击next,进入向导的第3步,在这步中,允许您设置页面引用的javabean:


图10. 设置jsp页面引用的javabean

  点击ok后,loginpro.userbean类被定义为该页面的一个javabean,其id默认名为bean0,我们将其改为userbean,列表中还允许您指定这个javabean的作用域,我们选择session。直接点击finish得到execute.jsp文件的代码:

<%@ page contenttype="text/html; charset=gbk" %>
<html>
<head>
 <title>execute</title>
</head>
<jsp:usebean id="userbean" scope="session" class="loginpro.userbean" />
<jsp:setproperty name="userbean" property="*" />
<body bgcolor="#ffffff">
</body>
</html>

  需要指出的是<jsp:setproperty name="userbean" property="*" />以参数名匹配的方式接收客户端发送过来的参数值,在这里,当login.htm提交后userbean的userid和password两个将被设置为login.htm页面表单中两个输入框的值。

  接收到客户端的值后,程序将其和数据库中t_user表中的记录作比较,以便查明是否是合法用户,现在我们给execute.jsp添加代码,完成这些处理工作:

<%@ page contenttype="text/html; charset=gbk" errorpage="error.jsp"%>
<%@ page import="java.sql.*"%>
<%@ page import="loginpro.dsbean"%>
<html>
<head>
...
<jsp:setproperty name="userbean" property="*" />
<body bgcolor="#ffffff">
<% connection conn = dsbean.getconnection();
 string sqlstr = "select count(*) from t_user where user_id=? and password=?";   preparedstatement pstat = conn.preparestatement(sqlstr);
 pstat.setstring(1,userbean.getuserid());  
 pstat.setstring(2,userbean.getpassword());
 resultset rs = pstat.executequery();
 if(rs.next() && rs.getint(1) == 1)
  out.print("您是合法的用户,欢迎您的到来!"); else out.print("密码不对,或者您还没有注册为系统的用户");
%>
<body bgcolor="#ffffff">...

  我们只是简单地将userid和password的值发送到数据库中进行比较,在真正的应用中,一定事先要检查userid和password的值是否有单引号(’),如果有,必须将其转换成两个单引号(‘’),否则将产生安全漏洞问题,有兴趣的朋友可以在网上查找相关资料。

  最后的一个jsp是处理错误和异常的error.jsp,它的代码如下:

<%@ page contenttype="text/html; charset=gbk" iserrorpage="true" %>
<%@ page import="java.sql.sqlexception"%>
<html>
<head>
<title>error</title>
</head><body bgcolor="#ffffff">
<%
 if( exception instanceof sqlexception ) out.println("发生了数据库操作异常,请和系统管理员联系"); else out.println("发生了不可知的异常,请和系统管理员联系"); %>
</body>
</html>

  当execute.jsp发现数据库操作或其他的异常时,将会跳转到该错误处理页面,打印出可读性强的错误信息。

  由于jbuilderx对页面可视化的支持不强,您也可以在dreamweaver中完成html及jsp可视化内容的开发,而在jbuilderx中完成逻辑处理部分的开发,毕竟这个世界永远需要协作。

  在jbuilderx中运行web程序

  至此我们已经完成了项目中所有程序的开发工作,下面我们将在jbuilderx中运行该web程序。在运行程序之前,必须保证已经设置了web服务器。project->project properties...->在弹出窗口左边树中设置server:


  在single server for all services in project选项里选择tomcat4.1,其默认的设置是tomcat4.0。如果您给jbuilderx配置了其他的web服务器,如websphere或weblogic,它们都会列在该下拉框中。但是,我将不拟对此展开讨论,一个主要原因是,虽然jbuilderx允许您在开发环境中设置并运行这些服务,但由于这些重量级的web服务开启或关闭都需要很长的时间,给测试带来了很大的不便。所以我们一般的作法是先在轻量级的web服务(一般是tomcat中)中完成测试,再将其部署到真正的企业级web服务器中去。
更进一步,我们将不在jbuilderx中运行tomcat测试,而是通过外部的tomcat来测试,否则当jbuilderx开启测试的web服务后会给更改程序带来了不便。关于tomcat配置讨论已经超出了本文范围,有兴趣的朋友可以自行研究。为了简单,本文将在jbuilderx环境中完成测试。

  在编辑窗口中鼠标右击login.htm的标签,选择web run using “execute”:


图11. 运行web服务
 
  jbuilderx将自动完成web配置信息的设置并在8080端口启动web服务,login.htm登录页面展示出来接受用户的录入,我们以zhangshang/123456登录:


图12. 用户登录

  如果此时数据库还没有启动则execute.jsp转到error.jsp,错误页面输出以下内容:


图13. 错误页面

  在保证数据库启动及连接正常后,将得到正确登录的页面:


图14. 登录成功的页面

  您也可以启动ie,在ie的地址栏中键入正确的地址来运行程序。

  一些常见问题的解决方法

  在使用jbuilderx开发项目过程中,您可能会碰到一些小麻烦,在这里我将介绍两个常见的经常影响开发者情绪的问题及其解决方法。

  1、编辑界面不支持中文:您在编辑界面中键入的中文会变成一串不可识别的“口口口”,这个问题好象只出现在jbuilderx版本中,但也不一定会在每台机器上都发生。有一次,我的一个同事的jbuilderx就发生了这种情况,后来我帮其更改了jbuilderx的配置文件c:/documents and settings/administrator/.primetimex/user_zh.properties中的设置信息,才解决了这个问题,具体解决方法,您可以参考borland网站的这篇文章。

  2、 光标错位:这个问题是jbuilder开发工具的一个顽疾,每个jbuilder版本都存在这个问题(borland这种抱残守缺,矢志不移的精神让我纳闷,同时也很敬佩)。解决的方法很简单,对于低版本的jbuilder您可能将字体设置为宋体就可以了,但在jbuilderx中,字体选择下拉框中只列出两种字体:courier new和lucida sans typewriter,没有宋体,这是一个bug。但我们可能通过其它方法来曲线救国:tools->perferences...->点击弹出窗口左边的color在右边窗口的设置界面中列出了java,html/xml,jsp及其他格式文件的编写样式,去除所有粗体格式的设置:


图15. 设置代码格式

  如图15,您可以在界面的右下角的编辑框中点选加粗的语句,然后取消bold前面复选框的钩。这样就没有光标错位的问题了。

  总结

  jbuilder之所以如此流行的原因是显而易见的。由于其代码编辑的质量和开发者效率的特点,borland作为开发者和数据库工具供应商的声誉异常显赫。borland主导着ide市场。javapro和devx的研究表明,jbuilder一直是java开发者最普遍采用的,并且大大超过其它同类产品的采用率。

  本文以开发一个简单的例子为主线,向您介绍了用jbuilderx开发web项目的方方面面,并且适时地指出了开发中的一些实战经验和一些常见的问题。建议您在读完本文后,自己再试着在jbuilderx环境中重复开发这个例子,毕竟纸上得来终觉浅,绝知此事要躬行。


扫描关注微信公众号