收藏 分销(赏)

使用SSH开发增删改查的综合用户管理例子.pptx

上传人:快乐****生活 文档编号:4530375 上传时间:2024-09-26 格式:PPTX 页数:100 大小:1.58MB
下载 相关 举报
使用SSH开发增删改查的综合用户管理例子.pptx_第1页
第1页 / 共100页
使用SSH开发增删改查的综合用户管理例子.pptx_第2页
第2页 / 共100页
使用SSH开发增删改查的综合用户管理例子.pptx_第3页
第3页 / 共100页
使用SSH开发增删改查的综合用户管理例子.pptx_第4页
第4页 / 共100页
使用SSH开发增删改查的综合用户管理例子.pptx_第5页
第5页 / 共100页
点击查看更多>>
资源描述

1、v创建新项目v用Struts 设计器制作前台业务流程v设计业务层功能v开发业务层和DAO 层代码v开发前台页面流程v整合Spring,Struts 和Hibernatev发布,运行,测试使用使用SSH开发增删改查的综合用户管理例子开发增删改查的综合用户管理例子第一部分第一部分 创建新项目创建新项目创建新项目创建新项目v创建Web 项目ssh2v加入 Struts 开发功能v使用Struts 工具开发v数据库student1v实现功能:对用户的增删改查n前台:需要加入增加,修改删除和查询用户所对应的页面n后台功能通过调用Struts Action 来完成,Struts 的Action 再委托给业

2、务层StudentManager 类来完成n根据个人爱好的不同,你既可以先完成前台的页面,也可以先把后台的业务类写完整,或者是两个人分工的话一人负责一部分创建Web 项目v选择菜单选择菜单File New Web Projectv在在Project Name中输入中输入ssh2v选中选中J2EE Specification Level下面的下面的Java EE 5.0 单选单选钮钮n选择哪个版本的选择哪个版本的J2EE Specification Level 取决于你使用的服务取决于你使用的服务器器uTomcat4,Weblogic 9 以下版本请选择以下版本请选择J2EE 1.4uTomca

3、t 5,JBoss 4可以选择可以选择 Java EE 5.0nJava EE 5.0 可以直接使用可以直接使用 EL 表达式和表达式和JSTLv最后点击最后点击Finish按钮按钮加入 Struts 开发功能v项目根节点上右键点击,选择上下文菜单中的项目根节点上右键点击,选择上下文菜单中的MyEclipse Add Struts Capabilitiesv或者选择菜单或者选择菜单MyEclipse Project Capabilities Add Struts Capabilitiesv添加添加 Struts 功能对话框的默认值一般来说不需要修改功能对话框的默认值一般来说不需要修改就可以使用

4、,点击单选钮就可以使用,点击单选钮 Struts 1.2 选择选择Struts 的版本的版本为为1.2 即可即可添加Struts 功能对话框指定了Struts 配置文件的存放位置可选的Struts 的版本指定了位于web.xml 中的Struts 核心Servlet 的名字指定了将会交给Struts 控制的URL 类型指定了生成的类的默认包指定了默认的国际化资源文件包是否安装Struts 的标签库文件添加了 Struts 的目录结构Struts1.2 的类库的类库struts-config.xmlStruts 的的TLD 文件文件验证器文件验证器文件在 src 目录下编写我们自己的类第二部分第

5、二部分 用用Struts 设计器制作前台业务流程设计器制作前台业务流程软件开发的设计阶段软件开发的设计阶段v在实际项目开发中,第一步要做的可能是设计应用的整个流程,而不是立即着手制作JSP 或者编写Java 代码v做实际的项目开发,如果是大中型项目,思考项目到底该使用哪些技术和架构,用什么数据库和操作系统,最后应该实现成何种样子,有哪些模块,系统的工作流程如何等等,这些内容,相当于设计阶段软件开发的设计阶段软件开发的设计阶段v对于我们要做的这个项目来说,具体的技术和系统结构已经选好,就是SSH 架构。那么现在,在加入Spring 整合功能之前,我们有必要把系统的表示层的工作流程搞清楚v做这个流

