佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 943|回复: 14

JAVA问题!!

[复制链接]
发表于 14-3-2006 12:10 AM | 显示全部楼层 |阅读模式
我问个关于JAVA的问题。。
比如一家公司的一个的Employee,我们暂分去三类Admin,account的,和technician的~
在一个System里面,要如何指定某一类Employee只能指定的action?~
例如,Admin能更改资料,而Technician只能view那些record~
那应该用什么方法来做,我真的一点头绪也没有~~

是不是用Visibility Modifier来做呢?~
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 14-3-2006 05:31 AM | 显示全部楼层
想下想下~~Abstract classes好像能够做到~~
回复

使用道具 举报

发表于 14-3-2006 10:42 AM | 显示全部楼层
原帖由 Hou_Chai 于 14-3-2006 12:10 AM 发表
我问个关于JAVA的问题。。
比如一家公司的一个的Employee,我们暂分去三类Admin,account的,和technician的~
在一个System里面,要如何指定某一类Employee只能指定的action?~
例如,Admin能更改资料,而Techni ...


请问你是使用database来控制这些员工的Action吗?
回复

使用道具 举报

 楼主| 发表于 14-3-2006 12:00 PM | 显示全部楼层
原帖由 ktsiang 于 14-3-2006 10:42 AM 发表


请问你是使用database来控制这些员工的Action吗?



对~有用到database~
回复

使用道具 举报

发表于 14-3-2006 01:42 PM | 显示全部楼层
可以在interface动手脚。
当某一个user login时,依照他的权限而把他不能用的button set成不能按。
我是这样做的。
回复

使用道具 举报

 楼主| 发表于 14-3-2006 02:46 PM | 显示全部楼层
原帖由 Netmercury 于 14-3-2006 01:42 PM 发表
可以在interface动手脚。
当某一个user login时,依照他的权限而把他不能用的button set成不能按。
我是这样做的。


那好像很什么沃~
就好像fillin form酱,他一样可以填textfield...
虽然说是没办法add data去database,怎样说也不user friendly了~~

有没有可能将某些button,pane之类的东西invisible它~
回复

使用道具 举报

Follow Us
 楼主| 发表于 15-3-2006 02:44 AM | 显示全部楼层
请问这是什么问题??~
我不能把那result send回去~~

public void actionPerformed(ActionEvent ae) {
           
   da = new DatabaseAccess();
           
     if (ae.getSource() == btLogin) {
              
       try{
          boolean success = da.Login(tfID.getText(),tfPassword.getText());
                               
                if(success){
                        frame.dispose();
                        String result = da.toString(tfID.getText(),tfPassword.getText());
                        new Mainmenu();
                        new MessageWindow(frame,"Login success");
                }
                                       
                else{
                        tfID.setText("");
                        tfPassword.setText("");
                        new MessageWindow(frame,"Login not success");
                     }       
                 }
                        catch(Exception e){
                                new MessageWindow(frame,e.getMessage());
                        }               
                }
   }

------------------------------------------------------------------------------------------

public String toString(String ID, String password) throws SQLException {
               
        String result;
               
        String sql = "select Emp_ID, Emp_Password, Access_level from Employee";
        rs = stmt.executeQuery(sql);
               
        try{
            while(rs.next()){
                   if(ID.equals(rs.getString("Emp_ID")) && password.equals(rs.getString("Emp_Password")))
                   result = rs.getInt("Access_level");
                                                                                                           
                           }
                }
               
                catch(Exception e){
                        //throw new SQLException(e.getMessage());
                }
               
                return result;
        }

---------------------------------------------------------------------------------
Error 是 incompatible types
回复

使用道具 举报

发表于 15-3-2006 11:36 AM | 显示全部楼层
原帖由 Hou_Chai 于 14-3-2006 02:46 PM 发表


那好像很什么沃~
就好像fillin form酱,他一样可以填textfield...
虽然说是没办法add data去database,怎样说也不user friendly了~~

有没有可能将某些button,pane之类的东西invisible它~


JComponent.setVisible(false); //component in invisible mode.
回复

使用道具 举报


ADVERTISEMENT

