建立你的第一个Struts2应用程序_第1页
建立你的第一个Struts2应用程序_第2页
建立你的第一个Struts2应用程序_第3页
建立你的第一个Struts2应用程序_第4页
建立你的第一个Struts2应用程序_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、03-建立你的第一个Struts2应用程序- -下面我们来建立第一个Struts2的应用程序,因为后面还有整合,为了方便,本教程以后的示例都是一次把Struts 2.0.6、Hibernate3.2.2、Spring 2.0.3的jar文件全部导入/WEB-INF/lib目录下,另外,教程使用的开发工具是Eclipse3.2.2,插件MyEclipse5.1.1,要求JDK1.5、Servlet 2.4、JSP2.0版本,应用服务器使用Tomcat 6.0。1.打开Eclipse,点击菜单栏中的“文件”-“新建”-“项目.”,我们选择WEB项目(Web Project

2、),如下图所示:_2.单击下一步,我们为项目命名为struts01,如下图所示:_3.其他选项保持默认状态就好,然后单击完成,将Struts 2.0.6、Hibernate3.2.2、Spring 2.0.3的jar文件复制到struts01项目的lib目录下,然后在项目文件夹夹右键选择“构建配置路径”,建立用户库struts01,将这些jar文件添加到用户库struts01中,这些完成之后,项目结构如下图所示:红色部分是三个框架的所有jar文件_4.在src下建立包net.ilkj,在这个包中建立类App,其实这个类本身没什么用,主要是用它找类的完整类名。_5.打开web.xml文件,因为有

3、Spring,首先配置上下文监听器ContextLoaderListerner,因为在配置文件中的类都需要完整的类名,这个在哪个包下呢?记不住吧?我们这时打开上面新建的类App,在类中输入ContextLoa,然后按下Alt+/,如下图所示:选择我们需要的类,这时会在App的上方生成import的代码,这段代码就是ContextLoaderListener的完整类名,我们将它复制下来,用这个办法,我们找到Struts2的核心FilterDispatcher的完整类名,配置后的web.xml内容如下:还记得上一篇文章说的处理中文乱码的问题吗?这里我们使用Spring的一个类CharacterEn

4、codingFilter完成这个功能,记住Filter是按配置顺序执行的了吗?接受客户请求的时候顺序执行,发送客户响应的时候反序执行,那么CharacterEncoding一定要在FilterDispatcher之前配置,如下图所示:在web.xml中的和元素都可以使用子元素为或中的类中的属性传递值,那么我们怎么知道CharacterEncodingFilter中的哪个属性是设置编码的呢?很简单,我们展开用户库struts01,找到spring的jar包,按照web.xml中的完整类名,找到这个类,然后展开这个类的结构,如下图所示:红色线所示的encoding,懂点英语的就应该知道这个单词的意

5、思是“编码”吧?那么很简单,中的子元素自然就是encoding,value是值的意思,自然是给param-name赋值,我们这里采用UTF-8编码;大家可以看到粉色线所示的方法doFilterInternal(),表示执行过滤方法地方。Filter和Servlet的这一特性非常有用,假设我们要改变编码方式的时候,只需要改动web.xml中的encoding的值就可以了,而不是去打开一个JAVA类,改完值在重新编译,很简单。因为我们知道MyEclipse会自动提示XML的元素,但是元素里面的东东它是不会提示你的(除了JSF、Spring之外),你要是记不住,就用上面这种方法打开类,看看各个属性的

6、意思,就猜到该配哪个属性了!注意:这些属性是区分大小写的,因为它们是通过setXXX()方法被注入!再举个例子,用过Struts1的人知道验证框架吧?Struts1的验证框架要求以注册插件的形式配置验证框架,如下图所示Struts1的配置文件struts-config.xml的部分内容:那么黄色线所示的property的内容怎么知道呢?也就是把value的两个配置文件的位置信息告诉验证框架ValidatorPlugIn的哪个属性呢?用上面的方法,我们找到这个类并展开它,如下图所示:注意到红色线的部分了吗?pathnames,路径的名字,还是复数的形式,那就是说value的值至少是一个,看看人家

7、老外的命名多规范哦!(不过我觉得更规范的命名应该是pathNames,n应该大写!)很显然,自然是把验证配置文件的位置信息配置给这个元素!以后Struts2中的验证框架中的元素中的值大都是采用这种方法找,不在赘述!当然,如果多用几次,你可能就记住了!_6.我们在包net.ilkj下建立子包helloworld,在包helloworld中建包action,在net.ilkj.helloworld.action包中建类HelloWorld,在类中书写方法public void login();在net.ilkj.helloworld包下建立包pojo,在net.ilkj.helloworld.po