6、程设计有很多办法,可以用画图工具例如Microsoft Visio,或者UML 建模工具开发一个活动图等等都可以。因为我们使用的是MyEclipse,所以我们这里可以用它自带的Struts 设计器快速的画出所有的应用流程来Struts 配置文件编辑器v双击 WebRoot/WEB-INF/struts-config.xml 就可以打开Struts 配置文件编辑器v在设计器网格面板上点击右键,选择菜单来创建Action,Forward,JSP 等等v为了更好的反映系统的工作流程,我们还可以使用设计器工具栏上的 按钮来给一些页面加入连接关系,但是如果弹出对话框询问是否设置为Action 的inpu

7、t 元素时,我们选择No 按钮。大致来说,我们的应用需要增删改查四个模块用户管理应用业务流程图业务流程说明功能模块流程分页列出用户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。另外,到底这些功能该如何进行分工和组织,也

8、没有绝对的标准,读者可以根据自己的需要或者习惯来进行分工和命名。例如,新建用户这个功能的命名可以是new,也可以起名为add 或者create。另外通用或者共用的Forward 路径可以设置成Global Forward,即全局转向,例如上图中所显示的所有到/error.jsp 的转向,可以统一定义为一个全局的名为error 的Forward文档规范化文档规范化v相比较于 Java 源代码来说,给JSP 页面加入一些文档比较困难些,因为Java 文件可以用Javadoc 格式的注释来加入并生成说明,但是JSP 没有这方面的规定和好用的文档工具v写必要的流程说明n便于自己核对是否全部页面都按照预

9、期实现n方便自己或者别人日后对项目方便进行修改,升级和维护v软件开发本质上属于集体劳动,所以作为其中的一员,尽量不要只把系统的设计蓝图或者注意事项放在自己的脑子里,一定要想办法把它表示成可见的文档来便于大家的交流和日后维护。现在我们把JSP 页面的功能用表格的方式列出来,如下表所示:页面名功能描述index.jsp入口页面list.jsp用户信息列表显示页面(核心页面)edit.jsp用户信息修改表单输入页面error.jsp出错信息显示页面new.jsp添加新用户表单输入页面search.jsp显示查找用户结果的页面Action 说明v还有个问题需要大家解决,就是进入修改和删除功能的Acti

10、on 时,需要在URL 里以地址带参数的方式来传递到底是修改或者删除哪个用户v举个例子,修改用户我们用edit.do?id=1 这种形式。另外用户的ID 是不可修改的,因此如果表单里要传递这个参数,一般就以表单的hidden(隐藏)类型的输入域来表示,具体代码类似这样:input type=”hidden”name=”id”value=”另外如果前台需要一些数据,后台可以通过request.setAttribute()方法来设置,前台则需要用request.getAttribute()方法或者EL 表达式来读取这些值Action 路径类名功能描述/listListAction分页显示用户信息/

11、editEditAction根据ID 获取用户信息并传递给edit.jsp/saveSaveAction保存对用户信息的修改/newNewAction创建新用户/deleteDeleteAction根据ID 删除用户/searchSearchAction根据用户名查找用户,并将结果返回给search.jsp创建数据库创建数据库v数据库:Student1v字段nId:int 主键nUsername:varchar(50)NOT NULLnPassword:varchar(20)NOT NULLnAge:int系统框架系统框架v到现在为止,应用的整个前台大框架已经确定,接下来就是考虑后台的业务层的

12、功能了v我们已经确定要使用Spring+Hibernate 来完成后台功能。Struts 的Action 将会调用业务层,业务层再会去调用数据访问层和其它的一些辅助功能层(工具类或者第三方类库)v整个系统从横向分层就分成了下面的部分:v当然并没有人规定到底怎样分层才是完全正确的表示层控制层业务层数据访问层辅助功能层学习方法交流学习方法交流v系统分成一般来说大家可以按照软件工程书籍上的办法进行分层,然而更现实的却是大家都在按照自己公司的方式进行分层。v这时对于初学者来说必须避免的一个误区就是喋喋不休的对采用何种标准或者为什么教科书上所讲的东西和现实不一样或者说对于某个东西的原理进行一次次的争论,

13、或者用大家熟悉的话来概括:钻牛角尖。v钻牛角尖表面看是勤奋好学,对某种内容具有韧性或者探索精神,然而我们却不得不面对这样一个场面:如果我们企图完全弄懂一个问题,就不得不把和它关联的问题也搞懂。但是尴尬的是,首先我们并不能无限制的得到任何自己需要的资料(大部分技术都是黑盒子,外人看不到内部实现的),另一方面,我们不得不承认人脑的记忆和理解是有限的这个现实。当你高高兴兴的以为自己弄懂了一个又一个问题时,最后却尴尬的发现似乎自己高兴过后只能记起其中的一两个(当然有个好办法就是把这些问题都记下来便于以后查找)。学习方法交流学习方法交流v我想做程序员首先要有钻研精神,其次,也得有实用主义的精神。学技术,

14、就是为了解决实际的问题的,如果你想为技术而技术,请先填饱肚子。遇到自己不会的东西怎么办?首先是能用就行,我们把它看成黑盒子就行了,就像用遥控器的人永远不需要还得懂红外线,集成电路,振荡器,发射器到底是怎么回事一样。说到这里似乎已经扯远了话题,然而看到过很多学生天天追求后台原理或者软件工程,然而却连简单的应用也作不出或者设计图都画不好。不是他们不努力,而是他们努力走向了另一个方向:钻研理论。v对于初学者,第一步要的就是:能用。其余的,在这基础之上才能去谈进一步提高。而且,在国内的现状就是,绝大多数人是开发应用(简单的说就是编写固定流程的东西),而不是深入软件的底层来做开发工具或者自己动手写或者改

15、进虚拟机。开发经验交流开发经验交流v对于这个项目来说,当前台的结构设计的差不多的时候,我们也可以转而先去做后台的业务层,将前台的功能进行提取,看看后台能不能先把大部分都实现了v这也是实际开发两人或者多人分工协作可能出现的情况,例如:一个写前台,一个写后台v当然我们并不是要让大家非得按照软件工程或者项目管理规范,把所有的文档都写好了才能真正开始编码,我们只需要让想法表示出来,就可以了v用代码来表示自己的想法,其实也是一种很不错的办法(一直备受赞扬的敏捷开发Agile,就是这样)第三部分第三部分 设计业务层功能设计业务层功能养成使用接口的习惯v对于业务层的设计,我们可以先写接口,然后再具体实现v当

16、然直接写成类的方式也是没人禁止的,尤其是自己学习的时候也是很合适的做法v写接口就意味着我们并不需要写好具体的实现代码,所以设计阶段一般来说还是鼓励使用接口来做,这样大家只需要讨论好哪些功能需要,哪些不需要就行了v给这个接口加上足够多的注释(或者文档)进行业务层的具体设计v首先定义接口IStudentManager(这个以I 开头的名称来自于Eclipse 的源码中的定义接口的习惯,I 表示Interface,便于开发人员一眼看出这是个接口,当然请不要误会所有的接口必须以I 开头才能定义)v把它放在包service中,用来定义用户管理模块应有的功能。当然用manager 作为业务层的包还是别的名

17、称都是无所谓的v显示用户列表时数据量大,需分页显示,分页部分的接口设计如下所示:npublic int getTotalCount();/得到用户总数npublic int getTotalPage(int pageSize);/获取总页面数npublic List findPagedAll(int currentPage,int pageSize);/分页显示数据定义接口IStudentManager方法v本项目的主要功能是增删改查,结合我们前面所讨论的业务流程,并考虑到方法的参数和返回值等情况,我们一个个的定义这些功能所对应的方法声明v新建用户,我们定义一个方法即可,返回值告诉调用者是否保

