Struts2的一些问题总结

以下是学习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表达式

注:

  1. 可以用<s:debug></s:debug>标签来查看当前页面的栈值信息。
  2. 只有传递了[对象].[属性]参数,才会构造相应的对象。

访问普通方法或属性:直接用[对象].[方法/属性]即可。

访问静态方法或属性:用@[类名]@[方法/属性]访问。

注:访问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中的某个属性,会从[下标]开始检索这个属性,直到检索到栈底。

分享到: