Struts2工作原理及配置MyEclips运行第一个Struts2项目

上传人:fgh****35 文档编号:180452195 上传时间:2023-01-06 格式:DOC 页数:12 大小:536KB
返回 下载 相关 举报
Struts2工作原理及配置MyEclips运行第一个Struts2项目_第1页
第1页 / 共12页
Struts2工作原理及配置MyEclips运行第一个Struts2项目_第2页
第2页 / 共12页
Struts2工作原理及配置MyEclips运行第一个Struts2项目_第3页
第3页 / 共12页
点击查看更多>>
资源描述
Struts2工作原理及配置MyEclips运行第一个Struts2项目配置struts2在MyEclipse中的环境:启动MyEclips(本文使用的版本为8.0GA),在启动时设定工作目录名为D:test,启动后新建一个Web Project,假如取名为struts2,并在J2EE Specification Level选项中选择Java EE 5.0,单击finish。建好后把事先下载的struts2程序包(本文使用的版本为2.2.1.1)解压后打开可看到该struts2开发包中有个文件夹:apps是一些实例文件;docs是帮助文档;lib是开发包;src是开源的源代码。进入lib文件夹中,选择开发struts2须最小配置的几个包:commons-fileupload-1.2.1.jar(处理文件上传的)、commons-io-1.3.2.jar(是commons-fileupload-1.2.1.jar所依赖的)、commons-logging-1.0.4.jar(关于日志处理的)、ognl-3.0.jar(对象图的表达语言)、struts2-core-2.2.1.1.jar(struts2的核心包)、xwork-core-2.2.1.1.jar(基于xwork的内核)、freemarker-2.3.16.jar()把这个7个jar直接拷贝粘贴到刚才新建的web工程中的:struts2/WebRoot/WEB-INF/lib中,此时MyEclipse会自动新建一个引用库夹Referenced Libraries,所拷贝的几个包自动进入其中。修改WebRoot/WEB-INF/web.xml的内容为:web-app version=2.5 xmlns= xmlns:xsi=http:/www.w3.org/2001/XMLSchema-instance xsi:schemaLocation= struts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterstruts2/*该文件是在tomcat启动时就会自动解析的,而该配置是把所有请求都交给org.apache.struts2.dispatcher.ng.filter.StrusPrepareAndExecuteFilter类去处理,而此类是strtus2的类,所以也就把web应用纳入了struts2的范围之内了。在WebRoot上新建一个login.jsp文件: base href= My JSP login.jsp starting page username: password: 从可知,接受提交的是login(这里的action=login实际上是action=login.action的默认形式),那么login它在哪里呢? 除此web.xml配置之外,struts2还有自己的一个配置文件,这个文件在MyEclips界面中的src目录下建,右键单击文件夹src,选择newXML(Basic Templates),File name取为struts.xml说明:在src中建立的该文件MyEclips会自动复制一份到D:teststruts2WebRootWEB-INFclasses中(该路径可通过单击工具栏上的Open in Explorer图标打开寻找)。不只是这个xml文件是这样,实际上我们所建的所有类文件都会这样,因在IDE界面中,我们是看不到classes这个目录的。该struts.xml是通过DTD文件来进行验证的,可在下载下来的struts开发文件夹apps中找到相同的样本。Apps/struts2-blank.war是一个空实现的实例,该文件可用解压软件打开,打开后进入struts2-blankWEB-INFsrcjava里,打开struts.xml文件,把里面的DTD部分:拷贝下来粘贴到自己的strus.xml中,并建立struts根元素,建好后该文件内容如下: /result.jsp 这里的意思是,提交到login的请求,将由类com.hf.struts2.LoginAction来处理所以接下来我们要建立类com.hf.struts2.LoginAction在src中先建立一个包,假设包名取为com.hf.struts2,并在该包上建立一个class,取名为LonginAction,其内容如下:package com.hf.struts2;public class LoginAction private String username;/与前面建的login.jsp中的表单中的对应控件名一致private String password; /与臆面要建的login.jsp中的表单中的控件名一致public String getUsername() return username;public void setUsername(String username) this.username = username;public String getPassword() return password;public void setPassword(String password) this.password = password;public String execute()return success;当login.jsp提交到login时,根据struts.xml的配置: /result.jsp 会交由刚才所建的类来处理,在struts2中,此类会根据表单中的控件名username与password自动调用对应的setUsername()与setPassword(),并把username与password这两个属性值保存在Http的request中,最后执行execute()方法,返回字符串success接下来再根据struts.xml的配置,当LoginAction类执行完后,根据类的返回值去寻找name=“返回值”的那条的配置,在这里就恰好有符合该条件的配置,即:/result.jsp于是,以后就转到该语句中配置的页面result.jsp上去了。根据前面的分析,须建立result.jsp页面:在WebRoot中建立result.jsp页面,其内容如下: base href= My JSP result.jsp starting page !- username:$requestScope.username password:$requestScope.password 到此,该项目编写完备,那么怎样运行呢。首先在Eclipse中配置tomcat:通过菜单windwsPreferencesMyEclipsServersTomcatTomcat 6.x打开选中单选钮Enable,并单击Browse选择自己的tomcat后单击OK。然后在tomcat中配置虚拟目录我的电脑D:apache-tomcat-6.0.18apache-tomcat-6.0.18confserver.xml,打开此server.xml文件,在结点前加上:第三步在MyEclips中启动tomcat:此时会出现异常:Caused by: java.lang.IllegalArgumentException: Javassist library is missing in classpath! Please add missed dependency!其原因是缺乏Javassist这个包的支持。这是struts2.2的内部变化造成的,请看下面:Struts 2.2.1的内部变化主要有: XWork已经迁移到了Apache软件基金会,现在成为了Struts 2的一部分。新版XWork 2.2.0也随着Struts 2.2.1一同发布。未来,XWork将会迁移到Struts 2中。 XWork Maven artifact现在已位于org.apache.struts.xwork下。 XWork使用了最新版的OGNL 3.0,OGNL源代码仓库则位于Github上。 Javassist依赖被OGNL排除,要记得将其包含进来,除非在JBoss服务器上加载应用。 解决了XWork一些突出的缺陷。 所有的示例应用(除了jboss-blank)都包含了Javassist依赖。 新的jboss-blank示例应用使用了JBoss服务器,它没有将jboss-blank库包含进来,因为JBoss服务器已经提供了。 增加了新的Freemarker缓存选项,这会提升标签的渲染速度。所以我们要手工把Javassist.jar包引入工程中,而该包在struts2开发包中的appsstruts2-blankWEB-INFlib javassist-3.7.ga.jar即是,将其拷贝到MyEclips中的WebRoot/WEB-INF/lib中重启tomcat服务器即可。当tomcat正常启动后,启动浏览器,在地址栏中输入http:/localhost:8080/struts2/login.jsp即可看到所设计的页面了。如何把trruts2的源代码导入MyEclips中在没有引入源代码前,当我们双击一个工程如struts2里的Referenced Librariesstruts2-core-2.2.1.1.jarorg.apache.strust2.dispatcher.ng.filterstrutsPrepareAndExecuteFilter.class类时,显示的是其编译的文件,看不到源代码。如需查看源代码,需将struts2的源代码引用进来。其方法是:在项目名上单击鼠标右键,依次选择Build Pathconfigure Build Path,在打开的窗口中选择Libraries标签,并展开struts2-core-2.2.1.1.jar前边的+号,选中Source attachment:(None),单击右边的Edit按钮,在接着打开的对话框中单击右边External Folder按钮,随后寻找到struts2开发包的存放地点,如F:softjavastrutsstruts-2.2.1.1-allstruts-2.2.1.1srccoresrcmainjava(只选java文件夹这一步,不能往下选到org),点击确定,返回后再单击OK,即把struts2的源代码引入了MyEclips里,如果再去查看Referenced Librariesstruts2-core-2.2.2.2.jarorg.apache.strust2.dispatcher.ng.filterstrutsPripareAndExecuteFilter.class类时,显示的是则是源代码了。那么我们又怎样把某一个类的源代码链接到项目中呢,比如下列语句中:public class UserAction extends ActionSupport 当我们按住键盘上的Ctrl键并用鼠标指向父类ActionSupport时,父类下会出现链接下划线,如此时单击鼠标左键,弹出的窗口如下:从提示:Source not found可知未发现源文件,此时单击按钮:Attach Source.后:单击按钮:External Folder.选择外部文件夹,此文件夹为你下载的Struts2文件夹,如:F:/soft/java/struts/struts-2.2.1.1-all/struts-2.2.1.1/src/xwork-core/src/main/java,选到这步为止,不再往下选择到com,单击OK按钮后,就可看到源代码了。对于其他类,依法设置即可,只不过你要知道该类源代码的位置。怎样根据源代码生成struts2的帮助文档第一步新建一个Web Project,取名如struts-doc第二步寻找struts2源文件的路径,如打开到此层后F:softjavastrutsstruts-2.2.1.1-allstruts-2.2.1.1srccoresrcmainjava把其org文件夹选中并复制粘贴到刚才新建的struts-doc的src文件夹中(在MyEclips界面中选中src直接粘贴),此时有很多错误,那是因为struts要依靠许多的jar文件,而这些jar文件我们还没有放到classs文件夹中。加入这些jar文件的步骤是:在项目名上单击鼠标右键,依次选择Build Pathconfigure Build Path,在打开的窗口中选择Libraries标签,单击右边Add External JARs按钮,然后进入到你存放struts2目录的lib目录中,把其中的所有jar文件全部选上,点击OK返回后,其错误便全部消失了。第三步在本地磁盘新建一个文件文件夹,取名如为struts2-doc,用于存放生成帮助文档第四步在MyEclips中选择菜单ProjectGeneration Javadoc,在打开的窗口中选中前面新建的项目名struts-doc,并通过Browse按钮选中刚才建立的存放生成帮助文档的目录strus2-doc后,单击Next按钮,在打开的窗口中选中Document title:并在其文本框中输入标题文字如Struts2.2.1.1,在要求选择归纳的文件中,单击右边的Select All按钮,使其全选中,再单击Next,在接着打开的窗口中点击Finish按钮,在出现的询问窗中点击Yes To All按钮,便开始生成了。生成过程中会出一些警告,往往是一些标记找不到引用而也,不会影响使用的。至此,Struts2的帮助文档便生成了。Struts2里的类型转换struts2的类型转换,对于个原生数据类型以及Date,String等常见类型,Struts2可以使用内建的类型转换器实现自动的转换;但对于自定义的对象类型来说,就需要我们自己编写类型转换器了。在myeclips中新建一个typeto.jsp,用它来输入用户名与密码,以前我们往往要用两个文本框控件,这里我们为了演示类型的转换,我们用一个文本框控件来同时输入用户名与密码,两者之间用分号分隔,其中的表单代码为: user info: 运行时,假设我们输入用户名为hello,密码为world,如图: 当此信息提交到后台,将由后台的转换器来进行处理。下面我们就来编写这个转换器。在myeclips界面中的src中新建一个包取名为com.hf.bean,并在此包中新一个User类:package com.hf.bean;public class User private String username;private String password;public String getUsername() return username;public void setUsername(String username) this.username = username;public String getPassword() return password;public void setPassword(String password) this.password = password;后面要达到的目的是将typeto.jsp页面提交的内容hello;world转换为成User对象建立Action类,建立时取名为UserAction.java并且让它继承一个父类ActionSupport,此类是com.opensymphony.xwork2包中的一个类,在实际开发中,除了非常简单的Action外,我们都要继承此类,因它给我们提供了对Action的各种各样的额外支持,比如它支持国际化,支持类型的转换,支持服务器端的一些验证等等,如果不继承此类,否则很多功能是不能完成的。ActionSupport继承自Object,但实现了很多的接口,如Action,Validateable,ValidationAware,TextProvider,LocaleProvider,Serializable等在Action接口中就有一个String execute() throws Exception 方法,我们前面在编写简单 的Action时,是用手工编写此方法的。现在这个类继承了此方法,我们可以在此类中重写这个方法,package com.hf.struts2;import com.hf.bean.User;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport private User user;public User getUser() return user;public void setUser(User user) this.user = user;Overridepublic String execute() throws Exception return SUCCESS;/此处使用Action中的常量值,这是最通用的方法编写类型转换的代码。我们的目的是将在表单中输入的内容hello;world转换为User对象,这个对象传入到Action被Action使用,所以在传入之前就该完成转换,不应该让Action看到字符串由它来进行转换,这充分体现Struts2的业务逻辑与非业务逻辑的分离,这就需要我们去建立一个类型转换器。在src中再建一个package,并在该包中新建一个转换类UserConverter,并让其继承自父类defaultTypeConverter(在myeclips中当输入该类名查找时,会出现两个这样的类,我们选择ognl-3.0.jar中的这个defaultTypeConverter),我们自己编写的类型转换器往往都要继承这个类,这样我们自定义的这个类就具备了类型转换功能了。当我们在myeclips界面中依次展开Referenced Librariesognl-3.0.jarognldefaultTypeConverter时,其defaultTypeConverter中有一个构造方法,两个成员方法converValue()(实为一个方法,因这两个方法是重载的方法)。既然我们继承了这个类,往往就要重载其中的方法converValue(),完成我们自己所需要的转换功能。提示:如果你的myeclips没有代码自动提示功能,可做如下操作Window Java Editor选中Content Assist,在其右边最后的Auto-Activation下选中Enable auto activation,然后把Auto activation triggers for Java行后的文本框中的 . 换成abcdefghijklmnopqrstuvw xyz,因先前的 . 意为输入 . 时出现提示,现成意为输入任意英文字母时就出现提示。converValue()这个方法定义如下:public Object convertValue(Map context, Object value, Class toType)它有三个参数,第一个Map型参数对于Struts2类型转换来说用不上,第三个参数表示转到的类型,现在对于我们来说,类型转换分两种情况,第一种是将页面上的字符串转到后台的对象,第二种是将后台的对象转到页面上的字符串,那么这两个转换方向怎样去判断呢,这里将由第三个参数来判断,因toType代表的是转换后的目标类型,所以我们可通过判断toType的类型是什么来决定向那个方向转换:public Object convertValue(Map context, Object value, Class toType) if(UserConverter.class=toType)/从页面向后台转String str=(String)value;在这里就是将页面提交的值hello;world转换成User对象,那么值hello;world是由谁来持有呢?就是第二个参数value,那为什么不把value定义成字符类型,而要定义成Object类型呢?原因是此方法可实现两个方向的转换,特别是从后台的对象向页面转,我们事先是无法知道它是什么类型的,所以此处利用多态性,以使此方法能适用于更多情况。又为什么要将value转换成字符串数组呢?因为一个页面上的name可能对应多个值,后台获取到的就是一个数组,虽然我们现在页面上只有一个字符串,但它获得的也是一个数组,只不过是数组中的第一个元素而也,所以此处不能把它转换成字符串,如转换成字符串则会出错,因它真正的类型是一个字符串数组。那么页面上的值是怎样传value的呢?我们只需知道它是Struts2框架给我们传的就对了。当此值提交到服务后,框架发现有个类型转换器,它会自动调用此类型转换器(不需我们手工调用),并把值传给value。此类型转换器的完整代码如下:package com.hf.converter;import java.util.Map;import java.util.StringTokenizer;import com.hf.bean.User;import ognl.DefaultTypeConverter;public class UserConverter extends DefaultTypeConverter Overridepublic Object convertValue(Map context, Object value, Class toType) if(UserConverter.class=toType)/从页面向后台转String str=(String)value;String firstValue=str0;StringTokenizer st=new StringTokenizer(firstValue,;);String username=st.nextToken();String password =st.nextToken();User user=new User();user.setUsername(username);user.setPassword(password);return user;return null;到此这个Action编写得差不多了,但是还不能运行,因我们还未告诉Struts2到哪里去寻找这个转换器,这个对应信息是通过一个属性文件来配置的。这个属性文件不是随便编写的,它有固定的模式。首先我们找到Action对应的包com.hf.struts2,并在里面新建一个文件(属性文件),这个文件名的开头必须是Action的名字即:UserAction,然后是固定的字符串:-conversion.properties,即全名为UserAction-conversion.properties,这个文件采用键值对的表现形式,在这里的键,即是Action里面要转换的属性的名字,即user。值,是转换器,带有包名的类名。user=com.hf.converter.UserConverter我们可以这样来理解这个属性文件,它告诉框架对于文件名UserAction-conversion.properties里的前部分所标明的UserAction文件里的user属性,使用com.hf.converter.UserConverter转换器来进行转换。在struts.xml里新增加Action节点: /result.jsp /output.jsp 之后就可测试了。总括来说,对于自定义的类型转换器来说需要提供个信息:Action的名字、Action中待转换的属性名以及该属性对应的类型转换器。其Action的名字是通过属性文件名获得的、Action中待转换的属性名是通过属性文件中的Key来获得的,该属性对应的类型转换器是通过该Key所对应的value来获得的。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 机械制造 > 工业自动化


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!