18、存成功。npublic boolean save(Student student)v保存用户,我们前面的流程是首先通过ID 找到Student 对象,然后再保存更新,所以一共需要两个方法的定义:npublic Student findById(int id);/根据ID 查找npublic boolean update(Student student);/更新用户对象定义接口IStudentManager方法v删除用户,根据 ID 进行删除就可以了,所以定义一个方法即可,返回值同样是成功时返回true,其它情况下返回falsenpublic boolean delete(Student stu

19、dent)v查找用户,我们则只需要一个方法就可以了,在这里我们只提供根据用户名进行查找的功能,方法的参数是用户名,返回值则是包含找到的用户对象的列表,如果找不到的话就返回nullnpublic List findStudentByUsername(String username);开发经验交流v至此,我们所有的初步设计工作都已完成了,下一步就可以着手进行详细设计了。但是因为这个项目相对比较规模小,所以我们接下来就进入具体的开发过程中v对于大型项目实际开发中一般会进行详细设计,要把所有的JSP 页面的样子画出来,每个类的UML 图也要画出来,以及每个页面和类的具体实现思路也得进行说明,例如:页面

20、中加入的表单验证脚本代码,Action 类的工作流程,DAO 层采用何种技术实现等等(当然这里可以使用Spring 中的HibernateDaoSupport 或者HibernateTemplate)v不过实际开发中你会发现基本上所有的详细设计都会有纰漏或者错误之处,需要在开发过程中逐步进行必要的修改开发经验交流v设计完成后,到底是先做前台页面还是先实现后台的功能类呢?n这个问题其实并无标准答案,全依赖于开发人员的习惯而决定v由于前面我们已经将业务层接口确定,所以如果假设这个项目有两个人进行开发的话,是可以分头进行的,只需要最后在Spring 配置文件中将接口的具体实现类指定就可以了v相对来说

21、,这个项目的业务层代码比较简单,所以我打算先实现后台功能。前台的JSP,Struts 的部分则放在后面进行开发第四部分第四部分 开发业务层和开发业务层和DAO 层代码层代码第四部分内容v添加Hibernate功能v添加Spring 功能vSpring 整合 Hibernatev用Spring 2.0 的aop 和tx 声明式配置解决事务提交问题v开发业务层添加Hibernate功能添加Hibernate功能v现在我们要把Hibernate功能添加到当前项目,这一步不反向工程生成DAO,因为我们最终的目的是使用Spring整合的Hibernate DAO 类添加 Hibernate Capabi

22、litiesv添加 Hibernate 类库(JARs)到项目的类路径v在项目中创建并配置 hibernate.cfg.xmlv在项目中创建自定义的 Session Factory 类来简化 Hibernate 会话处理v添加 Hibernate 功能的步骤:n在Package Explorer 中选择 ssh2 项目n从 MyEclipse 菜单栏选择MyEclipse Project Capabilities Add Hibernate Capabilities.来启动 Add Hibernate Capabilities 向导Add Hibernate Capabilities向导选择H

23、ibernate 类库版本可以添加到项目的构造路径的类库集合选中的类库将会添加到项目的构造路径中,但相应的JAR 文件将不会复制到项目中.这些 JAR 文件会在发布程序时复制选中的类库 JAR 文件将会被复制到项目并添加到构造路径中去(这个方式在开发不依赖于MyEclipse 的项目的时候,或者解决JAR 包冲突的时候很有用),此处选用复制的方式相对于现在项目的路径,可以新建或者使用现有目录,Hibernate 类库将会被向导复制到这里创建Hibernate XML 配置文件v上页选择Next 按钮前进到本页创建 Hibernate XML 配置文件选择数据库连接如果不想现在就设置数据库连接属

