EJB开发详细步骤及实例 MyEclipse+JBose+MySql 简易图书馆查询系统

      这是我分布式计算环境的课程设计,之前用过Socket做过,感觉EJB要比Socket简单的多(从代码行数比,嘿嘿)

      用了大概一个星期的时间,当然平时大多数时间上课。关于EJB环境搭建网上有很多的资料,但也很杂,总觉得很难按照一篇文章就能够搭建好EJB的开发环境,所以想总结下完整的开发步骤,或许对你有点帮助...

一. 开发环境的搭建

 

1.相关软件下载安装

1.1 MyEclipse_5.5.1GA

http://downloads.myeclipseide.com/downloads/products/eworkbench/5.5.1GA/MyEclipse_5.5.1GA_E3.2.2_FullStackInstaller.exe

下载完安装即可

 

1.2 JBoss-4.2.3.GA

http://downloads.sourceforge.net/jboss/jboss-4.2.3.GA-jdk6.zip?modtime=1216411914&big_mirror=1(官网下载地址)

下载完解压即可

 

1.3Mysql-5.0.18-win32

  http://download.mysql.cn/download_file/zip/5.0/mysql-5.0.18-win32.zip

下载完安装即可,安装完后进行Server配置,前面几步都安装默认配置就行,注意下面一步时:

 

Character Set要选择GBK,负责再用Mysql对中文数据进行操作时可能会出现乱码

1.4 Mysql-connector-java-3.0.1

http://jaist.dl.sourceforge.net/sourceforge/mmmysql/mysql-connector-java-3.0.1-beta.zip

下载完后解压到一个文件中即可,这个用于Myeclipse和Mysql进行连接...

当然更高版本的也可以,我在做我的课程设计的时候用的是5.1.7,但是下载地址找不到了,网上也有不少下载地址

jdk的安装过程在这就不说了...

2.开发环境搭建(以一个小的例子做讲解)

2.1添加JBoss

运行MyEcilpse

打开菜单Windows->Preferences,然后一次点击Myeclipse->Application Servers->JBoss4.x,得到如下的界面:

 

设置完后点击Ok,进入下面的界面

单击运行后JBoss便启动了

2.2创建EJB工程

菜单New->Progect,选择EJB project后点击Next进入下面的界面:

这里我们取工程名为CreateEJBDemo,单击next进入:

将两个复选框的勾去掉后点击Finish,进入以下界面:

之后进入界面:

按照上面的设置单击Finish,进入界面:

之后要在CreateEJBDemo.java文件中实现在CreateEJBDemoRemote中的所有函数,具体的见下面:

2.3 将工程加到JBoss中

右键单击上图中最下面Server中的JBoss 4.x,选择manage depolyments弹出对话框:

单击Add按钮,在弹出的对话框中选择刚刚建立的EJB工程CreateEJBDemo后单击Finish,于是便将工程加到JBoss中

下面添加类库:

右键单击Project Exporer中的我们已经建好的工程CreateEJBDemo,在弹出的菜单中选择最下面的properties后弹出对话框:

单击Add External jars,选择JBoss目录client->jbossall-client.jar后单击确定

2.4 新建客户端程序

选择class后弹出对话框如下:

单击Finish后进入下面:

按照上面的提示加入相应的代码后运行即可(如果JBoss没有启动,一定要先启动,启动的方法前面说过)另外说下,好像每次程序有所改动,都要重新启动JBoss后在运行才能有效果,否则还是原来的...

3.连接Mysql

上面介绍完了基本的C/S通信过程,下面介绍下如何在Myeclipse连接Mysql

首先如下图所示:

之后连接MySQL数据库:

选择菜单中的Window->show view->DB browser,如果没有可选择最下面的other,在弹出的对话框中选择Myeclispse enterprise workbench->DB browser,进入下面的界面:

之后:

这些设置好后,即可在程序中连接Mysql了,连接代码如下:(这段连接代码是我课程设计中的,我在Mysql中建立了数据库bookstore,又新建了表格library,结构如图:

 

  

  1. public String MysqlConnect(String SearchStr) throws SQLException
  2.     {
  3.         String mysql_search_result="";
  4.         String query_str="select * from library where bookname REGEXP "+"'"+SearchStr+"'";      
  5.         System.out.println(query_str);
  6.         try                 //注册驱动
  7.         {
  8.             Class.forName("com.mysql.jdbc.Driver");
  9.         }
  10.         catch (ClassNotFoundException e)
  11.         {   
  12.             mysql_search_result="begin error";
  13.             e.printStackTrace();
  14.         }
  15.         java.sql.Statement state=null;          //数据库表达式
  16.         java.sql.Connection mysql_connect = null;       //数据库连接
  17.         java.sql.ResultSet search_result=null;  //查询结果集
  18.         
  19.         //下面连接数据库并进行查询
  20.         try
  21.         {
  22.             mysql_connect=java.sql.DriverManager.getConnection("jdbc:mysql://localhost:3306/bookstore?useUnicode=true&characterEncoding=GBK","root","123456");
  23.             state=mysql_connect.createStatement();
  24.             search_result=state.executeQuery(query_str);
  25.             while(search_result.next())
  26.             {
  27.                 //每条记录的各列项之间用"#"隔开
  28.                 mysql_search_result+=search_result.getString("bookname")+"#"+search_result.getString("author")+"#"+search_result.getString("publicaddr")+"#"+search_result.getString("publictime")+"#"+search_result.getString("abstract")+"#"+search_result.getString("catalog")+"#";
  29.             }
  30.         }
  31.         catch(SQLException e)
  32.         {
  33.             mysql_search_result="error";
  34.             e.printStackTrace();
  35.         }
  36.         finally
  37.         {
  38.             try
  39.             {
  40.                 search_result.close();
  41.             }
  42.             catch (SQLException e)
  43.             {
  44.             }
  45.             try
  46.             {
  47.                 state.close();
  48.             }
  49.             catch (SQLException e)
  50.             {
  51.             }
  52.             try
  53.             {
  54.                 mysql_connect.close();
  55.             }
  56.             catch (SQLException e)
  57.             {
  58.             }
  59.         }
  60.         return mysql_search_result;
  61.     }

    下面是我的课程设计实例

界面:

 

      

具体代码:

客户端:SimpliLibraryClient:

  1. import java.util.Hashtable;
  2. import javax.naming.Context;
  3. import javax.naming.InitialContext;
  4. import java.util.*;
  5. import javax.naming.*;
  6. import java.awt.*;
  7. import java.awt.event.*;
  8. import java.io.*;
  9. import javax.swing.*;
  10. import javax.swing.event.ListSelectionEvent;
  11. import javax.swing.table.*;
  12. import org.jboss.util.file.Files;
  13. public class SimpleLibraryClient extends JPanel implements ActionListener
  14. {
  15.     private JTextField text_input;              //查询输入框
  16.     private JButton  button_search,button_help,button_ok;       //查询按钮,帮助按钮,确定按钮
  17.     private JLabel label_search_result;
  18.     static String result=null;              //存储从服务器接收到的查询结果
  19.     static String InputSearchStr=null;      //保存用户的查询信息
  20.     String[] store_search_result=new String[30];//查询结果缓存
  21.     JTable table;               //显示查询结果
  22.     String columnNames[] = {"书名","作者","出版社","出版时间","简介","目录"};
  23.     String selected_bookname;   //保存用户选择的书籍的名称
  24.     
  25.     /*创建图形窗口*/
  26.     public SimpleLibraryClient()
  27.     {
  28.         //创建GridBagLayout对象,界面布局使用GridBagLayout类
  29.         this.setLayout(new GridBagLayout());  
  30.         GridBagConstraints local= new GridBagConstraints();
  31.         //查询输入框
  32.         text_input=new JTextField(20);
  33.         local.gridx=0;
  34.         local.gridy=0;
  35.         local.gridwidth=2;
  36.         local.gridheight=1;
  37.         this.add(text_input,local);
  38.         
  39.         //查询按钮
  40.         button_search=new JButton("Search");
  41.         button_search.addActionListener((ActionListener) this);
  42.         local.gridx=2;
  43.         local.gridwidth=1;
  44.         this.add(button_search,local);
  45.         
  46.         //标签
  47.         label_search_result=new JLabel("Search Result:");
  48.         local.gridx=0;
  49.         local.gridy=2;
  50.         local.gridwidth=2;
  51.         this.add(label_search_result,local);
  52.         
  53.         
  54.         //JTable控件,用于显示查询结果
  55.         String data[][]={};
  56.         DefaultTableModel model = new DefaultTableModel(data, columnNames);
  57.         table = new JTable(model);
  58.         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);   
  59.         table.setColumnSelectionAllowed(true); 
  60.         table.setPreferredScrollableViewportSize(new Dimension(550,30));
  61.         table.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
  62.         JScrollPane pane= new JScrollPane (table);
  63.         pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);//设置JTable具有横向和纵向滚动条
  64.         pane.setSize(200,50);
  65.         local.gridx=0;
  66.         local.gridy=3;
  67.         local.gridwidth=3;
  68.         local.gridheight=1;
  69.         this.add(pane,local);
  70.         
  71.         
  72.         //帮助按钮和确定按钮
  73.         button_help=new JButton("Help");
  74.         button_help.addActionListener((ActionListener) this);
  75.         local.gridx=1;
  76.         local.gridy=8;
  77.         local.gridwidth=1;
  78.         local.gridheight=1;
  79.         this.add(button_help,local);
  80.         
  81.         button_ok=new JButton("OK");
  82.         button_ok.addActionListener((ActionListener) this);
  83.         local.gridx=2;
  84.         this.add(button_ok,local);
  85.     }
  86.     /*与服务器进行连接*/
  87.     public static String ConnectToServer(String ClientRequestStr)throws Exception
  88.     {
  89.         String SearchResultStr;
  90.         //手工初始化的过程
  91.         Hashtable properties=new Hashtable();
  92.         //配置驱动程序,JBoss特定的
  93.         properties.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
  94.         //配置URL,JBoss特定的
  95.         properties.put(Context.PROVIDER_URL,"jnp://localhost");
  96.         InitialContext ctx=new javax.naming.InitialContext(properties);
  97.         session.SimpleLibraryBeanRemote remote=(session.SimpleLibraryBeanRemote)ctx.lookup("SimpleLibraryBean/remote");
  98.         SearchResultStr=remote.ReceiveFun(ClientRequestStr);
  99.         ctx.close();
  100.         return SearchResultStr;
  101.     }
  102.     public void actionPerformed(ActionEvent e) 
  103.     {
  104.         //当用户点击查询按钮时
  105.         if(e.getSource()==button_search)
  106.         {
  107.             InputSearchStr=text_input.getText();
  108.             store_search_result=null;
  109.             String write_to_file=null;  
  110.             int length=0;
  111.             try {
  112.                     File write = new File("result.txt");
  113.                     BufferedWriter bw = new BufferedWriter(new FileWriter(write));
  114.                     result=ConnectToServer(InputSearchStr);
  115.                     //没有查询结果时,这里的判断条件可能有问题,当我写成if(result==null)时,有错误,姑且就直接向下面这样判断
  116.                     if(result.length()<5)
  117.                     {
  118.                         JFrame frame=new JFrame("提示信息");
  119.                         String back_info="对不起没有你所查找的书籍";
  120.                         JLabel label=new JLabel(back_info);
  121.                         frame.add(label);
  122.                         frame.setSize(250,100);
  123.                         frame.setLocation(300,240);
  124.                         frame.show();
  125.                         write_to_file="查询关键字:"+InputSearchStr+"/n/r"+"查询结果如下(保存的是从服务器接收到的原始数据形式,每条记录之间插入'#',以便客户端进行解析):"+"/n/r"+"对不起,没有你所要查询的书籍";
  126.                         bw.write(write_to_file);
  127.                         bw.close();
  128.                     }
  129.                     else
  130.                     {
  131.                         store_search_result=result.split("#");//根据#对查询结果进行拆解,并将结果写入数组store_search_result
  132.                         length=store_search_result.length;
  133.                         System.out.println(result);
  134.                         //清空JTable控件中的内容
  135.                         for(int m=table.getRowCount()-1;m>=0;m--) 
  136.                         {
  137.                               ((DefaultTableModel)table.getModel()).removeRow(m);
  138.                         }
  139.                         DefaultTableModel tableModel = (DefaultTableModel)table.getModel();   
  140.                         int i,j;
  141.                         String temp[]=new String[6];
  142.                         //当查询结果有多条时,利用下面的两重FOR循环实现将每一条记录插入JTable中
  143.                         for(i=0;i<length%5;i++)     //控制记录的条数
  144.                         {
  145.                             for(j=0;j<=5;j++)       //控制每条记录中的各列
  146.                             {
  147.                                 temp[j]=store_search_result[i*6+j];
  148.                             }
  149.                             tableModel.addRow(temp);//将每条记录插入JTable中
  150.                         }
  151.                         //根据作业要求,将查询关键字和查询结果保存到结果文件"result.txt"中
  152.                         write_to_file="查询关键字:"+InputSearchStr+"/n/r"+"查询结果如下(保存的是从服务器接收到的原始数据形式,每条记录之间插入'#',以便客户端进行解析):"+"/n/r"+result;
  153.                         bw.write(write_to_file);
  154.                         bw.close();
  155.                     }
  156.                 } 
  157.             catch (Exception e1) 
  158.                 {
  159.                     e1.printStackTrace();
  160.                 }
  161.         }
  162.         //如果点击确定按钮
  163.         if(e.getSource()==button_ok)
  164.         {
  165.             int i=table.getSelectedRow(); 
  166.             selected_bookname=(String)table.getValueAt(table.getSelectedRow(),0);
  167.             JFrame frame=new JFrame("选取的书籍");
  168.             String back_info="你所选取的书籍是:"+"/n/r"+selected_bookname;
  169.             JLabel label=new JLabel(back_info);
  170.             frame.add(label);
  171.             frame.setSize(250,100);
  172.             frame.setLocation(300,240);
  173.             frame.show();
  174.         }
  175.         //如果点击帮助按钮
  176.         if(e.getSource()==button_help)
  177.         {
  178.             JFrame frame=new JFrame("帮助信息");
  179.             String back_info= "点击查询按钮查询你要找的书籍,单击查询结果中你想要的书籍然后单击ok,将选取这本书";
  180.             JLabel label=new JLabel(back_info);
  181.             frame.add(label);
  182.             frame.setSize(350,200);
  183.             frame.setLocation(300,240);
  184.             frame.show();
  185.         }
  186.     }
  187.     public static void main(String[] args) throws Exception
  188.     {
  189.         JFrame JF = new JFrame("简易图书馆查询系统");
  190.         JPanel panel = new SimpleLibraryClient();
  191.         JF.getContentPane().add(panel);
  192.         JF.pack();
  193.         JF.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  194.         JF.setSize(700,200);
  195.         JF.setVisible(true);
  196.     }
  197. }

服务器端:

SimpliLibraryBeanRemote:

  1. package session;
  2. import java.sql.SQLException;
  3. import javax.ejb.Remote;
  4. @Remote
  5. public interface SimpleLibraryBeanRemote {
  6.     public String ReceiveFun(String ReceiveStr);//用于接受从客户端传送来的数据
  7.     public String MysqlConnect(String SearchStr) throws SQLException;//用于与数据库进行连接
  8. }

SimpliLibraryBean:

  1. package session;
  2. import javax.activation.DataSource;
  3. import javax.ejb.Stateless;
  4. import javax.naming.InitialContext;
  5. import java.sql.*;
  6. import javax.naming.*;
  7. @Stateless
  8. public class SimpleLibraryBean implements SimpleLibraryBeanLocal,SimpleLibraryBeanRemote 
  9. {
  10.     String receive_str;
  11.     public String ReceiveFun(String ReceiveStr)
  12.     {
  13.         receive_str=ReceiveStr;
  14.         String result = null;
  15.         try {
  16.             result = MysqlConnect(receive_str);
  17.         } catch (SQLException e) {
  18.             // TODO Auto-generated catch block
  19.             e.printStackTrace();
  20.         }
  21.         return result;
  22.     }
  23.     public String MysqlConnect(String SearchStr) throws SQLException
  24.     {
  25.         String mysql_search_result="";
  26.         String query_str="select * from library where bookname REGEXP "+"'"+SearchStr+"'";      
  27.         System.out.println(query_str);
  28.         try                 //注册驱动
  29.         {
  30.             Class.forName("com.mysql.jdbc.Driver");
  31.         }
  32.         catch (ClassNotFoundException e)
  33.         {   
  34.             mysql_search_result="begin error";
  35.             e.printStackTrace();
  36.         }
  37.         java.sql.Statement state=null;          //数据库表达式
  38.         java.sql.Connection mysql_connect = null;       //数据库连接
  39.         java.sql.ResultSet search_result=null;  //查询结果集
  40.         
  41.         //下面连接数据库并进行查询
  42.         try
  43.         {
  44.             mysql_connect=java.sql.DriverManager.getConnection("jdbc:mysql://localhost:3306/bookstore?useUnicode=true&characterEncoding=GBK","root","123456");
  45.             state=mysql_connect.createStatement();
  46.             search_result=state.executeQuery(query_str);
  47.             while(search_result.next())
  48.             {
  49.                 //每条记录的各列项之间用"#"隔开
  50.                 mysql_search_result+=search_result.getString("bookname")+"#"+search_result.getString("author")+"#"+search_result.getString("publicaddr")+"#"+search_result.getString("publictime")+"#"+search_result.getString("abstract")+"#"+search_result.getString("catalog")+"#";
  51.             }
  52.         }
  53.         catch(SQLException e)
  54.         {
  55.             mysql_search_result="error";
  56.             e.printStackTrace();
  57.         }
  58.         finally
  59.         {
  60.             try
  61.             {
  62.                 search_result.close();
  63.             }
  64.             catch (SQLException e)
  65.             {
  66.             }
  67.             try
  68.             {
  69.                 state.close();
  70.             }
  71.             catch (SQLException e)
  72.             {
  73.             }
  74.             try
  75.             {
  76.                 mysql_connect.close();
  77.             }
  78.             catch (SQLException e)
  79.             {
  80.             }
  81.         }
  82.         return mysql_search_result;
  83.     }
  84.         
  85.     
  86. }
  • 0
    点赞
  • 7
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值