8、jo建类User,属性为name(String类型)和password(Integer类型),HelloWorld和User类的内容如下图所示:上图为User类上图为HelloWorld类7.我们来配置一下struts.xml,在src(说明:struts.xml要求在类路径,也就是/WEB-INF/classes/目录下,但在MyEclipse的WEB工程结构中,为了方便,隐藏了classes目录,实际上src就相当于classes目录)下新建文件struts.xml,添加DTD文档头(展开用户库struts01,找到struts-core-2.0.6.jar,展开,在包的根目录下我们可以找

9、到struts-2.0.dtd,打开这个DTD文件,找到把它复制出来粘贴到struts.xml的头部就可以了,!以后的验证框架的DTD文档头都是这么配置的,但要注意各个框架的DTD在JAR包中的位置不同,未必都在JAR包的根目录下,要灵活寻找!),在使用include元素配置struts-default.xml,以便我们的action可以使用Struts2提供的默认的配置,如下图所示:_7.你可能注意到红色线所示的部分是什么东东呢?还记得上一篇讲Struts2的基础知识的时候说过,Struts2允许分散配置,因为一个系统有很多部分,我们将HelloWorld相关的东东都放到net.ilkj.h

10、elloworld下。下面我们来建struts-HelloWorld.xml,其内容如下图所示:下面看一下项目的结构图:_8.在WebRoot下新建JSP:SayHello.jsp(注意WebRoot和src一样,是MyEclipse为了方便帮我们建立的,实际部署程序运行时是不存在的),其内容如下(请注意看用线标识的部分): _9. Struts2的Action在请求时会生成*.action的样式,这是默认的,那么我们如何修改呢?下面我们在src下新建perties,并将struts-core.2.0.6.jar中的perties(在org.apach

11、e.struts2包中)的文件中的内容原样复制到perties中,修改struts.action.extension=ok,如下图所示:这样Struts2就会照我们的意思,生成*.ok的样式的Action请求。_下面我们来部署运行程序!你可能注意到程序启动时报错了,打开日志文件说没有找到“/WEB-INF/applicationContext.xml”,你在web.xml使用了ContextLoaderListener监听上下问,怎么不给人家XML文件,我们在/WEB-INF/下建立applicationContext.xml(Spring的DTD文件在sping.jar中

12、的org.springframework.beans.factory.xml包中的sping-2.0.dtd,虽然MyEclipse可以可视化添加它自带的框架版本,譬如用MyEclipse向导添加Struts1.1和Struts1.2支持是很简单的,但我觉得还是要经常自己手动操作,熟悉流程和原理,熟练了再借助开发工具),如下图所示:由于我们并没有使用Spring2.0.3框架,只需要给空内容欺骗一下应用程序就OK了!哈!为了方便,大家最好把perties放入src目录下,以便观察错误日志。当然,在前一章我提到过出现这个问题的原因,所以你也可以设置struts.objectFa

13、ctory=com.opensymphony.xwork2.ObjectFactory因为Struts2找到struts2-spring-2.0.9.jar,默认的BEAN工厂已经被Spring的BEAN工厂取代。单独使用Struts2的应用,不必引入Spring,默认的Struts2会自动加载所有的struts-plugin.xml,所以不需要使用的Struts2插件,不要将其jar文件放入lib目录下,否则启动的时候会出现一些问题。当然,这个从另一方面说明了Struts2的强大,它以一种可插拔的模式配置第三方支持(譬如添加JFreeChart支持、JasperReports支持、JSF支持

14、等都是通过一个Struts-*-plugin.jar来实现的,启动程序的时候会自动加载这些jar文件中的struts-plugin.xml文件)。再次启动成功,我们访问:http:/localhost:9999/struts01/SayHello.jsp,如下图所示:注意:密码我们定义的是Integer,我们还没有使用转换器或验证框架,请不要填写数字以外的东东哦!单击提交按钮,我们看看Eclipse控制台上的信息,如下图所示:怎么样,相对于Struts1,Struts2是不是很神奇,要知道这里的HelloWorld未继承任何Struts2中的类或实现其接口,User类也是如此,也就是说没有St