24、性,去掉复选框即可跳过选择以前创建好的数据库连接,相关的连接信息将会自动填入到对话框中选中后则会自动加入相应的数据库驱动类库jar 文件到项目的类路径中如果选中,那么Hibernate 将会自动根据映射文件来动态生成建表语句然后执行,然而这种方法不是很可靠,所以一般来说不要用创建SessionFactory这一页选择是否生成Session Factory 类,去掉复选框Create SessionFactory class?的选中状态,最后点击Finish 按钮完成整个添加过程向导结束后将进行的操作v如果在第一页选择了复制类库到你的项目,将复制 Hibernate 类库(JARs)到项目中v更

25、新项目的构造路径来包含已安装的 Hibernate 类库v给项目创建并配置 hibernate.cfg.xml 文件添加Spring 功能给项目加入Spring 功能v项目创建完毕后就可以加入 Spring 开发功能了。要给项目添加Spring 功能,请按照下面的步骤进行:n在Package Explorer 视图中选择 ssh2项目;n接下来,从 MyEclipse 菜单栏选择MyEclipse Project Capabilities Add Spring Capabilities.来启动 Add Spring Capabilities 向导,对于这个项目来说,你可以直接点击Finish

26、按钮就行了加入Spring 功能向导对话框的第1页Spring 版本,一般选择Spring 2 单选钮选择要加入项目类路径的类库点击此链接可以修改类库设置选择JAR 类库的安装方式,上面的单选钮只是把引用的类库加入类路径,下面的则需要指定一个目录把所有的JAR 文件和标签文件加入到当前项目中,这种方式适用于不依赖MyEclipse 进行开发或者手工管理类库当选中了 Spring Web 的时候需要指定标签库文件的安装目录注意有些Myeclipse 的该窗口没有 Spring2.0 ORM/DAO/hibernate3 libraries类库,要在添加完后手动添加,添加方法Build path

27、add libraries加入Spring 功能向导对话框的第2页创建Spring bean 定义文件可以修改Spring 配置文件的名字(修改Folder 和File 选项)加入Spring 功能向导对话框的第3页配置一个使用现有Hibernate配置文件的Spring下的LocalSessionFactory采用默认的sessionFactory就可以了Spring 整合 Hibernate使用反向工程快速生成Java POJO 类,映射文件和DAOv术语解释nDAO 是Data Access Object,数据访问对象的缩写nPOJO 是Plain and Old Java Object

28、,普通和旧式的Java 对象的缩写,也就是普通Java 类的意思v打开MyEclipse Database Explorer透视图n点击工具栏上的点击 按钮可以显示多个透视图供切换nWindow Open Perspective Other MyEclipse Database Explorer来显示打开透视图对话框DB Browser 视图创建连接点右键,选择New启动反向工程向导点右键,选择Open ConnectionHibernate 反向工程向导第 1 页Spring 整合Hibernate 的项目文件内容StudentDAOvStudentDAO类继承自HibernateDaoSu

29、pport,该类来自于Spring,它提供了获取HibernateTemplate 的方法:getHibernateTemplate(),这个DAO 也实现了保存,删除,查找实体类的方法,在此需要加入对应业务处理的分页和更新功能npublic int getTotalCount()npublic List findPagedAll(int currentPage,int pageSize)npublic void update(Student1 transientInstance)npublic List findByUsername(Object username)v另外,它还缺少必要的功能

