struts2的XML配置、动态方法调用、获取页面表单元素的方法

来源:互联网 发布:荣威erx5无法连接网络 编辑:程序博客网 时间:2024/05/18 02:42

要点1:struts.xml中的内容

(struts.xml是struts的配置文件)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
    <!--常量配置-->
    <constant name="struts.devMode" value="false"></constant><!--打印出更多配置文件的信息-->
    <!-- package:管理action节点   extends:继承其他配置文件中的package -->
    <package name="s2" extends="struts-default">
        <!-- action:name(请求的路径,页面上是    name.action)  class:对应的处理类 -->
        <action name="user" class="cn.struts2.action.UserAction" >
            <result >success.jsp</result>        <!-- 返回的地址 --><!-- 默认name="success" -->
            <result name="fails">error.jsp</result>
        </action>
        <!-- 配置全局结果,多个action中共享. -->
        <global-results>
            <result>success.jsp</result>        <!-- 默认name="success" -->
        </global-results>
    </package>
</struts>    

在页面上请求user.action就能对应到cn.struts2.action.UserAction这个类中的execute()方法



要点2:关于动态调用action类中的方法

(如果不动态调用,那么就是默认调用action类中的execute()方法)

方式一:

配置文件不用改,但是请求的路径要改为:action类名+!+方法名+.action
比如,UserAction中有一个login方法,那么请求路径(表单中的action值)为:user!login.action

方式二:

需要修改配置文件,假设UserAction中有一个login方法,那么<action>节点就要加一个属性method,值等于login
<action name="user" class="cn.struts2.action.UserAction" method="login"> ....(result节点) </action>

方式三:

使用通配符的方式,
比如:<action name="user_*" class="cn.struts2.action.UserAction" method="{1}">
这里的*是通配符,可以匹配任意字符,而method的值{1}就是*的内容,
比如页面请求user_login.action,那么{1}就等于login,就是说method="login",那么根据第二种方式,就会执行UserAction中的login方法
同样,通配符可以用多个,
<action name="*_*" class="cn.struts2.action.UserAction" method="{2}">
页面上请求user_login同样可以调用login方法,但是这里method={2},通配符是匹配的字符串,
这里第一个*相当于user,第二个*相当于login,所以method="{2}"
所以,当请求的方法是第n个*的内容时,method={n}


这三种方式,推荐使用前面两种,第三种很灵活,但是比较混乱,使程序可读性变差
注意:
动态方法调用是在配置文件中配置了的, struts.enable.DynamicMethodInvocation=true,默认值是true,所以不用改就可以动态调用
如果要禁用动态方法调用,那么可以再struts.properties文件(自己建的)里面修改struts.enable.DynamicMethodInvocation=false
或者在struts.xml中配置常量(使用constant节点配置常量)
<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
这样就可以禁用动态方法调用。



要点3:关于action类中获取页面中表单元素的值

注意,页面表单元素的name必须和后台对象属性的值相同!!!

方式一:

如果该action只使用几个表单元素的值,那么可以直接在该类中定义表单元素,然后提供get,set方法。
注意,名字须和表单元素的名字一样(通过反射机制动态调用set方法),
在调用set方法设置值后调用请求的方法

方式二:

如果值较多,那么需要通过一个vo对象来封装,在action类中定义那个vo对象(不需要实例化),然后为该vo对象提供get,set方法
这里请求进来时,会先进get方法,发现vo对象为空,(没有实例化),那就实例化一个vo对象,然后调用set方法,然后在调用get方法,
这时vo对象是已经实例化了的。然后调用请求的方法
注意,这种方式在页面的表单元素的name值需要加上该vo对象的名字的前缀
比如,action中的vo对象是private UserVo user;UserVo中有个属性是username
那么表单中<input name="user.username">


方式三:(模型驱动方式)

这里action类需要实现ModelDriven接口(com.opensymphony.xwork2.ModelDriven包中的)
然后定义一个封装对象的vo类,这里的vo对象必须实例化,否则报错(空指针)
然后实现接口中的方法
public Object getModel() {
    return 你的vo对象;
}
然后,数据会自动封装好,然后调用你请求的方法。
注意,这里和第二种方式不同,在页面表单中name属性不需要加vo对象的前缀