以下是学习Struts2时遇到的一些问题,这里统一做一个总结,供后续参考。
1. 如何在eclipse中查看源码
在Package Explorer中右键jar文件 > Properties > Java Source Attachment > External location > External Folder
选中struts-2.3.28/src/core/src/main/java文件夹,OK。
2. 如何在eclipse中查看Javadoc文档
在Package Explorer中右键jar文件 > Properties > Javadoc location > Javadoc URL > Browse
选中struts-2.3.28/docs/struts2-core-apidocs文件夹,OK。
在Java文件中,选中某一个类的名字时,按F1,即可查看Javadoc文档。
3. 在struts.xml文件中,“<”后面按“Alt+/”时,不能自动提示
可能是由于xml文件头部的dtd文件没有加载(因为dtd文件是个网络地址)
解决:Window > Preferences > XML > XML Catalog > ADD
在Location中选中一个本地的dtd文件,Key type选择URI,Key中填上xml文件头部的dtd地址,OK。
4. DMI_动态方法调用
访问action时,可以用[action]![method]的方式来指定要访问哪个action的哪个方法。
struts.xml配置为如下才可使用:
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
注:不推荐用此种方式,建议用通配符
5. 通配符方式实现动态方法调用
使用*来匹配字符串,示例如下:
<action name="*" class="io.zbc.struts2.HelloAction" method="{1}">
<result name="success">/{1}.jsp</result>
</action>
其中{1}是指匹配第一个,如果有多个,则可以分别用{1}{2}{3}…来匹配对应位置的*。
使用这种方式,可以约定一些方法或jsp的命名,来实现配置的精简。
6. Action接收参数
(1). 直接用属性接收
(2). 用DomainModel接收参数,即URL中以[对象].[属性]的方式传参
(3). ModelDriven,实现ModelDriven<>接口
7. 设置默认action
例如可以用来实现常见的404页面:
<default-action-ref name="404"></default-action-ref>
<action name="404" class="com.opensymphony.xwork2.ActionSupport">
<result name="success">/404.jsp</result>
</action>
8. result type
常用:
dispatcher: 服务器端跳转,用来转向页面,通常处理JSP,默认的result type。
redirect: 客户端跳转,重定向到一个URL,被跳转的页面中丢失传递的信息,如request。
chain: 服务器端跳转,用来转向action,被跳转的action中仍能获取上个页面的值,如request信息。
redirectAction: 客户端跳转,重定向到一个action,被跳转的页面中丢失传递的信息,如request。
// 跳转到指定namespace下的action
<result type="chain">
<param name="actionName">dashboard</param>
<param name="namespace">/secure</param>
</result>
其他:
freemaker: 处理FreeMarker模板。
velocity: 处理Velocity模板。
xslt: 处理XML/XLST模板。
stream: 向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据。
plainText: 显示原始文件内容,例如文件源代码。
httpheader: 控制特殊HTTP行为的结果类型。
9. global-results
<global-results>
<result name="error">/error.jsp</result>
</global-results>
同包下可以共享,如果其他包下的action也想共享此result,可以继承(extends)这个namespace,例如:
<package name="default" namespace="/" extends="struts-default">
<global-results>
<result name="error">/error.jsp</result>
</global-results>
</package>
<package name="test" namespace="/test" extends="default">
// 此处即可默认使用上面配置的global-results了
</package>
10. OGNL表达式
注:
- 可以用
<s:debug></s:debug>
标签来查看当前页面的栈值信息。 - 只有传递了[对象].[属性]参数,才会构造相应的对象。
访问普通方法或属性:直接用[对象].[方法/属性]即可。
访问静态方法或属性:用@[类名]@[方法/属性]访问。
注:访问Math类的静态方法:用@@[方法]访问。
访问普通类的构造方法:new [构造方法]。
访问List,Map,Set:直接用变量名访问。
访问List中某个元素:[对象][下标]。例如:list[1]。
访问Map中某个元素:[对象].[keys]。例如:map.key。
访问Set中某个元素:[对象][下标]。例如:set[1]。
访问容器的大小:[对象].size()或[对象].size。
投影(过滤):[对象].{?#this.age==1}[下标]。例如:
<s:property value="users.{?#this.age==1}[0]"/>
<s:property value="users.{^#this.age>1}.{age}"/>
<s:property value="users.{$#this.age>1}.{age}"/>
注:?#表示取符合过滤条件的集合,^#表示取集合的开头,$#表示取集合的结尾
访问栈中的action:用“[下标]”访问从下标开始,到栈底的action,例如[0]表示栈顶开始,到栈底的action。
注:若要访问action中的某个属性,会从[下标]开始检索这个属性,直到检索到栈底。