30、:事务处理用Spring 2.0 的aop 和tx 声明式配置解决事务提交问题修改applicationContext.xmlvSpring 1.2 方式的事务代理是非常繁琐的,现在我们用Spring 2.0 的声明式事务来完成。将上面的applicationContext.xml 将其内容修改为如下所示“注意这里根据文件位置来定”测试并运行v写一个测试类 Spring2TransactionDAOTest.java,来测试这个新的基于声明式的AOP 配置文件public class Spring2TransactionDAOTest public static void main(Strin

31、g args)ApplicationContext ctx=new ClassPathXmlApplicationContext(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 mai

32、n java.lang.ClassCastException:$Proxy1 cannot be cast to dao.Student1DAOat dao.Spring2TransactionDAOTest.main(Spring2TransactionDAOTest.java:13)这是什么原因呢?Spring 2.0 的文档中明明不是说它的AOP 可以自动根据要代理的类的类型来选择是基于JDK 的接口代理还是CGLib 的类代理嘛?然而没有办法,出错了,也许这是Spring 的一个Bug 吧修改代码v现在只好按照要求,把类加入一个接口定义,先修改Student1DAO.java,让它实现

33、一个接口IStudentDAO:public class Student1DAO extends HibernateDaoSupport implements IStudentDAO编写接口v写一个接口IStudentDAO(可以通过重构功能来生成,选择菜单Refactory Extract Interface,在对话框的Interface name 处输入IStudentDAO,然后选中对话框中需要加入到接口中的方法列表,最后点击Finish 按钮即可import java.util.List;public interface IStudentDAO/property constantspu

34、blic 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);public abs

35、tract 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();public

36、 abstract Student1 merge(Student1 detachedInstance);public abstract void attachDirty(Student1 instance);public abstract void attachClean(Student1 instance);再次测试并运行v这时候对应的 Spring2TransactionDAOTest.java 里面的代码已经自动变成了:IStudentDAO dao=(IStudentDAO)ctx.getBean(StudentDAO);v再次运行测试类Spring2TransactionDAOTes

37、t,然后检查数据库,可以很高兴的看到数据已经插入进来了v这里会出现异常 关于主键是否自增长的问题通过修改student.hbm.xmlvv v v 开发业务层开发业务层开发StudentManager类代码v创建前面设计好的IStudentManager接口v修改或者新建类service.StudentManager,来实现先前定义的IStudentManager 接口中的功能v为了便于使用Spring 整合,我们将其中的DAO层设置成一个属性dao,通过方法getDao()和setDao()定义,类型为dao.Student1DAO。业务层的绝大部分功能都是委托给dao 来实现的,而对于那些

38、需要返回布尔值来确定是否操作成功的方法,我们用try-catch 语句来实现这样的需求,即:没有异常时返回true,否则返回false-private IStudentDAO dao;public int getTotalCount()return dao.getTotalCount();public int getTotalPage(int pageSize)int totalCount=getTotalCount();/得到页面总数 int totalPageCount=(totalCount+pageSize)-1)/pageSize;return totalPageCount;publ

39、ic 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 的配置文件applicationContext.xml 中加入下面的bean 配置:测试并运行业务层v编写测试类te

40、st.StudentBizTest.javapackage test;public class StudentBizTest public static void main(String args)ApplicationContext ctx=new ClassPathXmlApplicationContext(applicationContext.xml);IStudentManager studentBiz=(IStudentManager)ctx.getBean(studentBiz);List studentList=studentBiz.findPagedAll(1,3);Syste

