Struts2学习笔记
Struts2框架学习过程:
1.struts2工程搭建:
a.打开myeclipse,新建一个web工程项目,在项目上右键点击Build Path选择Add External Archives……在弹出的对话框中选择struts2工程所需要的jar包(提示:6个jar包 );
b.添加完struts2项目所需要的jar包后,加入开发过程中所必需的struts配置文件(struts.xml)到classpath下;
c.添加web.xml文件到开发项目中;
2.struts2中的Action创建方式(3种):
a.手动写一个Action类,只要在这个Action类中有一个方法的名称是execute且返回值是String类型就可以,可以直接在方法中返回
b.写一个Action类继承自ActionSupport,返回语句可以直接写"return SUCCESS"(SUCCESS是一个struts2定义好的字符串常量,直接拿来用);
c.实现Action接口,返回语句直接写"return SUCCESS"(SUCCESS是定义在Action里的常量);
struts.xml配置文件中的写法:
这里的namespace含义为我们在访问Action的时候要加上一层包名,url如下-http://127.0.0.1:8888/struts2_01/user/user,result标签可以不写name属性默认跳转到success标示的页面;还有一点需要大家注意的地方,我们在以前的开发过程中每一次修改配置文件时都要重启tomcat,在struts2中提供了一个常量如图只需要将value的值设置为true即可;
提示:我们在第一次开发struts2项目的时候在struts.xml中写内容时没有提示信息,此时,我们可以参考如下步骤:
window->preferences->选中Xml catalog->点击Add->->Location关联到struts2.0.dtd的路径(解压struts2的核心jar包,里面有个struts2.0.dtd文件)->ok;
建议: 在开发的过程中我们尽量选择ActionSupport方式,因为它不仅实现了Action接口而且提供了大量我们可以直接拿来用的方法;
3.struts2的方法调用:
注意在UserAction中也可以不出现execute方法,比如说写一个Add方法,如果想要被调用有以下几种方法:
a.在UserAction里在struts.xml配置文件中action标签增加一个属性method="add",用来指明访问UserAction时,去调用Action的add方法;
b.当UserAction里不止一个方法时,这时采用动态方法调用(DMI),在struts.xml文件中不需要添加method属性,只需要在调用的时候采取http://127.0.0.1:8888/struts2_01/user/user!del;
c.DMI调用存在一个限制,当不同的方法需要到达不同的显示页面时,需要用到通配符
访问url:http://127.0.0.1:8888/struts2_01/user/useradd
灵活跳转到不同页面:
访问url:http://127.0.0.1:8888/struts2_01/user/User_add
4.struts2自动接收url参数:
a.用Action的属性接收参数
访问url:http://127.0.0.1:8888/struts2_01/user/User_add?username=admin&password=123456
后台打印:
b.使用DomainModel接收参数
其中User类来源于vo:
访问url:http://127.0.0.1:8888/struts2_01/user/User_add?user.username=admin&user.password=123456
c.使用ModelDriven接收参数
访问url:http://127.0.0.1:8888/struts2_01/user/User_add?username=alice&password=123321
后台打印:
5.struts2访问web元素:
a.定义成Map集合类型
页面显示用struts2的标签库:<%@ taglib uri="/struts-tags" prefix="s"%>
注意:在struts2的action中定义的属性会被自动保存在valueStack中,这里的元素可以直接通过<s:property value="" />获取,引号内写上属性名
而在StackContext里的内容不能直接访问,struts2提供给我们一种方法“”,<s:property value="#request.r1"/> 访问
有一个值得注意的地方:我们放进去的是Map类型的request、session、application,而我们在页面取值的时候直接用request对象、session对象、application对象也能取出来,这是怎么回事呢?(struts2自动帮我们在Map和HttpServletRequest等建立了关联,直接把Map类型的元素复制到HttpServletRequest、HttpSession、ServletContext对象中)
b.实现RequestAware/SessionAware/ApplicationAware接口(依赖注入)
c.使用真实的request对象、session对象、application对象
d.实现ServletRequestAware接口
6.Action中result的各种转发类型:
相对于struts1中的forward,struts2有更多可选的转发类型,常见的有dispatcher(默认)、redirect、redirectAction、chain……
当需要跳转到另一个action时,如果两个action在同一个包下,
当运用redirectAction时,valueStack里只有一个Action,就是第二次发请求所访问的action
当运用chain跳转到另一个action时,valueStack里会出现两个Action
当我们跳转的Action跟当前的action不在同一个包下时需要加上一对<param />标签
7.struts中常用的常量:
<指定默认编码集,相当于HttpServletRequest的setCharacterEncoding()>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<开发模式,修改配置文件后,不需要重启tomcat>
<constant name="devMode" value="true">
<允许动态方法调用,默认值false>
<constant name="struts.enable.DynamicMethodInvocation" value="true">
注:这些常量的默认配置可以在struts的核心包下面的default.properties配置文件中查看
8.struts2中的模块化包含<include>
<struts>
<include file="struts_user.xml"/>
</struts>
9.struts2的国际化:
a.全局资源下的国际化
->准备好国际化资源文件(MessageResources_zh_CN.properties和MessageResources_en_US);
->struts.xml里配置常量 <constant name="struts.custom.i18n.resources" value="MessageResources" />其中value里填写资源文件的basename名称
->页面用标签<s:text name=""/>获取国际化的内容,其中name属性里填写资源文件的key值
b.包级别下的国际化(处于该包及子包下的action都可访问)
->国际化资源文件名称改为package_zh_CN.properties和package_en_US.properties
->不需要在struts.xml里配置常量<constant name="struts.custom.i18n.resources" value="MessageResources" />
c.类级别下的国际化(只能在该类中访问)
->国际化资源文件名称改为UserAction_zh_CN.properties和UserAction_en_US.properties
10.动态国际化:
首先准备好配置文件
<constant name="struts.custom.i18n.resources" value="MessageResources" />
点击以下超链接,实现动态切换
UserAction1中的方法this.getText()用来填充占位符,在UserAction1中有一个msg属性,用来存放填充完毕后的资源文件里的key所对应的值,msg由struts2自动帮我们保存在valueStack中,页面中用标签<s:property value=""/>来获取
运行后点击“debug”按钮,就可以查看valueStack里保存的msg对应的资源化文件信息
11.动态结果集:
在Action中设置path属性,path的值会被自动保存到valueStack中,在struts.xml里通过${path}来取值,根据path的取值不同,跳转到不同的结果页面;