但是经过实验,发现不行,因为这些配置是在struts2一启动的时候就已经实例化了,再在action中使用表达式起不了作用,最后会报异常.
于是去跟踪,最后在packageconfig这个类中找到了相关的代码
[java]
public string getfulldefaultresulttype() {
if ((defaultresulttype == null) && !parents.isempty()) {
for (packageconfig parent : parents) {
string parentdefault = parent.getfulldefaultresulttype();
if (parentdefault != null) {
return parentdefault;
}
}
}
return defaultresulttype;
}
这个是一个递归查询,如果本包没有配置,就会查找父包,最后会找到default-package中,这个里面指定了为dispatcher.
好吧,代码是找到了,那么如何更改呢,
只需要在包中重新申明一下这个result-type
[html]
class="org.apache.struts2.views.freemarker.freemarkerresult"
default="true" />
并指定为default,
在解析这个包的时候就会将这个设置为默认的result-type.
相关代码在com.opensymphony.xwork2.config.providers.xmlconfigurationprovider类的addresulttypes方法中.
[java]
protected void addresulttypes(packageconfig.builder packagecontext, element element) {
nodelist resulttypelist = element.getelementsbytagname("result-type");
for (int i = 0; i < resulttypelist.getlength(); i ) {
element resulttypeelement = (element) resulttypelist.item(i);
string name = resulttypeelement.getattribute("name");
string classname = resulttypeelement.getattribute("class");
string def = resulttypeelement.getattribute("default");
location loc = domhelper.getlocationobject(resulttypeelement);
class clazz = verifyresulttype(classname, loc);
if (clazz != null) {
string paramname = null;
try {
paramname = (string) clazz.getfield("default_param").get(null);
}
catch (throwable t) {
// if we get here, the result type doesn't have a default param defined.
}
resulttypeconfig.builder resulttype = new resulttypeconfig.builder(name, classname).defaultresultparam(paramname)
.location(domhelper.getlocationobject(resulttypeelement));
map
if (!params.isempty()) {
resulttype.addparams(params);
}
packagecontext.addresulttypeconfig(resulttype.build());
// set the default result type
if ("true".equals(def)) {
packagecontext.defaultresulttype(name);
}
}
}
}
这段代码用来解析struts2的配置文件,获得result-type元素,然后,解析相关元素,如果设置了default为true,则会将这个result-type设置为默认的.