41、m.out.println(每页三行,第一页数据:);for(Student1 student:studentList)System.out.println(姓名:+student.getUsername()+密码:+student.getPassword();与前例类似,studentManager需要抽象出接口IStudentManager运行这个类,得到如下的输出:log4j:WARN No appenders could be found for logger(org.springframework.context.support.ClassPathXmlApplicationCont

42、ext).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_ from myssh.dbo.student1 student1x0_每页三行,第一页数据:姓名:dd大多数 密码:1234 姓名:spring dao 密码:pa 姓名:spring dao2 密

43、码:pa2 第五部分第五部分 开发前台页面流程开发前台页面流程前台如何开发前台如何开发v前面我们已经完成了必要的功能设计,在此阶段给以编码实现v对于我们来说,按照业务流程说明表中的流程进行开发,遇到JSP,就创建或者修改JSP页面;遇到.do,就根据用户管理应用业务流程图流程开发或者修改Action类。这样一个流程一个流程的开发,最后再进行测试,就可以完成了v下面我们重温业务流程说明及用户管理应用业务流程图重温业务流程重温业务流程功能模块流程分页列出用户index.jsplist.do创建新用户(new)new.jspnew.dolist.do删除用户(delete)Delete.dolist

44、.do修改用户(edit)edit.doedit.jspsave.dolist.do查找用户(search)Search.dosearch.jsp需要说明的是为了便于编写一个默认的入口欢迎页面,方便用户的使用,我们已经把原来显示用户列表的index.jsp 重命名成了list.jsp。另外,到底这些功能该如何进行分工和组织,也没有绝对的标准,读者可以根据自己的需要或者习惯来进行分工和命名。例如,新建用户这个功能的命名可以是new,也可以起名为add 或者create。另外通用或者共用的Forward 路径可以设置成Global Forward,即全局转向,例如上图中所显示的所有到/error.

45、jsp 的转向,可以统一定义为一个全局的名为error 的Forward重温用户管理应用业务流程图开发前台代码开发前台代码v具体的编码过程不再赘述,按照流程创建一个个JSP页面,最后再修改后台的Action类代码v需要提示大家的是,像EditAction这样的功能的写法,需要根据ID查找一个用户然后传递给前台进行修改,虽然没有明确的在设计图中反映出来,如果不幸找不到用户信息的话,务必需要告诉使用人员要修改的用户找不到,可以转向到/error.jsp进行显示。接下来要做的就是先将传递过来的字符串类型的ID参数通过Integer.parseInt(String)方法转换成int,然后再将通过后台业

46、务层(也即IStudentManager)找到的用户信息通过request对象设置属性传递给前台的JSP页面,前台页面则使用EL表达式加以显示。v实现过程中一定要全面考虑到客户端验证(JavaScript表单验证)和服务器端验证(在Action类中进行必要的数据验证),解决中文问题解决中文问题v加入解决中文字符编码的过滤器TomcatFormFilterv在web.xml中进行配置vhttp:/ 用了LOG4J 做出错信息的输出,虽然后台有很多的真实出错信息,然而在这里却是看不到的。所以需要加入日志处理功能v在src 目录下创建配置文件,选择菜单File New File,文件名输入log4j

47、.properties,文件内容如下所示:log4j.rootLogger=WARN,stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d%p%c-%m%n项目项目ssh2源代码目录结构源代码目录结构表单验证脚本代码表单验证脚本代码v文件 js/form.js 是抽取出来公用的表单验证功能的脚本代码,其代码清单如下

48、所示:function checkForm(form)/验证表单输入不为空的脚本代码 if(form.username.value=)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;开发开发error.jsp 出错了!出错了!详细信息是:$message 返回 出错的信息可以放在出错

49、的信息可以放在 request 的的attribute 里面,里面,例如调用例如调用request.setAttribute(“message”,”出错了!出错了!”);之后相关的出错信息就可以显示在之后相关的出错信息就可以显示在这个页面中。另外还提供了一个返回链接让用户这个页面中。另外还提供了一个返回链接让用户能够回去继续操作能够回去继续操作第一个流程 index.jsplist.dovindex.jsp源码分析源码分析 欢迎使用用户管理系统 查看用户列表 大家通过查看运行时的大家通过查看运行时的HTML源代码就可以看到其输出是:源代码就可以看到其输出是:,这句话可以让我们的,这句话可以让我

50、们的页面总能正确找到引用的图片,页面总能正确找到引用的图片,CSS等外部资源。假设页面有等外部资源。假设页面有个图片写着:个图片写着:,那么即使这个页面的内容通那么即使这个页面的内容通过过forward变成了变成了/ssh2/user/welcome.do,而图片依然会从地,而图片依然会从地址址http:/localhost:8080/ssh2/gif/a.gif 来读取来读取点击超链接,浏览过去的是显示分页点击超链接,浏览过去的是显示分页的的Struts 的控制器的控制器ListAction.javaListAction.java代码代码/*分页显示用户信息分页显示用户信息*/public

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服