发表于 15-3-2006 11:46 AM | 显示全部楼层
原帖由 Hou_Chai 于 15-3-2006 02:44 AM 发表
请问这是什么问题??~
我不能把那result send回去~~

public void actionPerformed(ActionEvent ae) {
           
   da = new DatabaseAccess();
           
     if (ae.getSource() == btLogin) {
       ...


看不懂,忽职守帮不了你。
回复

使用道具 举报

发表于 15-3-2006 06:09 PM | 显示全部楼层
你把Login method的return type放成integer,
如果login不成功就return 0,
以Admin login成功的话就return 1,
account return 2,
technician return 3.

然后依照各自的权限而set components的visible。
用楼上的这个,
JComponent.setVisible(false); //component in invisible mode.


原帖由 Hou_Chai 于 15-3-2006 02:44 AM 发表
请问这是什么问题??~
我不能把那result send回去~~

public void actionPerformed(ActionEvent ae) {
           
   da = new DatabaseAccess();
           
     if (ae.getSource() == btLogin) {
       ...



试试把toString method里的第一行,
String result;
换成
String result="";

应该是要先initialize一个value给它。
回复

使用道具 举报

发表于 15-3-2006 10:12 PM | 显示全部楼层
用integer来做access right是不行的, 第一,你的codes会很难扩展,没有弹性, 第二, 加新的access right 需要你改很多的地方, high cohesion.

我这里有一种方法能解决以上的问题, 同时能给你很多的方便. 以下的方法是使用strategy design pattern,
http://www.dofactory.com/Patterns/PatternStrategy.aspx#UML


  1. /*
  2. * Strategy Pattern Implementation
  3. */
  4. public interface MemberAccountPrivilege {
  5.        
  6.         public boolean isAllowAddMember();
  7.        
  8.         public boolean isAllowEditMember();
  9.        
  10.         public boolean isAllowDeleteMember();
  11. }
复制代码

  1. /*
  2. * Strategy Pattern Implementation
  3. */
  4. public interface PackagePrivilege {
  5.         public boolean isAllowAddPackage();
  6.        
  7.         public boolean isAllowEditPackage();
  8.        
  9.         public boolean isAllowDeletePackage();
  10. }
复制代码

  1. public class User {
  2.         private String userID;
  3.        
  4.         public User(){       
  5.         }
  6.        
  7.         public String getUserID() {
  8.                 return userID;
  9.         }
  10.         public void setUserID(String userID) {
  11.                 this.userID = userID;
  12.         }
  13.        
  14.         //Good practive to override toString method
  15.         public String toString(){
  16.                 return userID;
  17.         }
  18. }
复制代码


这地方放你全部需要access control的东东..关于User Class, 你可以选择extends User class, 或者把它当local variable来用...或者不要, 我extends User class 是因为我可以用User class的variable


  1. public class UserPrivilege extends User{
  2.         private MemberAccountPrivilege memberPrivilege;
  3.         private PackagePrivilege packagePrivilege;
  4.        
  5.         public PackagePrivilege getPackagePrivilege() {
  6.                 return packagePrivilege;
  7.         }

  8.         public void setPackagePrivilege(PackagePrivilege packagePrivilege) {
  9.                 this.packagePrivilege = packagePrivilege;
  10.         }

  11.         public MemberAccountPrivilege getMemberPrivilege() {
  12.                 return memberPrivilege;
  13.         }

  14.         public void setMemberPrivilege(MemberAccountPrivilege memberPrivilege) {
  15.                 this.memberPrivilege = memberPrivilege;
  16.         }
  17. }
复制代码


好了, 我们可以使用以上的codes, 例如你的MemberMainScreen, 你可以用以下方法来control 你的user 的access right. 你也可以用以下的例子用在其他的screen, 例如PackageMainScreen 等等...

  1.         private JButton addMemberButton;
  2.         private JButton deleteMemberButton;
  3.         private JButton editMemberButton;
  4. ....
  5. ....
  6.         addMemberButton.setEnabled(userPrivilege.getMemberPrivilege().isAllowAddMember());
  7.         deleteMemberButton.setEnabled(userPrivilege.getMemberPrivilege().isAllowDeleteMember());
  8.         editMemberButton.setEnabled(userPrivilege.getMemberPrivilege().isAllowEditMember());
  9.        
  10. }
复制代码


来啦,重点就在这里, 你可以hard code, 你的user access privilege, 但是我还是建议如果可以的话把他们的
setting 存放在database, 一来你可以define 很多不同的user access privilege, 例如power user, operator,
backup user 等等.

  1.                 UserPrivilege admin= new UserPrivilege();
  2.                
  3.                 admin.setUserID("admin");
  4.                 admin.setMemberPrivilege(new MemberAccountPrivilege(){
  5.                         public boolean isAllowAddMember() {
  6.                                 return true;
  7.                         }
  8.                        
  9.                         public boolean isAllowEditMember() {
  10.                                 return true;
  11.                         }

  12.                         public boolean isAllowDeleteMember() {
  13.                                 return true;
  14.                         }
  15.                 });
  16.                
  17.                 UserPrivilege user= new UserPrivilege();
  18.                 user.setUserID("user");
  19.                 user.setMemberPrivilege(new MemberAccountPrivilege(){
  20.                         public boolean isAllowAddMember() {
  21.                                 return true;
  22.                         }
  23.                        
  24.                         public boolean isAllowEditMember() {
  25.                                 return true;
  26.                         }

  27.                         public boolean isAllowDeleteMember() {
  28.                                 return false;
  29.                         }
  30.                 });
复制代码


以上的写法非常的flexible, 你可以加很多不同user 而又不需要更改MemberMainScreen, PackageMainScreen 等等的codes.

你的 incompatible types 问题是出在这里

      try{
            while(rs.next()){
                   if(ID.equals(rs.getString("Emp_ID")) && password.equals(rs.getString("Emp_Password")))
                  
                         //result = rs.getInt("Access_level");
                         result = rs.getString("Access_level");
                                                                                                           
                           }
                }
               
                catch(Exception e){
                        //throw new SQLException(e.getMessage());
                }
               
                return result;
        }
result is string not int....

可以的话, 用 JPasswordField 的 getPassword() method, 这可以避免"追踪"tool, 因为 String 是Object, 你的password 可能还没让Garbage Collection sweep, 而被"追踪"tool找到.

[ 本帖最后由 黑木头 于 15-3-2006 10:51 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 15-3-2006 10:35 PM | 显示全部楼层
原帖由 黑木头 于 15-3-2006 10:12 PM 发表
用integer来做access right是不行的, 第一,你的codes会很难扩展,没有弹性, 第二, 加新的access right 需要你改很多的地方, high cohesion.

我这里有一种方法能解决以上的问题, 同时能给你很多的方便. 以下的方 ...



可能是我不聪明的关系。。。
看不明白丫~
回复

使用道具 举报

发表于 15-3-2006 10:56 PM | 显示全部楼层
原帖由 Hou_Chai 于 15-3-2006 10:35 PM 发表

可能是我不聪明的关系。。。
看不明白丫~


看不明白, 我也没办法....
回复

使用道具 举报

 楼主| 发表于 15-3-2006 11:29 PM | 显示全部楼层
原帖由 Netmercury 于 15-3-2006 06:09 PM 发表
你把Login method的return type放成integer,
如果login不成功就return 0,
以Admin login成功的话就return 1,
account return 2,
technician return 3.

然后依照各自的权限而set components的visible。
...



问题真的出现在string那边,现在成功getString了~
谢谢~~
回复

使用道具 举报

发表于 16-3-2006 01:19 AM | 显示全部楼层
原帖由 黑木头 于 15-3-2006 10:12 PM 发表
用integer来做access right是不行的, 第一,你的codes会很难扩展,没有弹性, 第二, 加新的access right 需要你改很多的地方, high cohesion.

我这里有一种方法能解决以上的问题, 同时能给你很多的方便. 以下的方 ...



原来是这样的。
真的是很好的方法,谢谢黑木头。

是比较flexible,以后加user和权限也比较方便。
但是如果hou zai不明白就用回我刚才说的方法吧,只是以后加user会比较辛苦和乱水。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 31-5-2024 05:33 AM , Processed in 0.071873 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表