商品内容:1.分析helloapp应用的需求·接受用户输入的姓名userName,然后返回字符串HellouserName!。·如果用户没有输入姓名就提交表单,将返回出错信息,提示用户首先输入姓名。·如果用户输入姓名为Monster,将返回出错信息,拒绝向Monster打招呼。2.运用Struts框架·模型包括一个JavaBean组件PersonBean,它有一个userName属性,代表用户输入的名字。它提供了get/set方法,分别用于读取和设置userName属性,它还提供一个save()方法,负责把userName属性保存到持久化存储系统中,如数据库或文件系统。对于更为复杂的Web应用,JavaBean组件可以作为EJB或Web服务的前端组件。·视图包括一个JSP文件hello.jsp,它提供用户界面,接受用户输入的姓名。视图还包括一个ActionFormBean,它用来存放表单数据,并进行表单验证,如果用户没有输入姓名就提交表单,将返回出错信息。·控制器包括一个Action类HelloAction,它完成三项任务:1.进行业务逻辑验证,如果用户输入的姓名为Monster,将返回错误消息;2.调用模型组件PersonBean的save()方法,保存用户输入的名字;3.决定将合适的视图组件返回给用户。·除了创建模型、视图和控制器组件,还需要创建Struts的配置文件struts-config.xml,它可以把这些组件组装起来,使它们协调工作。此外,还需要创建整个Web应用的配置文件web.xml。3.创建视图组件本例中,视图包括两个组件:·一个JSP文件:hello.jsp·一个ActionFormBean:HelloFormBean(HelloForm.java)。其中,jsp中有代码html:beanaction=/HelloWorldfocus=userName当用户提交了HTML表单后,Struts框架将自动把表单数据组装到ActionFormBean中。ActionFormBean中的属性和HTML表单中的字段一一对应。ActionFormBean还提供了数据验证方法,以及把属性重新设置为默认值的方法。Struts框架中定义的ActionForm类是抽象的,必须在应用中创建它的子类,来存放具体的HTML表单数据。HelloForm.java中有两个特殊的方法:·validate():用于表单验证。·reset():把属性重新设置为默认值。本例中的资源文件是application.properties,用来存放数据信息。4.创建控制器组件:HelloAction.java控制器组件包括ActionServlet类和Action类。ActionServlet类是Struts框架自带的,它是整个Struts框架的控制枢纽,通常不需要扩展。Struts框架提供了可供扩展的Action类,它用来处理特定的HTTP请求。所有的Action类都是org.apache.struts.action.Action的子类,Action子类应该覆盖父类的execute()方法。HelloAction.java的代码如下:packagehello;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.struts.action.Action;importorg.apache.struts.action.ActionForm;importorg.apache.struts.action.ActionForward;importorg.apache.struts.action.ActionMapping;importorg.apache.struts.action.ActionMessage;importorg.apache.struts.action.ActionMessages;importorg.apache.struts.util.MessageResources;importcom.yourcompany.struts.PersonBean;importcom.yourcompany.struts.form.HelloForm;/***@struts.actionpath=/helloname=helloForminput=/form/hello.jspscope=requestvalidate=true*/publicfinalclassHelloActionextendsAction{/***Methodexecute*@parammapping:ActionMapping包含了这个Action的配置信息和Struts-config.xml文件中的action元素对应。*@paramform:ActionForm包含了用户的表单数据,当Struts框架调用execute()方法时,ActionForm中的数据*已经通过了表单验证。*@paramrequest:HttpServletRequest当前的HTTP请求对象*@paramresponse:HttpServletResponse当前的HTTP响应对象*@returnActionForward*/publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsException{/*ThesemassagecomefromtheApplicationResources.propertiesfile*getResources(HttpServletRequestrequest)方法返回当前默认的MessageResource对象,它封装了Resource*Bundle中的文本内容。*接下来Action类就可以通过MessageResource对象来访问文本内容。例如:如果要读取消息key*为hello.jsp.title对应的文本内容,可以调用MessageResources类的getMessage(Stringkey)方法:*Stringtitle=messages.getMessage(hello.jsp.title);*MessageResourcesmessages=getResources(request);*//**Validatetherequestparametersspecifiedbytheuser*Note:BasicfieldvalidationdoneinHelloForm.java*BusinesslogicvalidationdoneinHelloAction.java*如果用户输入的姓名为Monster,将创建包含错误信息的AcrionMessage对象,ActionMessage对象被保存*到ActionMessages对象中。接下来调用在Action基类中定义的saveErrors()方法,它负责把ActionMessages*对象保存到request范围内。最后返回ActionForward对象,Struts框架会根据ActionForward对象包含的转发*信息把请求转发到恰当的视图组件,视图组件通过html:errors标签把request范围内的ActionMessages对象*中包含的错误消息显示出来,提示用户修改错误。**/ActionMessageserrors=newActionMessages();StringuserName=(String)((HelloForm)form).getUserName();StringbadUserName=Monster;if(userName.equalsIgnoreCase(badUserName)){//equalsIgnoreCase方法同vequals,只不过equalsIgnoreCase是忽略大小写。errors.add(username,newActionMessage(hello.dont.talk.to.monster,badUserName));saveErrors(request,errors);return(newActionForward(mapping.getInput()));}/**HelloAction类创建了一个模型组件PersonBean对象,并调用它的saveToPersistentStore()方法来保存userName*属性。*fromtheView,wenowupdatethemodel***/PersonBeanpb=newPersonBean();pb.setUserName(userName);pb.saveToPersistentStore();/**把PersonBean对象保存在request范围内内*从request范围内删除ActionFormBean。由于后续的请求转发目标组件不再需要HelloFormBean,所以*可将它删除。当HelloAction类调用HttpServletRequest的setAttribute()方法,向hello.jsp传递PersonBean对象时,*需要提供一个名为“persinbean”的属性key:request..setAttribute(personbean,pb);*hello.jsp通过这个名为personbean的属性来读取PersonBean对象:*login:presentname=personbeanscope=request*h2Hellobean:writename=personbeanproperty=userName/!/h2*/logic:persent*对于Struts应用,提倡将这些属性key常量定义在一个Java文件Constant.java中,例如本例。**/request.setAttribute(com.yourcompany.struts.Constants.PERSON_KEY,pb);request.removeAttribute(mapping.getAttribute());return(mapping.findForward(SayHello));}}5.创建模型组件本例的模型组件是PersonBean.java,PersonBean是一个非常简单的JavaBean,它包括一个userName属性,以及相关的get/set方法。此外,它还有一个业务方法saveToPersistentStore()。6.创建存放常量的Java文件:Constant.java7.创建配置文件web.xml和struts-config.xml本例的运行流程为:1.Servlet容器在web.xml文件中寻找url-pattern属性为*.do的servlet-mapping元素:servlet-mappingservlet-nameaction/servlet-nameurl-pattern*.do/url-pattern/servlet-mapping2.Servlet容器依据以上servlet-mapping元素的servlet-name属性action,在web.xml文件中寻找匹配的servlet元素:servletservlet-nameaction/servlet-nameservlet-classorg.apache.struts.action.ActionServlet/servlet-class/servlet3.Servlet容器把请求转发给以上servlet元素指定的Act