1、目录1需求分析1.1运行环境1.2功能需求2数据库设计2.1部门表2.2用户表3界 面 设 计3.1菜单界面风格3.2用户管理风格4程 序 设 计5总结需求分析在这个例子里,主要包含两个部分:用户管理和部门管理。部门管理主要完成部门的管理,以便于用户在添加新用户时确定其所在的部门。部门的属性比较简单。在用户管理里主要提供给管理人员管理系统的用户功能,用于确定用户的一些属性,比如:用户的名字、所在的部门、出生日期等。 运行环境 JBoss3.2 (到下载),请解压到d:jboss; Oracle9i; Jbuilderx; Hibernate的开发包(到http:/www.hibernate.o
2、rg下载); JDK1.4及其以上版本。下面让我们来配置JBoss,用以让它能支持Hibernate:把从网上下载的Hibernate开发包解压后,在根目录下(请解压到D:hibernate-2.1)找到hibernate2.jar文件,将其拷贝到JBoss的D:jbossserverdefaultlib(我的jboss目录)下,然后进入D:hibernate-2.1lib打开README.txt,把里面带required关键字的包全部拷贝到D:jbossserverdefaultlib下,然后用Ctrl+C关闭JBoss。接下来就准备用Jbuilderx开发你的项目了。启动Jbuilderx
3、并进行如下的配置:添加Oracle的驱动和Hibernate的开发包。由于操作比较简单,请读者自己配置(即将Oracle自带的classes12.jar和hibernate2.jar这两个文件加入到Jbuilderx的库里)。 功能需求在这个用户管理模块中,要求管理人员能够添加部门,能够添加、修改、删除用户,用户信息必须包含ID、登录名、密码、出身日期、所在的部门,部门信息只有ID、名称。当删除一个部门后,属于它的所有用户将被删除。 模块总体结构 数据库设计由于我们只是提供一个简单的实例,因此没有考虑数据库性能问题。在实际的项目中应该建立索引,该使用触发器和存储器的地方一定要使用,以便提高系统
4、的性能。部门表请先建立一个名称和密码都为oa的用户,并且表空间为OASYSTEM,他应该有DBA的权限,CREATE TABLE OA.DEPARTMENT (ID VARCHAR2(40 byte) NOT NULL, NAME VARCHAR2(40 byte), CONSTRAINT SYS_C002992 PRIMARY KEY(ID) USING INDEX TABLESPACE OASYSTEM STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FRE
5、ELIST GROUPS 1) PCTFREE 10 INITRANS 2 MAXTRANS 255) TABLESPACE OASYSTEM PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1) LOGGING 字段说明如表所示。 用户表用户表的程序代码如下所示:CREATE TABLE OA.T_USER (ID VARCHAR2(40
6、 byte) NOT NULL, PWD VARCHAR2(32 byte), NAME VARCHAR2(256 byte), BORN DATE, DEPART_ID VARCHAR2(40 byte), CONSTRAINT SYS_C002994 PRIMARY KEY(ID) USING INDEX TABLESPACE OASYSTEM STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1) PCTFREE 10 INI
7、TRANS 2 MAXTRANS 255, CONSTRAINT SYS_C002995 FOREIGN KEY(DEPART_ID) REFERENCES OA.DEPARTMENT(ID) ON DELETE CASCADE) TABLESPACE OASYSTEM PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1) LOGGING
8、字段说明如表所示界 面 设 计 菜单界面风格用户管理菜单界面如图所示 用户管理风格用户管理界面分别如图1和图2所示。图1 图2程 序 设 计 建立名为com.jufeng.Action的包,把所有的Action都放到这个包里。在这个例子里,我们一共有3个Action文件:forward、stuAction和departAction。1forwardforward.java用来路由用户请求的模块。当用户点击菜单上的部门管理或用户管理时,一次请求被提交。truts1.1的控制器(ActionServlet和RequestProcessor)通过一系列的动作来处理这个请求,我们将在下面简单讨论这个过
9、程。 因为Struts是MVC模式的一种具体实现,所以首先让我们来看一看MVC里的控制器要完成的功能:(1) 截获一个用户的请求;(2) 把请求转化成一个商务逻辑和执行;(3) 帮助选择一个展现给用户的视图;(4) 返回视图给用户。 下面让我们来看一看Struts1.1的处理:(1)调用ActionServlet的process(.)方法。(2)在process(.)里selectApplication()方法被调用。这个方法将存储恰当的Application-Config和MessageResources对象到Request对象里,像一个普通的Servelet一样,ActionServlet
10、被装载时它的init()方法将被调用,在这个过程里完成一些对象的创建并放到一定的范围里。如果你的项目用到了Struts的数据库连接池,则它的初始化也是在这个过程里完成的。 (3) 调用RequestProcessor的init()。(4) 调用processMultipart(),如果请求的类型是post并且ContentType是multipart/form- data,也就是有文件类型时,那么Request就被包装成一个特殊的Request。(5) 调用processPath():从URL中决定路径组件。(6) 调用processLocal():处理本地的请求。(7) 调用processC
11、ontent()。(8) 调用 processNoCache()。 (9) 调用 processPreprocess():决定是否继续处理request。(10) 调用processMapping():决定ActionMapping对象。(11) 调用processActionForm():决定是否有一个ActionForm被配置给了Action- Mapping,如果有的话,就生成或重用一个ActionForm再调用reset()方法。(12) 调用processPopulate():如果为ActionMapping配置了ActionForm的话,就从request中提取参数。 (13) 调
12、用processValidate():如果ActionForm的validate属性被设成true的话,那么就调用ActionForm的validate();如果用户的输入是非法的话,就产生一个ActionErrors对象并放到request对象中,且跳到用input属性指定的资源里。(14) 判断是否有一个forward或include属性被配置给mapping,如果有的话,就调用forward()或include()方法。(15) 调用processActionCreate():创建和获得一个Action实例来处理request。 注意,Struts只为每一种Action产生一个实例。(1
13、6) 调用processActionPerform():调用Action实例里的execute()方法。 (17) 调用processActionForward():它用在execute()返回的ActionForward对象,来决定下一个资源的定位。 因为菜单上的用户管理连接的Action为: /deep/forward.do?dir=stu_list配置文件里有相应的Actionmapping来映射用户的URL: 所以,Struts的控制器处理时,它会用com.jufeng.Action.forward的一个实例来处理这个请求,并用com.jufeng.ActionForm.forward
14、ActionForm的一个实例来提取连接字符串里的属性。com.jufeng.Action.forward.java的源代码如下: package com.jufeng.Action;import com.jufeng.ActionForm.*;import org.apache.struts.action.*;import javax.servlet.http.*;import com.jufeng.util.*;import java.util.List;public class forward extends Action public ActionForward execute(Act
15、ionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) /*todo: complete the business logic here, this is just a skeleton.*/ forwardActionForm forwardActionForm = (forwardActionForm) actionForm; String dir=; List list=null; dir
16、=forwardActionForm.getDir(); if(dir.equals(stu_list) try Hibernate hibernate=new Hibernate(); list=hibernate.ListAll(from User as user order by id); httpServletRequest.setAttribute(list,list); return actionMapping.findForward(stu_list.jsp); catch(Exception e) System.out.println(in forward action+e);
17、 if(dir.equals(departlist) try Hibernate hibernate=new Hibernate(); list=hibernate.ListAll(from DepartMent as depart order by id); httpServletRequest.setAttribute(list,list); return actionMapping.findForward(departlist.jsp); catch(Exception e) System.out.println(in forward action+e); return actionMa
18、pping.findForward(stu_list.jsp); 与此对应的ActionForm是:forwardActionForm.java。package com.jufeng.ActionForm;import org.apache.struts.action.*;import javax.servlet.http.*;public class forwardActionForm extends ActionForm private String dir; public ActionErrors validate(ActionMapping actionMapping, HttpSer
19、vletRequest httpServletRequest) /*todo: finish this method, this is just the skeleton.*/ return null; public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) public String getDir() return dir; public void setDir(String dir) this.dir = dir; 通过Hibernate对数据库的查询后返回一个ActionF
20、orward对象给控制器,并根据配置文件里的把它的path属性设置为/stu_list.jsp,也就是调用RequestDispatcher.forward()方法定位到资源stu_list.jsp。stu_list.jsp的源代码如下: 利用request对象把forward.java里的一个实现了java.util.List接口的对象传到了stu_list.jsp里,你只需要把里面的对象提取出来送给用户就可以了。与此类似,当用户点击页面上的其他按扭时,控制器将调用相应的Action实例来处理请求。在Action里调用Hibernate来处理数据库事务,最后返回一个ActionForward
21、对象给控制器并定位到特定的资源。 2stuAction用户管理里的另一个ActionstuAction的源代码如下:package com.jufeng.Action;import com.jufeng.ActionForm.*;import org.apache.struts.action.*;import javax.servlet.http.*;import com.jufeng.util.Hibernate;import java.util.List;import com.jufeng.obj.*;import com.jufeng.util.*;public class stuAct
22、ion extends Action public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) /*todo: complete the business logic here, this is just a skeleton.*/ System.out.println(in stuAction); stuActionForm stu
23、ActionForm = (stuActionForm) actionForm; Hibernate hiber=null; User user=null; DepartMent depart=null; String name=,pwd=,born=,mode=,select=; long department=0,id=0; List list=null; Long log=null; name=stuActionForm.getName(); pwd=stuActionForm.getPwd(); department=stuActionForm.getDepartment(); log
24、=new Long(department); born=stuActionForm.getBorn(); mode=stuActionForm.getMode(); hiber=null; hiber=new Hibernate(); list=hiber.ListAll(from User as user order by id); httpServletRequest.setAttribute(list,list); hiber=null; return actionMapping.findForward(stu_list); catch(Exception e) System.out.p
25、rintln(Error 80 in stuAction:+e); if(mode.equals(modify) try hiber= new Hibernate(); user=(User)hiber.load(User.class,new Long(id); hiber=null; hiber=new Hibernate(); httpServletRequest.setAttribute(user,user); httpServletRequest.setAttribute(mode,mode);select=hiber.Select(DEPARTMENT,ID,NAME,user.ge
26、tDepartment().getId().toString(),null); httpServletRequest.setAttribute(depselect,select); catch(Exception e) System.out.println(Error 90 in stuAction:+e); if(mode.equals(modifysave) try hiber= new Hibernate(); user=(User)hiber.load(User.class,new Long(id); hiber=null; hiber=new Hibernate(); user.se
27、tBorn(DateFormat.toDate(born); user.setName(name); user.setPwd(pwd); depart=(DepartMent)hiber.load(DepartMent.class,log); hiber=null; user.setDepartment(depart); hiber=new Hibernate(); private com.jufeng.obj.User stu; private com.jufeng.obj.DepartMent depart; private long id; private long department
28、; public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) this.name=null; this.born=null; this.department=0; this.id=0; this.pwd=null; this.mode=null; public String getName() return name; public void setName(String name) this.name = name; public long getId() return id;
29、public void setId(long id) return department; public void setDepartment(long department) this.department = department; public String getMode() return mode; public void setMode(String mode) this.mode = mode; public com.jufeng.obj.User getStu() throws Exception this.stu=new User(); Hibernate hibernate
30、=new Hibernate(); this.depart=(DepartMent)hibernate.load(DepartMent.class, new Long(this.department); this.stu.setBorn(DateFormat.toDate(this.born); this.stu.setDepartment(this.depart); this.stu.setPwd(this.pwd); this.stu.setId(new Long(this.id); this.stu.setName(this.name); return stu; public void
31、setStu(com.jufeng.obj.User stu) this.stu = stu; 对用户信息进行修改的页面是stu_info.jsp: stu_infofunction check() 对部门进行操作的页面是departlist.jsp: departlist%3departAction departAction是实现部分管理的,当用户点击“新增”时,由控制器分析得出应该将departAction的一个实例分配给这次请求。departAction的代码为:package com.jufeng.Action;impor
32、t com.jufeng.ActionForm.*;import org.apache.struts.action.*;import javax.servlet.http.*;import com.jufeng.util.*;import com.jufeng.obj.*;import java.util.List; public class departAction extends Action /新建操作 if(mode.equals(add) httpServletRequest.setAttribute(mode,mode); return actionMapping.findForw
33、ard(departinfo.jsp);/插入一条记录 if(mode.equals(addsave) depart=new DepartMent(); try depart.setName(Covert.toGBK(name); hiber=new Hibernate(); hiber.save(depart); hiber=null; hiber=new Hibernate(); list=hiber.ListAll(from DepartMent as depart order by id); httpServletRequest.setAttribute(list,list); dep
34、art=null; catch(Exception e) System.out.println(Error 40 in departAction:+e); /删除操作 if(mode.equals(del) try hiber=new Hibernate(); depart=(DepartMent)hiber.load(DepartMent.class,new Long(id); hiber=null; hiber=new Hibernate(); hiber.delete(depart); hiber=null; hiber=new Hibernate(); list=hiber.ListA
35、ll(from DepartMent as depart order by id); httpServletRequest.setAttribute(list,list); catch(Exception e) System.out.println(Error 40 in departAction:+e); return actionMapping.findForward(departlist.jsp); 通过请求的类型处理后返回给用户下一个页面。处理部门信息的页面为departinfo.jsp:departinfofunction check()if(document.frm.name.va
36、lue=) alert(不能有空值!); return false; else return true; private Transaction tx; public Hibernate() throws Exception cfg=new Configuration();/初始化Hibernate的环境 cfg.configure(); factory=cfg.buildSessionFactory(); session=factory.openSession();/获得与数据库对话 public Session getSession() return this.session; public Configuration getCfg() return this.cfg; /向数据库里插入一条记录 public boolean save(Object obj) try