Struts2中从一个action内部跳转到另一个action,怎么配置xml呀?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2中从一个action内部跳转到另一个action,怎么配置xml呀?相关的知识,希望对你有一定的参考价值。

例如:
<package name="struts2" extends="struts-default">
<action name="goodsType" class="com.myStruts.web.action.GoodsTypeAction">
<result name="indexTypeSucces" >findAllGoodsInfo.action</result>
<result name="indexGoodSucces">/index.jsp</result>
<result name="err">/err.jsp</result>
</action>
</package>

<result name="nextAction" type="chain">nextAction</result>

type="chain"即可
然后配置要跳转的Action
<action name="nextAction">

参考资料:还有其他问题的话,给我发百度消息

参考技术A 这个要看你的两个action是不是在通一个package下了

<!-- 相同package下调用其它action -->
<action name="loginUser" class="com.**">
<result name="input">index.jsp</result>
<result type="redirectAction">stuList!isList</result>
</action>

<!-- 不同package下调用其它action -->
<package name="isLogin" extends="struts-default">
<action name="loginUser" class="com.**">
<result name="input">index.jsp</result>
<result type="redirectAction">
<param name="actionName">stuList!isList</param>
</result>
<result name="false">index.jsp</result>
</action>

如果还有问题 可以百度HI 我。。我在线帮你。
参考技术B 在action标签里写

<result name="xxx" type="redirect">/user.do?method=login</result>

name属性没什么特别的,主要是type="redirect"这就标识要内部跳转,在<result>标签内写你要跳转的action的动作
参考技术C Struts2 Action内部跳转:

<result name="xxx" type="chain">
<param name="namespace">/xxx</param>
<param name="actionName">xxx</param>
<param name="method">xxx</param>
</result>

在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

【中文标题】在 MCU 内部 FLASH 中从一个固件跳转到另一个固件【英文标题】:Jumping from one firmware to another in MCU internal FLASH 【发布时间】:2014-02-15 06:28:35 【问题描述】:

我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序。我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF(扇区 0 到扇区 2)。我还编写了一个主固件应用程序,存储在 0x08003000 到 0x0800C800 之间。将两个固件下载到 MCU 内部 FLASH 后,我使用以下代码从引导加载程序启动了主应用程序:

/************************************************************//**
* \brief Start the main application if available and correct
*****************************************************************/
void INTFLASH_execute_main_app(const char mode)

  MyFunc_ptr AppEntry;
  uint32_t temp[1];
  IRQn_Type index;

  memcpy(temp, (void*)&NVIC->ISER, sizeof(NVIC->ISER));  //Save enabled interrupts

  for( index = (IRQn_Type)0; index<= (IRQn_Type)28; index++) //Disable all interrupts
    NVIC_DisableIRQ(index);

  AppEntry = (MyFunc_ptr) INTFLASH_calculate_page_addr(IAP_APP_START_PAGE);

  if( mode || intflash_check_main_app() )
  
    Main_App_ptr = (uint8_t*)AppEntry;
    if( (*Main_App_ptr != 0xFF) &&  (Main_App_ptr) )
    
      AppEntry();
    
             
  memcpy( (void*)&NVIC->ISER, temp, sizeof(NVIC->ISER) ); //Restore interrupts

由于某种原因,当它执行AppEntry()时,会跳转到下面的代码,并没有执行位置0x08003000的主应用:

HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler              [WEAK]
                B       .
                ENDP

我以前在 ARM7 MCU 上使用过这种逻辑,它工作正常,我不太明白为什么它在这个基于 cortex M0 的 MCU 上不起作用。任何帮助将不胜感激。

请参阅下面的引导加载程序和主应用的分散文件:

LR_IROM1 0x08000000 0x00003000      ; load region size_region
  ER_IROM1 0x08000000 0x00003000    ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)       
   .ANY (+RO)
  
  RW_IRAM1 0x20000000 0x00002000    ; RW data
   .ANY (+RW +ZI)
  


LR_IROM1 0x08003000 0x0000C800      ; load region size_region
  ER_IROM1 0x08003000 0x0000C800    ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)       
   .ANY (+RO)
  
  RW_IRAM1 0x20000000 0x00002000    ; RW data
   .ANY (+RW +ZI)
  

【问题讨论】:

【参考方案1】:

在文件“startup_stm32f03xx.s”中,确保您有以下代码:

EXTERN  HardFault_Handler_C        ; this declaration is probably missing

__tx_vectors                       ; this declaration is probably there
    DCD     HardFault_Handler

然后,在同一个文件中,添加以下中断处理程序(所有其他处理程序所在的位置):

    PUBWEAK HardFault_Handler
    SECTION .text:CODE:REORDER(1)
HardFault_Handler
    TST LR, #4
    ITE EQ
    MRSEQ R0, MSP
    MRSNE R0, PSP
    B HardFault_Handler_C

然后,在文件 'stm32f03xx.c' 中,添加以下 ISR:

void HardFault_Handler_C(unsigned int* hardfault_args)

    printf("R0    = 0x%.8X\r\n",hardfault_args[0]);         
    printf("R1    = 0x%.8X\r\n",hardfault_args[1]);         
    printf("R2    = 0x%.8X\r\n",hardfault_args[2]);         
    printf("R3    = 0x%.8X\r\n",hardfault_args[3]);         
    printf("R12   = 0x%.8X\r\n",hardfault_args[4]);         
    printf("LR    = 0x%.8X\r\n",hardfault_args[5]);         
    printf("PC    = 0x%.8X\r\n",hardfault_args[6]);         
    printf("PSR   = 0x%.8X\r\n",hardfault_args[7]);         
    printf("BFAR  = 0x%.8X\r\n",*(unsigned int*)0xE000ED38);
    printf("CFSR  = 0x%.8X\r\n",*(unsigned int*)0xE000ED28);
    printf("HFSR  = 0x%.8X\r\n",*(unsigned int*)0xE000ED2C);
    printf("DFSR  = 0x%.8X\r\n",*(unsigned int*)0xE000ED30);
    printf("AFSR  = 0x%.8X\r\n",*(unsigned int*)0xE000ED3C);
    printf("SHCSR = 0x%.8X\r\n",SCB->SHCSR);                
    while (1);

如果你在执行中这个特定的Hard-Fault中断发生的那一刻不能使用printf,那么把上面所有的数据保存在一个全局缓冲区中,这样你就可以在到达while (1)之后查看它.

然后,请参阅http://www.keil.com/appnotes/files/apnt209.pdf 上的“Cortex-M 故障异常和寄存器”部分以了解问题,或者如果您需要进一步的帮助,请在此处发布输出。

【讨论】:

非常感谢。请查看您在我的回复中建议的结果。【参考方案2】:

硬故障 ISR 向我指出了故障所在。 R0 有 __initial_sp,它是堆栈的顶部。这让我意识到,在跳转到应用程序之前,我必须在引导加载程序中初始化应用程序的堆栈指针。之后,我现在可以成功地从引导加载程序跳转到应用程序。跳转地址也必须是(由于某种原因我不太明白)应用程序地址+4。

另外,请注意,您需要修改主应用程序 RAM 分配以从 0x200000C0 开始,大小为 0x00001FD0。这样做是为了在主应用程序“main”函数中将向量表重定位到内部 SRAM 的 0x20000000,如下所示:

/* Private macro -------------------------------------------------------------*/
__IO uint32_t VectorTable[48] __attribute__((at(0x20000000)));

/************************************************************//**
* \brief Main application application entry point
*
* At this stage the microcontroller clock setting is already configured, 
* this is done through SystemInit() function which is called from startup
* file (startup_stm32f030x8.s) before to branch to application main.
* To reconfigure the default setting of SystemInit() function, refer to
* startup_stm32f030x8.c file
*****************************************************************/
int main( void )

    uint32_t i = 0;
    uint8_t status;

/* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/  
  /* Copy the vector table from the Flash (mapped at the base of the application
     load address 0x08003000) to the base address of the SRAM at 0x20000000. */
  for(i = 0; i < 48; i++)
  
    VectorTable[i] = *(__IO uint32_t*)(IAP_BTLUPG_ADDRESS + (i<<2));
  

    RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;   /* Enable the SYSCFG peripheral clock*/

    SYSCFG->CFGR1 = SYSCFG_CFGR1_MEM_MODE;  /* Remap SRAM at 0x00000000 */

/***************** Application code starts below ***************************/       

在下面查看我的新引导加载程序 INTFLASH_execute_main_app 函数:

void INTFLASH_execute_main_app(const char mode)

  MyFunc_ptr Jump_To_Application;
  uint32_t JumpAddress;

//  __disable_irq();

    JumpAddress = *(__IO uint32_t*) (IAP_APP_ADDRESS + 4);
  Jump_To_Application = (MyFunc_ptr) JumpAddress;

  if( mode || intflash_check_main_app() )
  
    App_ptr = (uint8_t*)Jump_To_Application;
    if( (*App_ptr != 0xFF) &&  (App_ptr) )
                      
    __set_MSP( *(__IO uint32_t*)IAP_APP_ADDRESS );  // Initialise app's Stack Pointer
    Jump_To_Application();
    
            
//  __enable_irq();

非常感谢

【讨论】:

【参考方案3】:

你必须跳转到“应用程序地址+4”,因为应用程序的基地址持有初始堆栈指针位置。所以跳转到这个地址就意味着跳转到栈基地址。 在应用地址+4(+4B,因为是32位架构)下面是reset handler过程的地址。

【讨论】:

以上是关于Struts2中从一个action内部跳转到另一个action,怎么配置xml呀?的主要内容,如果未能解决你的问题,请参考以下文章

Struts2中如何从action的一个方法中跳转到另一个action的方法中

Struts2从一个action转到另一个action的两种方法

关于struts2防止表单重复提交

如何在 SwiftUI 中从一个详情页跳转到另一个详情页并返回列表页?

Struts2 action 跳转到web-inf下,

thinkphp5无法用html表单中的action跳转到另一个页面?