15、ruts2的API渗入到我们的系统中,但是程序却正常运行,即使删除Struts2的jar包,我们的JAVA文件也不会出现类找到的错误!这在Struts1中是不可能的实现的哦!怎么样,是不是对Struts2开始感兴趣了呢?(如果你没有使用过Struts1框架,可能喜悦感未必会很强烈哦!什么东东都要对比着来看的,反正我学到这的时候,心里真的是很激动,因为这样做在Struts1框架中简直是天方夜谭哦!)这充分证明了Struts2的非侵入性。以上只是为了演示Struts2的非侵入性,所以只是在控制台简单地打印结果,并未转向新页面,下面再来扩展一下上面的程序。通常为了方便,我们会让Action继承Str

16、uts2的ActionSupport类,我们打开Struts2的API可以看到这个类是这样定义的,如下图所示:ValidationAware,验证关注(是不是和Spring里的BEAN名关注、BEAN工厂关注等很相似啊),也就是继承这个类为以后使用XWork的验证框架提供了基础,TextProvider是提供国际化支持用的,其他的大家可以点击这些类,查看详细信息,另外ActionSupport实现了Action接口,这个接口中定义了如下的常量,如下图所示:这些常量就是XML文件跳转使用的result的name属性,默认为success,execute()方法也是继承自Action接口,也就是说

17、我们的Action继承ActionSupport之后,可以进行校验、国际化等Struts2自带的功能进行支持。_10.为了保留上面的例子,我们新建一个包,建立包net.ilkj.gold,net.ilkj.gold.action,net.ilkj.gold.pojo,在net.ilkj.gold.pojo包下建类Student,属性name(String类型),age(Integer类型),在net.ilkj.gold.action包下建类StudentAction让其继承com.opensymphony.xwork2.ActionSupport类,在net.ilkj.gold.action包

18、下建struts-StudentAction.xml,各文件内容如下图所示:上图为Student类上图为StudentAction类上图为struts-StudentAction.xml红色线部分只是完整的写法,其实可以像粉色线部分那样简写的,蓝色线所示的type属性不写默认也是dispatcher,result的name属性不写默认是success;同时注意红色线和粉色线所示部分的JSP地址都是以 / 为开头的,这表示ActionInvocation查找JSP地址时以当前项目为根目录查找,如果没有 / 为开头,则表示以当前名称空间为参考,也就是说这两个JSP文件要在/ilkj/student

19、/这个目录下!这里只是给大家展示多种写法。_11.在WebRoot下建立StudentLogin.jsp、LoginSuccess.jsp,其内容分别如下图所示:上图为StudentLogin.jsp这里我们使用超级连接的方式测试,是为了演示一下Struts2的超级连接也是不用写.action或者.do的,注意到的value属性引用字符串,如果你想字符串原样引用要使用%,或者你也可以这样张三。上图为LoginSuccess.jsp_12.我们访问http:/localhost:9999/struts01/StudentLogin.jsp,看到下面这张图:因为首次访问还没有值,显示为defaul

20、t属性定义的“未填写”,下面我们单击“测试连接”,由于我们写的是的value是“张三”,一定会转向input指定的StudentLogin.jsp,下面来看结果,如下图所示:首先我们看看地址栏上的URL,=. .,并没有student.age,因为我们在StudentLogin.jsp中的student.age的value=”,所以student.age没有值,生成超级连接的时候自然也不会把它加上,因此我们看到姓名:张三(注意:我们这里使用的URL上传递中文,你必须学习上一篇文章中的Struts2中文处理问题,否则Tomcat默认是不能处理URL

21、上直接传递中文字符的哦!),年龄依然是未填写,因为student.age我们定义的是Integer包装类,包装类是对象,默认值是null,想一下,如果student.age定义为基本数据类型int,会是什么样的结果呢?很简单,URL依然不会有student.age传递,但年龄会显示为0,因为int的默认值是0。下面我们将StudentLogin.jsp中的改为“赵六“,student.age改为”3”,重新访问,大家可以看到结果如下所示:大家可以看到“3“是换行输出的,因为我们在StudentAction.java中的使用setName()方法重新赋值,可以参看StudentAction.java的图,而我们在LoginSuccess.jsp中的的输出中设置了escape=”false”,也就是对Html、JAVASCRIPT不进行转义处理,这样就会产生换行的效果。在实际开发中一些留言簿或者论坛,为了防止客户使用JAVASCRIPT或者HTML打乱网页的整体效果,通常不写escape(默认值为true)

温馨提示

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

评论

0/150

提交评论