一口一口吃掉Struts的基本原理_第1页
一口一口吃掉Struts的基本原理_第2页
一口一口吃掉Struts的基本原理_第3页
一口一口吃掉Struts的基本原理_第4页
一口一口吃掉Struts的基本原理_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一口一口吃掉Struts(一)用JSP+Servlet演示Struts的基本原理 struts是开源项目。它通过采用 Java Servlet/JSP 技术,实现了基于Java EE Web应用的MVC的应用框架。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。MVC即Model-View-Controller的缩写,是一种常用的设计模式(具体自己百度吧)我们用JSP+Servlet实现“一个应用的增改信息”,先来看一下,如果没有Struts,我们一般都是怎么做的。废话少说,果断上代码V层用JSP实现html view plain copyprint?1. 2.

2、 测试增加3. 测试修改4. C层前端控制器Servletjava view plain copyprint?1. packageControl;2. 3. importjava.io.IOException;4. 5. importjavax.servlet.ServletException;6. importjavax.servlet.http.HttpServlet;7. importjavax.servlet.http.HttpServletRequest;8. importjavax.servlet.http.HttpServletResponse;9. 10. 11. public

3、classControllerextendsHttpServlet12. 13. protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)14. throwsServletException,IOException15. 16. /截取字符串17. StringrequestURI=request.getRequestURI();18. StringflagAction=requestURI.substring(requestURI.indexOf(/,1),requestURI.indexOf(.);1

4、9. 20. IActionaction=null;21. 22. /根据字符串转发相应的Action23. if(/Servlet/Add.equals(flagAction)24. 25. /TODO采用读取配置文件,反射,这里省略,就直接NEW了26. action=newAddAction();27. elseif(/Servlet/Modify.equals(flagAction)28. 29. action=newModifyAction();30. 31. 32. /TODO获取表单信息33. /TODO将字符串转换为我们需要的格式等等,向下传递34. 35. /得到转向信息36

5、. StringforwordString=action.Excute();37. 38. /转发39. request.getRequestDispatcher(forwordString).forward(request,response);40. 41. 42. 43. 44. protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)45. throwsServletException,IOException46. doGet(request,response);47. 48. 49. 配置文件h

6、tml view plain copyprint?1. 2. Controller3. Control.Controller4. 5. 6. 7. Controller8. *.action9. Actoin接口和实现Action接口的增和改java view plain copyprint?1. packageControl;2. 3. publicinterfaceIAction4. publicStringExcute();5. java view plain copyprint?1. packageControl;2. 3. importModel.Manage;4. 5. publi

7、cclassAddActionimplementsIAction6. 7. publicStringExcute()8. /执行MODEL层逻辑9. Managemanage=newManage();10. manage.Add();11. 12. /返回转向信息13. /TODO可以在配置文件中读14. return/AddSuccess.jsp;15. 16. java view plain copyprint?1. packageControl;2. 3. importModel.Manage;4. 5. publicclassModifyActionimplementsIAction6

8、. 7. publicStringExcute()8. /执行MODEL层逻辑9. Managemanage=newManage();10. manage.Modify();11. 12. /返回转向信息13. /TODO可以在配置文件中读14. return/ModifySuccess.jsp;15. 16. 17. M层实现业务逻辑java view plain copyprint?1. packageModel;2. 3. publicclassManage4. publicvoidAdd()5. 6. System.out.println(添加);7. 8. 9. publicvoid

9、Modify()10. 11. System.out.println(更改);12. 13. 我们这么实现会有哪些问题?1、实例化响应的Action,我们要么用if语句,手动创建,要么需要自己读配置文件,获取Action,反射实例化2、表单过来的所有数据都是字符串,我们需要手动转成响应的格式3、转向信息,我们可能会写死,也可能手动去配置文件读4、我们需要手动做很多事,而且很多重复劳动,还容易出错。如果有个东西能为我代劳就简单得多了,所以Struts应运而生,Struts把我们上面提到的那些都做了封装,让我们的开发更高效,更有灵活性。上面的代码,用时序图表示如下,我们完全可以看做是Struts实

10、现地基本原理。这篇先说这么多,下篇继续一口一口吃掉Struts(二)STRUTS基本工作流程 上篇中,用jsp+servlet演示了一下Struts的基本原理,这一篇我们介绍一下Struts执行的基本流程。假设现在有以下情景:用户正在浏览一个用STRUTS的技术构建的网站主页,主页上有个登陆表单,用户填好登陆名和密码,单击“登陆”按钮,就激活了以下一系列过程:(1)用户的请求以HTTP方式传输到服务器上,接受请求的是ActionServlet.(2)ActionServlet接收到请求后,会查找Struts-config.xml文件来确定服务器上是否有用户请求的操作,此处用户请求操作应为登陆操

11、作。如果没有,则返回一个用户请求无效的出错信息。(3)当 ActionServlet请求找到用户请求的Action后,首先将用户输入的表单参数打包成一个ActionFrom对象,这个ActionFrom 对象其实也就是一个JavaBean,里面包含两个字段,分别是用户名和密码。接着ActionServlet再根据struts-config.xml 中的配置信息决定是否要执行ActionFrom对象中的Validate方法。若Validate方法执行有错,则返回。否则,继续下一步。(4)系统生成一个用户所请求的Action的实例对象,将前面的ActionFrom对象传递给它,运行它的Execut

12、e()方法。这一步其实就是用户登陆的控制器,在执行exectue()方法时,可以调用后台模型验证登陆名和密码是否正确等信息。(5)execute() 执行结束前会生成一个ActionForward类型的对象并将之返回给ActionServlet,该对象的作用是告诉ActionFroward就代 表跳转到一个登陆成功的页面。ActionServlet将对之进行分析,其实就相当于接收到一个新的请求,重复(2)(5)的过程,直到将某个界面返 回给用户为止!以上就是STRUTS的基本工作流程,解释得比较粗,用活动图描述如下:我们可以设置断点,在myeclipse等环境中跟一下执行执行流程,得到一个更细

13、粒度地执行流程,见时序图:一口一口吃掉Struts(三)一个简单Struts实例 了解了Struts的基本流程,那么我们利用Struts来实现一个简单的登陆功能:先用时序图来描述一下登录功能的处理流程:核心操作:1、配置struts* 拷贝struts相关的jar到WEB-INF/lib下* 在web.xml文件中配置ActionServlet* 提供struts-config.xml文件,需要放到WEB-INF下2、实现*建立login.jsp/loginSuccess.jsp/loginFail.jsp*建立了LoginAction.java/userActionForm.java*将Lo

14、ginAction/LoginActionForm/相关jsp配置到struts-config.xml文件中代码:配置文件html view plain copyprint?1. 2. action3. org.apache.struts.action.ActionServlet4. 5. config6. /WEB-INF/struts-config.xml7. 8. 9. debug10. 211. 12. 13. detail14. 215. 16. 217. 18. 19. 20. 21. 22. action23. *.do24. JSP(View)html view plain c

15、opyprint?1. 2. 3. 4. 5. 6. 7. LoginSuccess.jsphtml view plain copyprint?1. 2. 登录成功3. LoginFail.jsphtml view plain copyprint?1. 2. 登录失败3. LoginActionjava view plain copyprint?1. packagecom.jialin;2. 3. importjavax.servlet.http.HttpServletRequest;4. importjavax.servlet.http.HttpServletResponse;5. 6. i

16、mportorg.apache.struts.action.Action;7. importorg.apache.struts.action.ActionForm;8. importorg.apache.struts.action.ActionForward;9. importorg.apache.struts.action.ActionMapping;10. 11. /*12. *登录action13. *authorjialin14. *作用:取得表单数据,调用model层业务逻辑,返回转向信息15. */16. publicclassLoginActionextendsAction17.

17、 18. Override19. publicActionForwardexecute(ActionMappingmapping,ActionFormform,20. HttpServletRequestrequest,HttpServletResponseresponse)21. throwsException22. UserActionFormuserForm=(UserActionForm)form;23. StringuserName=userForm.getName();24. intpassword=userForm.getPassword();/这里不用我们手动强转类型了。25.

18、 26. UserManageuserManage=newUserManage();/后面我们再改进27. Useruser=newUser();28. user.setName(userName);29. user.setPassword(password);30. 31. try32. userManage.ValidateUser(user);33. returnmapping.findForward(success);34. catch(UserNotFoundExceptione)35. e.printStackTrace();36. request.setAttribute(mes

19、sage,e.getMessage();37. catch(PasswordErrorExceptione)38. e.printStackTrace();39. request.setAttribute(message,e.getMessage();40. 41. 42. returnmapping.findForward(fail);43. 44. struts-config.xmlhtml view plain copyprint?1. 2. 3. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 17. 18. 19. 20. 21. 22. UserAction

20、Formjava view plain copyprint?1. packagecom.jialin;2. 3. importorg.apache.struts.action.ActionForm;4. 5. /*6. *用户ActionForm,负责收集表单数据7. *authorjialin8. *注:get和set后的字符串首字母变小写后,必须和表单中属性的名字一致9. */10. publicclassUserActionFormextendsActionForm11. privateStringname;12. privateintpassword;13. publicStringg

21、etName()14. returnname;15. 16. publicvoidsetName(Stringname)17. =name;18. 19. publicintgetPassword()20. returnpassword;21. 22. publicvoidsetPassword(intpassword)23. this.password=password;24. 25. 26. UserManage(Model)java view plain copyprint?1. packagecom.jialin;2. 3. /*4. *MODEL层业务逻辑5. *a

22、uthorjialin6. *判断用户是否合法7. */8. publicclassUserManage9. 10. publicvoidValidateUser(Useruser)11. /判断用户名密码是否正确12. if(!jialin.equals(user.getName()13. thrownewUserNotFoundException(用户不存在!用户名为:+user.getName();14. elseif(user.getPassword()!=123456)15. thrownewPasswordErrorException(密码错误);16. 17. 用户实体和异常类省

23、略。上述实现过程,其中ActionServlet的功能,被Struts封装了,所以我们的代码部分,并没有涉及到ActionServlet的部分。分析代码可知道,Action不再需要我们手动创建,读取配置文件等基础服务已被Struts封装了,表单中数据类型也不需要我们手动转换了,页面转向可以进行配置,也不需要我们手动去配置文件中取了。可以说,Struts把公共的服务为封装好了,我们只需要做很少的事,就可以获得很大的灵活性。一口一口吃掉Struts(四)几个知道就可以的属性 先看struts-config.xmlhtml view plain copyprint?1. 3. 4. 5. 其中 va

24、lidate和attribut有什么用?validate,是否验证表单数据。我们在ActionForm中,重写父类的validate方法,当从表单收集完数据放到ActionForm后,如果配置文件中validate=true,将调用该方法,这里我们可以做一些数据验证。java view plain copyprint?1. Override2. publicActionErrorsvalidate(ActionMappingmapping,3. HttpServletRequestrequest)4. System.out.println(-ActionForm.validate()从表单收集

25、完数据放到ActionForm后做验证-);5. returnsuper.validate(mapping,request);6. 当然,如果系统安全性各方面要求不高,我们一般的验证都是放在javascript里的。attribute如果我们配置了attribute属性,我们在jsp中要获取actionform中的值得时候,form名就变为attribute设置的值。而不再是form-bean节点下 name属性的值。例如html view plain copyprint?1. 2. 3. 4. 5. 6. 7. 8. 9. 11. 12. 13. 14. 15. 16. 如果我们要用el表达

26、式取表单的值,不能使用$userF,而是$ActionForm中还可以重写父类的reset的方法,可以在把收集表单数据往ActionForm中放之前做一些处理java view plain copyprint?1. Override2. publicvoidreset(ActionMappingmapping,HttpServletRequestrequest)3. System.out.println(-ActionForm.reset()可以在把收集表单数据往ActionForm中放之前做一些处理-);4. 一口一口吃掉Struts(五)测试Struts标签库

27、 Struts标签库的使用和JSTL标签库使用方式类似。认识可以了,建议熟练掌握JSTL标签库。struts标签库基本认识就可以了。核心操作:配置:* 配置国际化支持,在struts-config.xml文件中加入如下配置:* 最好提供国际化资源文件(MessageRperties),将该文件放到src下使用:采用taglib引入 测试代码:ACTIONjava view plain copyprint?1. packagecom.jialin;2. 3. importjava.util.ArrayList;4. importjava.util.Date;5. impo

28、rtjava.util.List;6. 7. importjavax.servlet.http.HttpServletRequest;8. importjavax.servlet.http.HttpServletResponse;9. 10. importorg.apache.struts.action.Action;11. importorg.apache.struts.action.ActionForm;12. importorg.apache.struts.action.ActionForward;13. importorg.apache.struts.action.ActionMapp

29、ing;14. 15. publicclassTestActionextendsAction16. 17. Override18. publicActionForwardexecute(ActionMappingmapping,ActionFormform,19. HttpServletRequestrequest,HttpServletResponseresponse)20. throwsException21. /普通字符串22. request.setAttribute(hello,helloworld);23. /html文本24. request.setAttribute(world

30、,HelloWorld!);25. /日期26. request.setAttribute(today,newDate();27. /数字28. request.setAttribute(number,12345.1234);29. 30. Groupgroup=newGroup();31. group.setName(师院);32. 33. Useruser=newUser();34. user.setUsername(张三);35. user.setAge(18);36. user.setGroup(group);37. /结构数据38. request.setAttribute(user

31、,user);39. 40. /空41. request.setAttribute(attr1,null);42. request.setAttribute(attr2,);43. request.setAttribute(attr3,newArrayList();44. 45. 46. /List47. ListuserList=newArrayList();48. 49. for(inti=0;i10;i+)50. Useruser1=newUser();51. user1.setUsername(张三_+i);52. user1.setAge(18+i);53. user1.setGro

32、up(group);54. 55. userList.add(user1);56. 57. 58. request.setAttribute(userlist,userList);59. 60. returnmapping.findForward(showresult);61. 62. 63. Userjava view plain copyprint?1. packagecom.jialin;2. 3. publicclassUser4. 5. privateStringusername;6. 7. privateintage;8. 9. privateGroupgroup;10. 11. publicStringgetUsername()12. returnusername;13. 14. 15. publicvoidsetUsername(Stringusername)16. this.username=username;17. 18. 19. publicintgetAge()20. returnage;2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论