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>
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的两种方法