查看: 1013|回复: 14
|
JAVA问题!!
[复制链接]
|
|
我问个关于JAVA的问题。。
比如一家公司的一个的Employee,我们暂分去三类Admin,account的,和technician的~
在一个System里面,要如何指定某一类Employee只能指定的action?~
例如,Admin能更改资料,而Technician只能view那些record~
那应该用什么方法来做,我真的一点头绪也没有~~
是不是用Visibility Modifier来做呢?~ |
|
|
|
|
|
|
|
楼主 |
发表于 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它~ |
|
|
|
|
|
|
|
楼主 |
发表于 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. |
|
|
|
|
|
|
|
发表于 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
- /*
- * Strategy Pattern Implementation
- */
- public interface MemberAccountPrivilege {
-
- public boolean isAllowAddMember();
-
- public boolean isAllowEditMember();
-
- public boolean isAllowDeleteMember();
- }
复制代码
- /*
- * Strategy Pattern Implementation
- */
- public interface PackagePrivilege {
- public boolean isAllowAddPackage();
-
- public boolean isAllowEditPackage();
-
- public boolean isAllowDeletePackage();
- }
复制代码
- public class User {
- private String userID;
-
- public User(){
- }
-
- public String getUserID() {
- return userID;
- }
- public void setUserID(String userID) {
- this.userID = userID;
- }
-
- //Good practive to override toString method
- public String toString(){
- return userID;
- }
- }
复制代码
这地方放你全部需要access control的东东..关于User Class, 你可以选择extends User class, 或者把它当local variable来用...或者不要, 我extends User class 是因为我可以用User class的variable
- public class UserPrivilege extends User{
- private MemberAccountPrivilege memberPrivilege;
- private PackagePrivilege packagePrivilege;
-
- public PackagePrivilege getPackagePrivilege() {
- return packagePrivilege;
- }
- public void setPackagePrivilege(PackagePrivilege packagePrivilege) {
- this.packagePrivilege = packagePrivilege;
- }
- public MemberAccountPrivilege getMemberPrivilege() {
- return memberPrivilege;
- }
- public void setMemberPrivilege(MemberAccountPrivilege memberPrivilege) {
- this.memberPrivilege = memberPrivilege;
- }
- }
复制代码
好了, 我们可以使用以上的codes, 例如你的MemberMainScreen, 你可以用以下方法来control 你的user 的access right. 你也可以用以下的例子用在其他的screen, 例如PackageMainScreen 等等...
- private JButton addMemberButton;
- private JButton deleteMemberButton;
- private JButton editMemberButton;
- ....
- ....
- addMemberButton.setEnabled(userPrivilege.getMemberPrivilege().isAllowAddMember());
- deleteMemberButton.setEnabled(userPrivilege.getMemberPrivilege().isAllowDeleteMember());
- editMemberButton.setEnabled(userPrivilege.getMemberPrivilege().isAllowEditMember());
-
- }
复制代码
来啦,重点就在这里, 你可以hard code, 你的user access privilege, 但是我还是建议如果可以的话把他们的
setting 存放在database, 一来你可以define 很多不同的user access privilege, 例如power user, operator,
backup user 等等.
- UserPrivilege admin= new UserPrivilege();
-
- admin.setUserID("admin");
- admin.setMemberPrivilege(new MemberAccountPrivilege(){
- public boolean isAllowAddMember() {
- return true;
- }
-
- public boolean isAllowEditMember() {
- return true;
- }
- public boolean isAllowDeleteMember() {
- return true;
- }
- });
-
- UserPrivilege user= new UserPrivilege();
- user.setUserID("user");
- user.setMemberPrivilege(new MemberAccountPrivilege(){
- public boolean isAllowAddMember() {
- return true;
- }
-
- public boolean isAllowEditMember() {
- return true;
- }
- public boolean isAllowDeleteMember() {
- return false;
- }
- });
复制代码
以上的写法非常的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会比较辛苦和乱水。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|