struts1教程.doc_第1页
struts1教程.doc_第2页
struts1教程.doc_第3页
struts1教程.doc_第4页
struts1教程.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

本系列教程将详细介绍Struts 1.x的基本原理和使用方法,读者可以参阅Struts 2系列教程来比较Struts 1.x和Struts 2.x的相同点和不同点。 在这篇文章中将以一个简单的例子(mystruts)来演示如何使用MyEclipse来开发、运行Struts程序,并给出了解决ActionForm出现乱码问题的方法。读者可以从本文中了解开发Struts 1.x程序的基本过程。 一、本文给出的程序要实现什么功能 mystruts是一个录入和查询产品信息的程序。为了方便起见,本例中的产品信息表只包括了产品ID、产品名称和产品价格三个字段。mystruts的主要功能如下: 1. 接受用户输入的产品ID、产品名称和产品价格。 2. 验证这些字段的合法性。如果某些字段的输入不合法(如未输入产品ID),程序会forward到一个信息显示页,并显示出错原因。 3. 如果用户输入了正确的字段值,程序会将这些字段值保存到数据库中,并显示“保存成功”信息。 4. 用户输入产品名称,并根据产品名称进行模糊查询。如果存在符合要求的产品信息。程序会以表格形式显示这些产品的信息,同时显示记录数。如果未查到任何记录,会显示“没有符合要求的记录!”信息。 二、编写程序前的准备工作 1. 建立数据库 在编写程序之前,需要建立一个数据库(struts)和一个表(t_products),建立数据库和表的SQL脚本如下所示:#建立数据库strutsCREATEDATABASEIFNOTEXISTSstrutsDEFAULTCHARACTERSETGBK;#建立表t_productsCREATETABLEIFNOTEXISTSstruts.t_products(product_idvarchar(4)NOTNULL,product_namevarchar(50)NOTNULL,pricefloatNOTNULL,PRIMARYKEY(product_id)ENGINE=InnoDBDEFAULTCHARSET=gbk; 2 建立一个支持struts1.x的samples工程 用MyEclipse建立一个samples工程(Web工程),现在这个samples工程还不支持Struts1.x(没有引入相应的Struts jar包、struts-config.xml文件以及其他和Struts相关的配置)。然而,在MyEclipse中这一切并不需要我们手工去加入。而只需要使用MyEclipse的New Struts Capabilities对话框就可以自动完成这些工作。 首先选中samples工程,然后在右键菜单中选择MyEclipse New Struts Capabilities,启动New Struts Capabilities对话框。对默认的设置需要进行如下的改动: (1)将Struts specification改为Struts 1.2. (2)将Base package for new classes改为struts. (3)将Default application resources改为struts.ApplicationResources. 改完后的New Struts Capabilities对话框如图1所示。点击查看大图 在设置完后,点击Finish按钮关闭对话框。在向samples工程添加支持Struts的功能后,主要对samples工程进行了三个操作。 (1)引入了Struts 1.2 的jar包(在samples的工程树中多了一个Struts 1.2 Libraries节点)。 (2)在WEB-INF目录中添加了一个struts-config.xml文件。文件的默认内容如下面的代码所示: (3)在WEB-INF中的web.xml文件中添加了处理Struts动作的ActionServlet的配置,代码如下:actionorg.apache.struts.action.ActionServletconfig/WEB-INF/struts-config.xmldebug3detail30action*.do 到目前为止,samples工程已经完全支持Struts了。读者可以看到,如果不使用MyEclipse,那么上面所列出的配置文件的内容都必须手工输入。因此,使用MyEclipse来开发Struts程序可以省去很多配置xml文件的工作。三、实现程序的首页(index.jsp) 首先在中建立一个mystruts目录,然后在 mystruts目录中建立一个index.jsp文件,这个文件的内容如下。主界面录入产品信息查询产品信息 在MyEclipse中启动Tomcat(如果Tomcat处于启动状态,在修改完配置文件后,建议在MyEclipse的Servers页重新发布samples工程,以使修改生效)。在IE中输入如下的URL: http:/localhost:8080/samples/mystruts/index.jsp 我们发现在输入上面的URL后,在IE中并未显示正确的运行结果,而是抛出了如下的异常: .MalformedURLException: Cannot retrieve ActionForward named newProduct 这个异常表明程序并未找到一个叫newProduct的forward(forward将在后面详细地讲述)。因此,可以断定,在JSP中使用forward时,这个forward必须存在。下面我们来添加index.jsp页面中所使用的两个forward:newProduct和searchProduct.这两个forward分别引向了建立产品信息的页面(newProduct.jsp)和查询产品信息的页面(searchProduct.jsp)。我们可以在struts-config.xml文件中节点中添加两个全局的forward,代码如下: 上面的代码中所示的newProduct.jsp和searchProduct.jsp目前并不存在(将在以后实现这两个JSP页面),现在重新输入上述的URL,会得到如图2所示的效果。点击查看大图图2 如果想让index.jsp成为默认的JSP页面,可以在web.xml中的节点中加入如下的内容:index.jsp 这时在IE中只要输入如下的URL就可以访问index.jsp页面了。 http:/localhost:8080/samples/mystruts四、实现添加和查询产品信息页面 在本节中主要实现了用于输入产品信息(newProduct.jsp)和查询产品信息(searchProduct.jsp)的JSP页面。 在newProduct.jsp页面中有一个form,在form中含有三个文本框,用于分别输入产品ID、产品名称和产品价格。 在mystruts目录中建立一个newProduct.jsp文件,代码如下:录入产品信息产品编号:产品名称:产品价格: 在searchProduct.jsp页面中有一个form,为了方便起见,在form中只提供了一个文本框用于对产品名称进行模糊查询。在 mystruts目录中建立一个searchProduct.jsp文件,代码如下:查询产品信息产品名称: 现在启动Tomcat,并使用如下两个URL来访问newProduct.jsp和searchProduct.jsp: http:/localhost:8080/samples/mystruts/newProduct.jsp http:/localhost:8080/samples/mystruts/searchProduct.jsp 在IE中输入上面的两个URL后,并不能显示出相应的界面,而会抛出JspException异常,表明未找到saveProduct和searchProduct动作。从这一点可以看出,如果在JSP中使用Struts Action,这些Action必须事先在struts-config.xml文件中定义,否则,JSP程序就无法正常访问。在这两个页面所使用的动作(saveProduct和searchProduct)将会在下面的部分介绍。五、通过模型类操作数据库 在这一节我们来编写用于操作数据库的模型类。由于本例子是Web程序,因此,建议在连接数据库时使用数据库连接池。在confCatalinalocalhost目录中打开samples.xml文件(如果没有该文件,则建立一个samples.xml文件),在节点中加入如下的内容:a (great) number of 许多;大量的 配置连接池(用于连接数据库struts) 本例中提供了两个可以操作数据库的模型类:Product和SearchProduct.其中Product用于验证由客户端提交的产品信息,并向t_products表中写入这些信息。而SearchProduct类用于对t_products表的product_name字段进行模糊查询,并返回查询到的产品信息(包括产品ID、产品名称和产品价格)。attach vt. & vi. 系上;缚上;附加;连接 由于Product和SearchProduct都需要使用数据库连接池来连接数据库,因此,可以将连接数据库的工作提出来作为一个父类(Struts类)提供,代码如下:packageutil;importjava.sql.Connection;publicclassStruts protectedjavax.naming.Contextctx=newjavax.naming.InitialContext(); protectedjavax.sql.DataSourceds; protectedConnectionconn; publicStruts()throwsException ds=(javax.sql.DataSource)ctx.lookup(java:/comp/env/jdbc/struts); conn=ds.getConnection();/从数据库连接池获得一个Connection 在src目录中建立一个Product.java文件,代码所示:packagemystruts.model;importjava.sql.*;importmystruts.actionform.*;publicclassProductextendsutil.StrutsprivateProductFormform;publicProduct(ProductFormform)throwsExceptionsuper();this.form=form;validate();/验证客户端提交的数据publicvoidvalidate()throwsExceptionif(form.getProductID().trim().equals()thrownewException(产品ID不能为空!);if(form.getProductID().length()4)thrownewException(产品ID最长为4位!);if(form.getProductName().trim().equals()thrownewException(产品名称不能为空);if(Fpare(form.getPrice(),0)=0)thrownewException(产品价格必须大于0);/将客户端提交的产品信息保存到t_products中publicvoidsave()throwsExceptiontryStringproductID=form.getProductID();StringproductName=form.getProductName();floatprice=form.getPrice();Stringsql=INSERTINTOt_productsVALUES(+productID+,+productName+,+String.valueOf(price)+);PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.executeUpdate();/执行INSERT语句pstmt.close();conn.close();catch(Exceptione)thrownewException(e.getMessage(); 在Product类中使用了一个ProductForm类,这个类是一个ActionForm类,它的功能是保存客户端提交的数据。关于这个类将在下面详细介绍。Product类通过构造方法的form参数将客户端提交的数据传入Product类的对象实例中,并在构造方法中验证这些数据,如果发现数据不合法,就会抛出一个异常。当客户端提交的数据合法后,成功建立了一个Product类的对象实例,然后可以通过简单地调用save方法将数据保存到t_products表中。Atlanta n. 亚特兰大(女名;城市名) 与Product类似,在src目录中建立一个SearchProduct.java文件,代码如下:brass n. 黄铜;黄铜器packagemystruts.model;importjava.sql.*;importjava.util.*;importmystruts.actionform.*;publicclassSearchProductextendsutil.StrutsprivateProductFormform;publicSearchProduct(ProductFormform)throwsExceptionsuper();this.form=form;/查询产品信息,并通过List返回查询结果publicListsearch()throwsExceptionListresult=newLinkedList();Stringsql=SELECT*FROMt_productsWHEREproduct_namelike%+form.getProductName()+%;PreparedStatementpstmt=conn.prepareStatement(sql);ResultSetrs=pstmt.executeQuery();/开始执行SELECT语句while(rs.next()Stringrow=newString3;row0=rs.getString(1);row1=rs.getString(2);row2=rs.getString(3);result.add(row);rs.close();conn.close();returnresult;Unit 2 在SearchProduct类也使用了ProductForm类,但在SearchProduct中并不会验证ProductForm对象实例中的数据,而只是将ProductForm对象作为传递查询请求信息(实际上只需要产品名称)的工具而已。diamond n. 钻石;菱形六、实现控制器 在这一节要实现的控制器是基于Struts的Web程序的核心部分之一:控制器实质上也是普通的Java类,但这个Java类一般要从org.apache.struts.action.Action类继承。控制器的主要功能是接受并处理从JSP页面提交的数据、通过模型(Model)和数据库交互以及forward到相应的页面(可以是任何页面,如html、JSP和Servlet等)。在实现控制器之前,需要先实现一个ActionForm类, 这个类的作用是保存JSP页面提交的数据。在src目录中建立一个ProductForm.java文件,代码如下:packagemystruts.actionform;importorg.apache.struts.action.*;publicclassProductFormextendsActionFormprivateStringproductID;/产品IDprivateStringproductName;/产品名称privatefloatprice;/产品价格publicStringgetProductID()returnproductID;publicvoidsetProductID(StringproductID)ductID=productID;publicStringgetProductName()returnproductName;publicvoidsetProductName(StringproductName)ductName=productName;publicfloatgetPrice()returnprice;publicvoidsetPrice(floatprice)this.price=price; 从上面的代码可以看出,ActionForm类一般从org.apache.struts.action.ActionForm类继承,而且在类中需要按着需要保存的数据表字段添加属性。如产品ID的属性是productName.在MyEclipse中可以只定义三个private变量,然后使用MyEclipse的Source Generate Getters and Setters功能自动产生getter和setter方法。但在给这些属性取名时要注意,private变量的名子和数据表的字段名没有直接的关系,但必须和JSP页面中的标签的property属性值一致,如表示输入产品名称的文本框,其中property属性的值就是ProductForm类中的productName变量。如果不一致,将会抛出异常。其他和ProductForm类的属性对应的标签可以查看上面的代码。bound adj. 一定的;密切相关的 光有ActionForm类还不够,还需要在struts-config.xml中的节点中添加如下的内容:mop n. 拖把 上面的代码所配置的两个ActionForm实际上指的是同一个ProductForm类,但这个ProductForm类在后面要讲的两个动作里都要使用,为了更容易理解,为这个ProductForm起了两个不同的别名(saveProductForm和searchProductForm)。 下面来实现saveProduct动作的代码。Struts Action类必须一般从org.apache.struts.action.Action类继承。一般在Struts Action类需要覆盖Action类的execute方法。这个方法有每次客户端访问Struts Action时调用。我们可以在方法中处理客户端提交的数据,访问数据库等工作。这个方法返回一个ActionForward类型的值,表明在执行完execute后,要forward到的页面。描述saveProduct动作的类叫SaveProductAction.代码如下:Help () out 帮助(某人)摆脱困境或危难packagemystruts.action;importjavax.servlet.http.*;importorg.apache.struts.action.*;importmystruts.actionform.*;importmystruts.model.*;publicclassSaveProductActionextendsAction/在客户端访问saveProduct动作时执行该方法publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)ProductFormsaveProductForm=(ProductForm)form;tryProductproduct=newProduct(saveProductForm);product.save();/保存产品信息request.setAttribute(info,保存成功!);catch(Exceptione)request.setAttribute(info,e.getMessage();returnmapping.findForward(save); 在SaveProductAction类中使用了模型类Product验证并保存产品信息。并将操作结果信息保存在request的属性中,key为“info”。在execute的最后,使用了ActionMapping类的findForward方法在struts-config.xml中寻找一个叫“save”的forward.这个forward是一个JSP页,用于显示是否将产品信息保存成功的信息。为了可以在struts-config.xml中查找这个forward,需要在struts-config.xml的节点中加入如下的内容。attention n. 注意;关注;注意力 从上面的代码可以看出,那个用于显示保存状态信息的JSP页面叫save.jsp.在mystruts目录中建立一个save.jsp文件,代码如下: $requestS 在IE中输入如下的URL: http:/localhost:8080/samples/mystruts/newProduct.jsp 在文本框中输入相应的信息后,点“保存”按钮,如果输入的数据是合法的,就会将数据保存在t_products中,否则会显示出错的原因。 searchProduct动作的实现和saveProduct差不多,也会为三步:实现动作类(SearchProductAction)、在struts-config.xml中添加配置信息和实现用于显示查询结果的JSP文件。下面的代码分别显示了这三步所要编写的代码。 SearchProductAction.javapackagemystruts.action;importjavax.servlet.http.*;importorg.apache.struts.action.*;importmystruts.actionform.*;importmystruts.model.*;importjava.util.*;publicclassSearchProductActionextendsActionpublicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)ProductFormsearchProductForm=(ProductForm)form;trySearchProductsearchProduct=newSearchProduct(searchProductForm);Listresult=searchProduct.search();/查询产品信息if(result.size()0)/有符合条件的产品信息request.setAttribute(result,result);request.setAttribute(info,记录

温馨提示

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

评论

0/150

提交评论