熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

struts2 更改默認resulttype

2022-06-13   來源: Java開源技術 

  最近碰到一個小要求想讓一些action返回的resultType默認為freemarker開始是想在action上配置全局的result然後name用一個表達式然後type=freemarker

  但是經過實驗發現不行因為這些配置是在struts一啟動的時候就已經實例化了再在action中使用表達式起不了作用最後會報異常

  於是去跟蹤源碼最後在PackageConfig這個類中找到了相關的代碼

  [java]

  public String getFullDefaultResultType() {

  if ((defaultResultType == null) && !parentsisEmpty()) {

  for (PackageConfig parent : parents) {

  String parentDefault = parentgetFullDefaultResultType()

  if (parentDefault != null) {

  return parentDefault;

  }

  }

  }

  return defaultResultType;

  }

  這個是一個遞歸查詢如果本包沒有配置就會查找父包最後會找到defaultpackage中這個裡面指定了為dispatcher

  好吧代碼是找到了那麼如何更改呢

  只需要在包中重新申明一下這個resulttype

  [html]

  <resulttype name=freemarker

  class=orgapachestrutsviewsfreemarkerFreemarkerResult

  default=true />

  並指定為default

  在解析這個包的時候就會將這個設置為默認的resulttype

  相關代碼在comopenfigprovidersXmlConfigurationProvider類的addResultTypes方法中

  [java]

  protected void addResultTypes(PackageConfigBuilder packageContext Element element) {

  NodeList resultTypeList = elementgetElementsByTagName(resulttype

  for (int i = ; i < resultTypeListgetLength() i++) {

  Element resultTypeElement = (Element) em(i)

  String name = resultTypeElementgetAttribute(name

  String className = resultTypeElementgetAttribute(class

  String def = resultTypeElementgetAttribute(default

  Location loc = DomHelpergetLocationObject(resultTypeElement)

  Class clazz = verifyResultType(className loc)

  if (clazz != null) {

  String paramName = null;

  try {

  paramName = (String) clazzgetField(DEFAULT_PARAMget(null)

  }

  catch (Throwable t) {

  // if we get here the result type doesnt have a default param defined

  }

  ResultTypeConfigBuilder resultType = new ResultTypeConfigBuilder(name className)defaultResultParam(paramName)

  location(DomHelpergetLocationObject(resultTypeElement))

  Map<String String> params = XmlHelpergetParams(resultTypeElement)

  if (!paramsisEmpty()) {

  resultTypeaddParams(params)

  }

  packageContextaddResultTypeConfig(resultTypebuild())

  // set the default result type

  if (trueequals(def)) {

  packageContextdefaultResultType(name)

  }

  }

  }

  }

  這段代碼用來解析struts的配置文件獲得resulttype元素然後解析相關元素如果設置了default為true則會將這個resulttype設置為默認的


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28223.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.