Struts2.5中通过result标签调用Servlet的实现(Struts1迁移场景)
Struts2.5 配置result转发到Servlet实现方案
Struts2默认的结果类型已经能覆盖转发到Servlet的需求,不需要额外修改核心逻辑,和Struts1的转发行为完全对齐,具体实现按场景选以下方案即可:
方案1:默认dispatcher类型(服务器端转发,和Struts1 forward行为完全一致,优先用)
只要你的Servlet已经在web.xml或通过@WebServlet注解配置好了访问映射,直接用Struts2默认的dispatcher结果类型写Servlet的映射路径就行,和转发到JSP的写法没有区别。
举个例子,假设你的Servlet映射路径是/servlet/OrderProcessServlet,struts.xml里的配置如下:
<action name="submitOrder" class="com.biz.action.OrderAction"> <!-- type="dispatcher"是默认值可以省略,路径写Servlet的上下文绝对路径即可 --> <result name="success">/servlet/OrderProcessServlet</result> </action>
这种实现的特性和Struts1里配置forward到Servlet完全一致:
- 属于服务器内部转发,客户端地址栏不会变化
- 请求参数、Action中存入request、session、ServletContext域的属性,目标Servlet可以直接获取
- 需要传额外固定参数可以直接拼在路径后,比如
/servlet/OrderProcessServlet?migrateFrom=struts2
方案2:redirect类型(客户端重定向场景使用)
如果需要用客户端跳转(比如避免表单重复提交、跳转到独立路径下的Servlet),把结果类型改成redirect即可,对应Struts1里的redirect转发配置:
<action name="submitOrder" class="com.biz.action.OrderAction"> <result name="success" type="redirect"> <param name="location">/servlet/OrderProcessServlet</param> <!-- 配置为false会自动把当前请求的所有参数带到重定向地址上 --> <param name="suppressParameters">false</param> <!-- 也支持OGNL取Action属性拼参数,比如取Action里的orderId字段 --> <param name="orderId">${orderId}</param> </result> </action>
注意这个方案是302客户端跳转,request域存储的数据会丢失,需要传递的业务参数要么拼在URL上,要么存在session域里。
方案3:自定义结果类型(大规模转发Servlet场景可选)
如果项目里有大量需要转发到Servlet的配置,不想每次重复写路径前缀,可以自定义专用的结果类型,日常迁移用方案1完全足够,这个方案只适合统一规范的场景:
- 先写自定义结果类实现
Result接口:
public class ServletForwardResult implements Result { private String targetServlet; @Override public void execute(ActionInvocation invocation) throws Exception { HttpServletRequest req = ServletActionContext.getRequest(); HttpServletResponse resp = ServletActionContext.getResponse(); req.getRequestDispatcher(targetServlet).forward(req, resp); } // 提供setter接收配置参数 public void setTargetServlet(String targetServlet) { this.targetServlet = targetServlet; } }
- 在struts.xml的包配置里注册自定义结果类型,后续就可以全局使用:
<package name="basePackage" extends="struts-default"> <result-types> <result-type name="toServlet" class="com.biz.result.ServletForwardResult"/> </result-types> <action name="submitOrder" class="com.biz.action.OrderAction"> <result name="success" type="toServlet"> <param name="targetServlet">/servlet/OrderProcessServlet</param> </result> </action> </package>
避坑提醒
如果配置完出现404或者请求被当成Action报找不到对应Action方法的错误,检查Struts2核心过滤器的拦截规则:如果过滤器配置了拦截
FORWARD类型的请求,需要在Struts2常量里把Servlet所在的路径加入排除列表:<constant name="struts.action.excludePattern" value="/servlet/.*"/>
内容的提问来源于stack exchange,提问作者Neha Pahuja
相关产品推荐
相关产品推荐

