




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、创建新项目用Struts 设计器制作前台业务流程设计业务层功能开发业务层和DAO 层代码开发前台页面流程(lichng)整合Spring,Struts 和Hibernate发布,运行,测试使用(shyng)SSH开发增删改查的综合用户管理例子共一百零一页第一(dy)部分 创建新项目共一百零一页创建(chungjin)新项目创建Web 项目ssh2加入 Struts 开发功能(gngnng)使用Struts 工具开发数据库student1实现功能:对用户的增删改查前台:需要加入增加,修改删除和查询用户所对应的页面后台功能通过调用Struts Action 来完成,Struts 的Action 再
2、委托给业务层StudentManager 类来完成根据个人爱好的不同,你既可以先完成前台的页面,也可以先把后台的业务类写完整,或者是两个人分工的话一人负责一部分共一百零一页创建(chungjin)Web 项目选择菜单(ci dn)File New Web Project在Project Name中输入ssh2选中J2EE Specification Level下面的Java EE 5.0 单选钮选择哪个版本的J2EE Specification Level 取决于你使用的服务器Tomcat4,Weblogic 9 以下版本请选择J2EE 1.4Tomcat 5,JBoss 4可以选择 Java
3、 EE 5.0Java EE 5.0 可以直接使用 EL 表达式和JSTL最后点击Finish按钮共一百零一页加入 Struts 开发(kif)功能项目根节点上右键点击(din j),选择上下文菜单中的MyEclipse Add Struts Capabilities或者选择菜单MyEclipse Project Capabilities Add Struts Capabilities添加 Struts 功能对话框的默认值一般来说不需要修改就可以使用,点击单选钮 Struts 1.2 选择Struts 的版本为1.2 即可共一百零一页添加(tin ji)Struts 功能对话框指定了Strut
4、s 配置文件的存放(cnfng)位置可选的Struts 的版本指定了位于web.xml 中的Struts 核心Servlet 的名字指定了将会交给Struts 控制的URL 类型指定了生成的类的默认包指定了默认的国际化资源文件包是否安装Struts 的标签库文件共一百零一页添加了 Struts 的目录(ml)结构Struts1.2 的类库struts-config.xmlStruts 的TLD 文件(wnjin)验证器文件在 src 目录下编写我们自己的类共一百零一页第二(d r)部分 用Struts 设计器制作前台业务流程共一百零一页软件开发的设计阶段在实际项目开发中,第一步要做的可能是设计
5、应用的整个流程,而不是立即着手制作JSP 或者(huzh)编写Java 代码做实际的项目开发,如果是大中型项目,思考项目到底该使用哪些技术和架构,用什么数据库和操作系统,最后应该实现成何种样子,有哪些模块,系统的工作流程如何等等,这些内容,相当于设计阶段共一百零一页软件开发的设计阶段对于我们要做的这个项目来说,具体的技术和系统结构已经选好,就是SSH 架构。那么现在,在加入Spring 整合功能之前,我们有必要把系统的表示层的工作流程搞清楚做这个流程设计有很多办法,可以用画图工具例如Microsoft Visio,或者UML 建模工具开发一个活动图等等都可以。因为(yn wi)我们使用的是My
6、Eclipse,所以我们这里可以用它自带的Struts 设计器快速的画出所有的应用流程来共一百零一页Struts 配置文件编辑器双击 WebRoot/WEB-INF/struts-config.xml 就可以打开Struts 配置文件编辑器在设计(shj)器网格面板上点击右键,选择菜单来创建Action,Forward,JSP 等等为了更好的反映系统的工作流程,我们还可以使用设计器工具栏上的 按钮来给一些页面加入连接关系,但是如果弹出对话框询问是否设置为Action 的input 元素时,我们选择No 按钮。大致来说,我们的应用需要增删改查四个模块共一百零一页用户管理应用(yngyng)业务流
7、程图共一百零一页业务流程说明(shumng)功能模块流程分页列出用户index.jsplist.do创建新用户(new)new.jspnew.dolist.do删除用户(delete)Delete.dolist.do修改用户(edit)edit.doedit.jspsave.dolist.do查找用户(search)Search.dosearch.jsp需要说明的是为了便于编写一个默认的入口欢迎页面,方便用户的使用,我们已经把原来显示用户列表的index.jsp 重命名成了list.jsp。另外,到底这些功能该如何进行分工和组织,也没有绝对的标准,读者可以根据自己(zj)的需要或者习惯来进行分
8、工和命名。例如,新建用户这个功能的命名可以是new,也可以起名为add 或者create。另外通用或者共用的Forward 路径可以设置成Global Forward,即全局转向,例如上图中所显示的所有到/error.jsp 的转向,可以统一定义为一个全局的名为error 的Forward共一百零一页文档规范化相比较于 Java 源代码来说,给JSP 页面加入一些文档比较困难些,因为Java 文件可以用Javadoc 格式的注释来加入并生成说明,但是JSP 没有这方面的规定和好用的文档工具写必要的流程说明便于自己核对是否全部页面都按照预期实现方便自己或者别人日后对项目方便进行修改,升级和维护软
9、件开发本质上属于集体劳动,所以作为其中的一员,尽量不要只把系统的设计蓝图或者注意事项放在自己的脑子里,一定要想办法把它表示成可见的文档来便于大家(dji)的交流和日后维护。现在我们把JSP 页面的功能用表格的方式列出来,如下表所示:页面名功能描述index.jsp入口页面list.jsp用户信息列表显示页面(核心页面)edit.jsp用户信息修改表单输入页面error.jsp出错信息显示页面new.jsp添加新用户表单输入页面search.jsp显示查找用户结果的页面共一百零一页Action 说明(shumng)还有个问题需要大家解决,就是进入修改和删除功能的Action 时,需要在URL 里
10、以地址带参数的方式来传递到底是修改或者删除哪个用户举个例子,修改用户我们(w men)用edit.do?id=1 这种形式。另外用户的ID 是不可修改的,因此如果表单里要传递这个参数,一般就以表单的hidden(隐藏)类型的输入域来表示,具体代码类似这样: input type=”hidden” name=”id” value=” 另外如果前台需要一些数据,后台可以通过request.setAttribute()方法来设置,前台则需要用request.getAttribute()方法或者EL 表达式来读取这些值Action 路径类名功能描述/listListAction分页显示用户信息/edi
11、tEditAction根据ID 获取用户信息并传递给edit.jsp/saveSaveAction保存对用户信息的修改/newNewAction创建新用户/deleteDeleteAction根据ID 删除用户/searchSearchAction根据用户名查找用户,并将结果返回给search.jsp共一百零一页创建(chungjin)数据库数据库:Student1字段Id:int 主键Username:varchar(50) NOT NULLPassword: varchar(20) NOT NULLAge: int共一百零一页系统(xtng)框架到现在(xinzi)为止,应用的整个前台大框
12、架已经确定,接下来就是考虑后台的业务层的功能了我们已经确定要使用Spring + Hibernate 来完成后台功能。Struts 的Action 将会调用业务层,业务层再会去调用数据访问层和其它的一些辅助功能层(工具类或者第三方类库)整个系统从横向分层就分成了下面的部分:当然并没有人规定到底怎样分层才是完全正确的表示层控制层业务层数据访问层辅助功能层共一百零一页学习方法(fngf)交流系统分成一般来说大家可以按照软件工程书籍上的办法进行分层,然而更现实的却是大家都在按照自己公司的方式进行分层。这时对于初学者来说必须(bx)避免的一个误区就是喋喋不休的对采用何种标准或者为什么教科书上所讲的东西
13、和现实不一样或者说对于某个东西的原理进行一次次的争论,或者用大家熟悉的话来概括:钻牛角尖。钻牛角尖表面看是勤奋好学,对某种内容具有韧性或者探索精神,然而我们却不得不面对这样一个场面:如果我们企图完全弄懂一个问题,就不得不把和它关联的问题也搞懂。但是尴尬的是,首先我们并不能无限制的得到任何自己需要的资料(大部分技术都是黑盒子,外人看不到内部实现的),另一方面,我们不得不承认人脑的记忆和理解是有限的这个现实。当你高高兴兴的以为自己弄懂了一个又一个问题时,最后却尴尬的发现似乎自己高兴过后只能记起其中的一两个(当然有个好办法就是把这些问题都记下来便于以后查找)。共一百零一页学习(xux)方法交流我想做
14、程序员首先要有钻研精神,其次,也得有实用主义的精神。学技术,就是为了解决实际的问题的,如果你想为技术而技术,请先填饱肚子。遇到自己不会的东西怎么办?首先是能用就行,我们把它看成黑盒子就行了,就像用遥控器的人永远不需要还得懂红外线,集成电路,振荡器,发射器到底是怎么回事一样(yyng)。说到这里似乎已经扯远了话题,然而看到过很多学生天天追求后台原理或者软件工程,然而却连简单的应用也作不出或者设计图都画不好。不是他们不努力,而是他们努力走向了另一个方向:钻研理论。对于初学者,第一步要的就是:能用。其余的,在这基础之上才能去谈进一步提高。而且,在国内的现状就是,绝大多数人是开发应用(简单的说就是编写
15、固定流程的东西),而不是深入软件的底层来做开发工具或者自己动手写或者改进虚拟机。共一百零一页开发(kif)经验交流对于这个项目来说,当前台的结构设计的差不多的时候,我们也可以转而先去做后台的业务层,将前台的功能进行提取,看看后台能不能先把大部分都实现了这也是实际开发两人或者多人分工协作可能出现的情况,例如:一个写前台,一个写后台当然我们并不是要让大家非得按照软件工程或者项目管理规范,把所有的文档都写好了才能真正开始编码,我们只需要让想法表示出来,就可以了用代码来表示自己的想法,其实也是一种很不错的办法(一直(yzh)备受赞扬的敏捷开发Agile,就是这样)共一百零一页第三部分(b fen) 设
16、计业务层功能共一百零一页养成使用(shyng)接口的习惯对于业务层的设计,我们可以先写接口,然后再具体实现当然直接写成类的方式也是没人禁止的,尤其是自己学习的时候也是很合适的做法写接口就意味着我们并不需要写好具体的实现代码,所以设计阶段一般来说还是鼓励使用接口来做,这样大家只需要讨论(toln)好哪些功能需要,哪些不需要就行了给这个接口加上足够多的注释(或者文档)共一百零一页进行业务(yw)层的具体设计首先定义接口IStudentManager(这个以I 开头的名称来自于Eclipse 的源码中的定义接口的习惯,I 表示Interface,便于开发人员一眼看出这是个接口,当然请不要误会所有的接
17、口必须以I 开头才能定义)把它放在包service中,用来定义用户管理模块应有的功能。当然用manager 作为业务层的包还是别的名称都是无所谓的显示用户列表时数据量大,需分页显示,分页部分的接口设计如下(rxi)所示:public int getTotalCount(); / 得到用户总数public int getTotalPage(int pageSize) ;/ 获取总页面数public List findPagedAll(int currentPage, int pageSize);/ 分页显示数据共一百零一页定义接口(ji ku)IStudentManager方法本项目的主要功能是
18、增删改查,结合我们前面(qin mian)所讨论的业务流程,并考虑到方法的参数和返回值等情况,我们一个个的定义这些功能所对应的方法声明新建用户,我们定义一个方法即可,返回值告诉调用者是否保存成功。 public boolean save(Student student)保存用户,我们前面的流程是首先通过ID 找到Student 对象,然后再保存更新,所以一共需要两个方法的定义:public Student findById(int id);/ 根据ID 查找public boolean update(Student student);/ 更新用户对象共一百零一页定义(dngy)接口IStude
19、ntManager方法删除用户,根据 ID 进行删除就可以了,所以定义一个方法即可,返回值同样是成功时返回true,其它情况(qngkung)下返回falsepublic boolean delete(Student student) 查找用户,我们则只需要一个方法就可以了,在这里我们只提供根据用户名进行查找的功能,方法的参数是用户名,返回值则是包含找到的用户对象的列表,如果找不到的话就返回nullpublic List findStudentByUsername(String username);共一百零一页开发(kif)经验交流至此,我们所有的初步设计工作都已完成了,下一步就可以着手进行详
20、细设计了。但是因为这个项目相对比较规模小,所以我们接下来就进入具体的开发过程中对于大型项目实际(shj)开发中一般会进行详细设计,要把所有的JSP 页面的样子画出来,每个类的UML 图也要画出来,以及每个页面和类的具体实现思路也得进行说明,例如:页面中加入的表单验证脚本代码,Action 类的工作流程,DAO 层采用何种技术实现等等(当然这里可以使用Spring 中的HibernateDaoSupport 或者HibernateTemplate)不过实际开发中你会发现基本上所有的详细设计都会有纰漏或者错误之处,需要在开发过程中逐步进行必要的修改共一百零一页开发(kif)经验交流设计完成后,到底
21、是先做前台页面还是先实现后台的功能类呢?这个问题其实并无标准答案,全依赖于开发人员的习惯而决定由于前面我们已经将业务层接口确定,所以如果假设这个项目有两个人进行开发的话,是可以(ky)分头进行的,只需要最后在Spring 配置文件中将接口的具体实现类指定就可以了相对来说,这个项目的业务层代码比较简单,所以我打算先实现后台功能。前台的JSP,Struts 的部分则放在后面进行开发共一百零一页第四部分(b fen) 开发业务层和DAO 层代码共一百零一页第四部分(b fen)内容添加Hibernate功能添加Spring 功能Spring 整合 Hibernate用Spring 2.0 的aop
22、和tx 声明式配置解决事务(shw)提交问题开发业务层共一百零一页添加(tin ji)Hibernate功能共一百零一页添加(tin ji)Hibernate功能现在我们要把Hibernate功能添加到当前(dngqin)项目,这一步不反向工程生成DAO,因为我们最终的目的是使用Spring整合的Hibernate DAO 类共一百零一页添加(tin ji) Hibernate Capabilities添加 Hibernate 类库 (JARs) 到项目的类路径在项目中创建(chungjin)并配置 hibernate.cfg.xml在项目中创建自定义的 Session Factory 类来简
23、化 Hibernate 会话处理添加 Hibernate 功能的步骤:在Package Explorer 中选择 ssh2 项目从 MyEclipse 菜单栏选择MyEclipse Project Capabilities Add Hibernate Capabilities . 来启动 Add Hibernate Capabilities 向导共一百零一页Add Hibernate Capabilities向导(xingdo)选择(xunz)Hibernate 类库版本可以添加到项目的构造路径的类库集合选中的类库将会添加到项目的构造路径中, 但相应的JAR 文件将不会复制到项目中. 这些 J
24、AR 文件会在发布程序时复制选中的类库 JAR 文件将会被复制到项目并添加到构造路径中去(这个方式在开发不依赖于MyEclipse 的项目的时候,或者解决JAR 包冲突的时候很有用),此处选用复制的方式相对于现在项目的路径, 可以新建或者使用现有目录,Hibernate 类库将会被向导复制到这里共一百零一页创建(chungjin)Hibernate XML 配置文件上页选择Next 按钮前进(qinjn)到本页创建 Hibernate XML 配置文件共一百零一页选择(xunz)数据库连接如果(rgu)不想现在就设置数据库连接属性,去掉复选框即可跳过选择以前创建好的数据库连接,相关的连接信息将
25、会自动填入到对话框中选中后则会自动加入相应的数据库驱动类库jar 文件到项目的类路径中如果选中,那么Hibernate 将会自动根据映射文件来动态生成建表语句然后执行,然而这种方法不是很可靠,所以一般来说不要用共一百零一页创建(chungjin)SessionFactory这一页选择是否生成Session Factory 类,去掉复选框Create SessionFactory class?的选中状态(zhungti),最后点击Finish 按钮完成整个添加过程共一百零一页向导结束后将进行(jnxng)的操作如果在第一页选择了复制类库到你的项目(xingm), 将复制 Hibernate 类库
26、 (JARs) 到项目中更新项目的构造路径来包含已安装的 Hibernate 类库给项目创建并配置 hibernate.cfg.xml 文件共一百零一页添加(tin ji)Spring 功能共一百零一页给项目加入(jir)Spring 功能项目创建完毕后就可以加入 Spring 开发功能了。要给项目添加Spring 功能,请按照下面的步骤进行:在Package Explorer 视图中选择 ssh2项目;接下来, 从 MyEclipse 菜单栏选择MyEclipse Project Capabilities Add Spring Capabilities . 来启动 Add Spring Ca
27、pabilities 向导(xingdo),对于这个项目来说,你可以直接点击Finish 按钮就行了共一百零一页加入(jir)Spring 功能向导对话框的第1页Spring 版本(bnbn),一般选择Spring 2 单选钮选择要加入项目类路径的类库点击此链接可以修改类库设置选择JAR 类库的安装方式,上面的单选钮只是把引用的类库加入类路径,下面的则需要指定一个目录把所有的JAR 文件和标签文件加入到当前项目中,这种方式适用于不依赖MyEclipse 进行开发或者手工管理类库当选中了 Spring Web 的时候需要指定标签库文件的安装目录注意有些Myeclipse 的该窗口没有 Sprin
28、g2.0 ORM/DAO/hibernate3 libraries类库,要在添加完后手动添加,添加方法Build path add libraries共一百零一页加入(jir)Spring 功能向导对话框的第2页创建Spring bean 定义(dngy)文件可以修改Spring 配置文件的名字(修改Folder 和File 选项)共一百零一页加入Spring 功能(gngnng)向导对话框的第3页配置一个(y )使用现有Hibernate配置文件的Spring下的LocalSessionFactory采用默认的sessionFactory就可以了共一百零一页Spring 整合(zhn h)
29、Hibernate共一百零一页使用反向工程快速生成Java POJO 类,映射(yngsh)文件和DAO术语解释DAO 是Data Access Object,数据(shj)访问对象的缩写POJO 是Plain and Old Java Object,普通和旧式的Java 对象的缩写,也就是普通Java 类的意思打开MyEclipse Database Explorer透视图点击工具栏上的点击 按钮可以显示多个透视图供切换Window Open Perspective Other MyEclipse Database Explorer来显示打开透视图对话框共一百零一页DB Browser 视图
30、(sht)创建连接点右键,选择(xunz)New共一百零一页启动反向(fn xin)工程向导点右键,选择(xunz)Open Connection共一百零一页Hibernate 反向(fn xin)工程向导第 1 页共一百零一页Spring 整合(zhn h)Hibernate 的项目文件内容共一百零一页StudentDAOStudentDAO类继承自HibernateDaoSupport,该类来自于Spring,它提供了获取HibernateTemplate 的方法(fngf):getHibernateTemplate(),这个DAO 也实现了保存,删除,查找实体类的方法(fngf),在此需
31、要加入对应业务处理的分页和更新功能public int getTotalCount()public List findPagedAll(int currentPage, int pageSize)public void update(Student1 transientInstance) public List findByUsername(Object username) 另外,它还缺少必要的功能:事务处理共一百零一页用Spring 2.0 的aop 和tx 声明式配置解决事务提交(tjio)问题共一百零一页修改(xigi)applicationContext.xmlSpring 1.2 方
32、式(fngsh)的事务代理是非常繁琐的,现在我们用Spring 2.0 的声明式事务来完成。将上面的applicationContext.xml 将其内容修改为如下所示“注意这里根据文件位置来定”共一百零一页测试(csh)并运行写一个测试类 Spring2TransactionDAOTest.java,来测试这个(zh ge)新的基于声明式的AOP 配置文件public class Spring2TransactionDAOTest public static void main(String args) ApplicationContext ctx = new ClassPathXmlApp
33、licationContext(applicationContext2.xml); Student1DAO dao = (Student1DAO)ctx.getBean(StudentDAO); Student1 user = new Student1(); user.setPassword(密码); user.setUsername(spring 2 事务代理测试); user.setAge(new Integer(200); dao.save(user); 运行结果:Exception in thread main java.lang.ClassCastException: $Proxy1
34、 cannot be cast to dao.Student1DAOat dao.Spring2TransactionDAOTest.main(Spring2TransactionDAOTest.java:13)这是什么原因呢?Spring 2.0 的文档中明明不是说它的AOP 可以自动根据要代理的类的类型来选择是基于JDK 的接口代理还是CGLib 的类代理嘛?然而没有办法,出错了,也许这是Spring 的一个Bug 吧共一百零一页修改(xigi)代码现在只好按照要求(yoqi),把类加入一个接口定义,先修改Student1DAO.java,让它实现一个接口IStudentDAO:publi
35、c class Student1DAO extends HibernateDaoSupport implements IStudentDAO共一百零一页编写(binxi)接口写一个接口IStudentDAO(可以通过重构功能来生成,选择菜单Refactory Extract Interface,在对话框的Interface name 处输入IStudentDAO,然后选中对话框中需要加入到接口中的方法(fngf)列表,最后点击Finish 按钮即可import java.util.List;public interface IStudentDAO / property constantspub
36、lic static final String USERNAME = username;public static final String PASSWORD = password;public static final String AGE = age;public abstract void save(Student1 transientInstance);public abstract void delete(Student1 persistentInstance);public abstract Student1 findById(java.lang.Integer id);publi
37、c abstract List findByExample(Student1 instance);public abstract List findByProperty(String propertyName, Object value);public abstract List findByUsername(Object username);public abstract List findByPassword(Object password);public abstract List findByAge(Object age);public abstract List findAll();
38、public abstract Student1 merge(Student1 detachedInstance);public abstract void attachDirty(Student1 instance);public abstract void attachClean(Student1 instance);共一百零一页再次测试(csh)并运行这时候对应的 Spring2TransactionDAOTest.java 里面的代码已经自动变成了:IStudentDAO dao = (IStudentDAO)ctx.getBean(StudentDAO);再次运行测试类Spring2
39、TransactionDAOTest,然后检查数据库,可以很高兴的看到数据已经插入进来了这里(zhl)会出现异常 关于主键是否自增长的问题通过修改student.hbm.xml 共一百零一页开发(kif)业务层共一百零一页开发(kif)StudentManager类代码创建前面设计好的IStudentManager接口修改或者新建类service.StudentManager,来实现先前定义的IStudentManager 接口中的功能为了便于使用Spring 整合,我们将其中的DAO层设置成一个属性dao,通过方法(fngf)getDao()和setDao()定义,类型为dao.Studen
40、t1DAO。业务层的绝大部分功能都是委托给dao 来实现的,而对于那些需要返回布尔值来确定是否操作成功的方法,我们用try-catch 语句来实现这样的需求,即:没有异常时返回true,否则返回falseprivate IStudentDAO dao;public int getTotalCount() return dao.getTotalCount();public int getTotalPage(int pageSize) int totalCount = getTotalCount(); / 得到页面总数 int totalPageCount = (totalCount + page
41、Size) - 1) / pageSize; return totalPageCount;public List findPagedAll(int currentPage, int pageSize) return dao.findPagedAll(currentPage, pageSize);public IStudentDAO getDao() return dao;public void setDao(IStudentDAO dao) this.dao = dao;因为这个类需要访问底层的数据库,在这里可以通过Spring 来设置对应的DAO 类的实例,因此我们还要在Spring 的配置
42、文件applicationContext.xml 中加入下面的bean 配置:共一百零一页测试(csh)并运行业务层编写(binxi)测试类test.StudentBizTest.javapackage test;public class StudentBizTest public static void main(String args) ApplicationContext ctx = new ClassPathXmlApplicationContext(applicationContext.xml); IStudentManager studentBiz = (IStudentManag
43、er)ctx.getBean(studentBiz); List studentList = studentBiz.findPagedAll(1, 3); System.out.println(每页三行,第一页数据: ); for(Student1 student :studentList) System.out.println(姓名: + student.getUsername()+密码: + student.getPassword(); 与前例类似,studentManager需要抽象出接口IStudentManager运行这个类,得到如下的输出:log4j:WARN No appende
44、rs could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).log4j:WARN Please initialize the log4j system properly.Hibernate: select top 3 student1x0_.id as id0_, student1x0_.Username as Username0_, student1x0_.Password as Password0_, student1x0_.Age as Age0_ fr
45、om myssh.dbo.student1 student1x0_每页三行,第一页数据:姓名:dd大多数 密码:1234 姓名:spring dao 密码:pa 姓名:spring dao2 密码:pa2 共一百零一页第五部分 开发前台页面(y min)流程共一百零一页前台如何(rh)开发前面我们已经完成了必要的功能设计,在此阶段给以编码实现对于我们来说,按照业务流程说明表中的流程进行开发,遇到JSP,就创建或者修改JSP页面;遇到.do,就根据用户管理应用业务流程图流程开发或者修改Action类。这样一个流程一个流程的开发,最后再进行测试,就可以完成了下面(xi mian)我们重温业务流程说
46、明及用户管理应用业务流程图共一百零一页重温(zhn wn)业务流程功能模块流程分页列出用户index.jsplist.do创建新用户(new)new.jspnew.dolist.do删除用户(delete)Delete.dolist.do修改用户(edit)edit.doedit.jspsave.dolist.do查找用户(search)Search.dosearch.jsp需要说明的是为了便于编写一个默认的入口欢迎页面,方便用户的使用(shyng),我们已经把原来显示用户列表的index.jsp 重命名成了list.jsp。另外,到底这些功能该如何进行分工和组织,也没有绝对的标准,读者可以根
47、据自己的需要或者习惯来进行分工和命名。例如,新建用户这个功能的命名可以是new,也可以起名为add 或者create。另外通用或者共用的Forward 路径可以设置成Global Forward,即全局转向,例如上图中所显示的所有到/error.jsp 的转向,可以统一定义为一个全局的名为error 的Forward共一百零一页重温用户(yngh)管理应用业务流程图共一百零一页开发前台(qinti)代码具体的编码过程不再赘述,按照流程创建一个个JSP页面,最后再修改后台的Action类代码需要提示大家的是,像EditAction这样的功能的写法,需要根据ID查找一个用户然后传递给前台进行修改,
48、虽然没有明确的在设计图中反映出来,如果不幸找不到用户信息的话,务必需要告诉使用人员要修改的用户找不到,可以转向到/error.jsp进行显示。接下来要做的就是先将传递过来的字符串类型的ID参数通过Integer.parseInt(String)方法转换成int,然后再将通过后台业务层(也即IStudentManager)找到的用户信息通过request对象设置属性传递给前台的JSP页面,前台页面则使用EL表达式加以显示。实现过程中一定要全面考虑到客户端验证(JavaScript表单验证)和服务器端验证(在Action类中进行必要(byo)的数据验证),共一百零一页解决(jiju)中文问题加入解
49、决中文(zhngwn)字符编码的过滤器TomcatFormFilter在web.xml中进行配置/goodbyideal/archive/2006/04/25/676039.aspx共一百零一页加入日志(rzh)功能因为(yn wi)Spring 用了LOG4J 做出错信息的输出,虽然后台有很多的真实出错信息,然而在这里却是看不到的。所以需要加入日志处理功能在src 目录下创建配置文件,选择菜单File New File,文件名输入perties,文件内容如下所示:log4j.rootLogger=WARN, stdoutlog4j.appender.stdout=org.apache.log
50、4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %p %c - %m%n共一百零一页项目(xingm)ssh2源代码目录结构共一百零一页表单验证(ynzhng)脚本代码文件 js/form.js 是抽取(chu q)出来公用的表单验证功能的脚本代码,其代码清单如下所示:function checkForm(form) / 验证表单输入不为空的脚本代码 if(form.username.val
51、ue = ) alert(用户名不能为空!); form.username.focus(); return false; / 确保年龄有效并在 0 120之间 if(isNaN(parseInt(form.age.value) | form.age.value 120) alert(请输入有效的年龄!); form.age.focus(); return false; return true;共一百零一页开发(kif)error.jsp 出错(ch cu)了! 出错了! 详细信息是: $message 返回 出错的信息可以放在 request 的attribute 里面,例如调用request
52、.setAttribute(“message”,”出错了!”);之后相关的出错信息就可以显示在这个页面中。另外还提供了一个返回链接让用户能够回去继续操作共一百零一页第一个流程(lichng) index.jsplist.doindex.jsp源码分析(fnx) 欢迎使用用户管理系统 查看用户列表 大家通过查看运行时的HTML源代码就可以看到其输出是:,这句话可以让我们的页面总能正确找到引用的图片,CSS等外部资源。假设页面有个图片写着:,那么即使这个页面的内容通过forward变成了/ssh2/user/welcome.do,而图片依然会从地址http:/localhost:8080/ssh2
53、/gif/a.gif 来读取点击超链接,浏览过去的是显示分页的Struts 的控制器ListAction.java共一百零一页ListAction.java代码(di m)/* 分页显示用户信息 */public class ListAction extends Action public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) / 分析当前(dngqin)页码String pageString=r
54、equest.getParameter(page);if(pageString = null | pageString.length() = 0) pageString = 1;int currentPage= 0 ;try currentPage = Integer.parseInt(pageString);/ 当前页码 catch(Exception e) if(currentPage = 0) currentPage = 1;int pageSize = 3;/每页显示的数据数 / 读取数据List users = manager.findPagedAll(currentPage, pa
55、geSize);request.setAttribute(users,users);/ 保存用户列表request.setAttribute(totalPage, manager.getTotalPage(pageSize);/ 保存总页数request.setAttribute(totalCount, manager.getTotalCount();/ 保存记录总数request.setAttribute(currentPage, currentPage);/ 保存当前页码return mapping.findForward(display);private IStudentManager
56、manager;public IStudentManager getManager() return manager;public void setManager(IStudentManager manager) this.manager = manager;当取到了数据和分页相关的信息后,我们将其存放在request 的属性里面,以便在页面中获取这些值转到前台的显示层用户列表页面list.jsp 来显示用户和功能链接此属性在Sping中注入共一百零一页list.jsp代码(di m)list.jsp 用来显示用户和功能(gngnng)链接它是我们这个用户管理应用的中心页面,所有的功能都从这里
57、出发 用户列表页面 用户列表页面 用户ID 用户名 操作 $user.id $user.username 修改 删除 共$totalCount个用户第$currentPage页/共$totalPage页 遍历上页ListAction.java代码存放在request中的users属性值需传递id值到EditAction.java中从ListAction.java存放在request中获取属性值共一百零一页list.jsp代码(di m)list.jsp 用来显示(xinsh)用户和功能链接它是我们这个用户管理应用的中心页面,所有的功能都从这里出发 1 上一页 c:if test=$curren
58、tPage 上一页 c:if test=$currentPage 下一页 = totalPage 下一页 / 页面跳转函数 / 参数: 包含页码的表单元素,例如输入框,下拉框等 function jumpPage(input) if(input.value = $currentPage) return; / 页码相同就不做跳转 var newUrl = $pageContext.request.contextPath/list.do?page= + input.value; document.location = newUrl; 若上一页有数据,则设置超链接,否则不设置超链接若下一页有数据,则
59、设置超链接,否则不设置超链接使用javascript函数实现页面跳转功能共一百零一页list.jsp代码(di m)list.jsp 用来显示(xinsh)用户和功能链接它是我们这个用户管理应用的中心页面,所有的功能都从这里出发转到 option value=$i selected第$i页 输入页码: 添加用户查找用户用户名: 下拉框选项变化调用javascript跳转函数本段代码用户通过选择下拉框实现页面跳转本段代码用户通过输入文本框并点击按钮实现页面跳转添加用户超链接查找用户按钮,调用SearchAction.java共一百零一页用户列表(li bio)页面外观当点击添加用户链接后,我们就
60、进入(jnr)另一个模块:添加用户,流程是new.jspnew.dolist.do共一百零一页增加用户(yngh)流程new.jspnew.dolist.do添加(tin ji)新用户表单输入页面new.jspnew.jsp源码分析 添加用户 添加用户 用户名:td 密码: 年龄: td 当前页面引入js/form.js文件提交到NewAction.java,提交前调用form.js中的checkForm()函数,虽然这里用Struts 标签库编写,也还是可以加入对应的客户端验证代码的利用document对象location属性实现页面跳转共一百零一页NewAction.java代码(di m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025建筑工程承包合同模板大全
- 护理物品管理体系构建
- 结算政策培训体系框架
- 公司交流培训体系构建与实施策略
- 全科医学科护理体系与实务
- 年会新员工发言稿模版
- 工程投标总结模版
- 2025年平凡的世界心得体会模版
- 眶缘骨折的临床护理
- 幼儿园语言教育与活动设计 课件 第三章 幼儿园语言教育活动设计的原理
- 人工智能工业设计应用领域
- 《创伤失血性休克中国急诊专家共识(2023)》解读
- 跨代工作团队的沟通与管理策略探讨
- 《水电工程岩爆风险评估技术规范》(NB-T 10143-2019)
- 2024年贵州铜仁市印江县城市社区工作者招聘笔试参考题库附带答案详解
- 肿瘤患者的护理与心理支持课件
- 石油开采技术的数字化转型与智能化应用
- 《铸牢中华民族共同体意识》
- 什么是冥王星
- 安全生产三管三必须专题培训
- 电饭煲检测大纲
评论
0/150
提交评论