struts2 2.3版本 action不能提交?参数的原因是源码中截取了?后的
FormTag--》Form(evaluateClientSideJsEnablement)--》ServletUrlRenderer(renderFormUrl)
从继承树看出form继承closingbean,closingbean继承uibean(CTRL+单击)
从继承树看出form继承closingbean,closingbean继承uibean
fromtag 调用form构造函数
Form extends ClosingUIBean
ClosingUIBean extends UIBean
ClosingUIBean中:
public boolean start(Writer writer) {
boolean result = super.start(writer);
try {
evaluateParams();
mergeTemplate(writer, buildTemplateName(openTemplate, getDefaultOpenTemplate()));
} catch (Exception e) {
LOG.error("Could not open template", e);
}
return result;
}
调用uibean中:
evaluateParams{
populateComponentHtmlId
}
uiBean:
populateComponentHtmlId(form);
Form:
@Override
protected void populateComponentHtmlId(Form form) {
if (id != null) {
addParameter("id", escape(id));
}
// if no id given, it will be tried to generate it from the action attribute
// by the urlRenderer implementation
urlRenderer.renderFormUrl(this);
}
ServletUrlRenderer:
public void renderFormUrl(Form formComponent) {
String namespace = formComponent.determineNamespace(formComponent.namespace, formComponent.getStack(), formComponent.request);
String action;
if(formComponent.action != null) {
action = formComponent.findString(formComponent.action);
} else {
// no action supplied? ok, then default to the current request
// (action or general URL)
ActionInvocation ai = (ActionInvocation) formComponent.getStack().getContext().get(
ActionContext.ACTION_INVOCATION);
if (ai != null) {
action = ai.getProxy().getActionName();
namespace = ai.getProxy().getNamespace();
} else {
// hmm, ok, we need to just assume the current URL cut down
String uri = formComponent.request.getRequestURI();
action = uri.substring(uri.lastIndexOf('/'));
}
}
Map actionParams = null;
if (action != null && action.indexOf("?") > 0) {
String queryString = action.substring(action.indexOf("?") + 1);
actionParams = urlHelper.parseQueryString(queryString, false);
action = action.substring(0, action.indexOf("?"));
}
ActionMapping nameMapping = actionMapper.getMappingFromActionName(action);
String actionName = nameMapping.getName();
String actionMethod = nameMapping.getMethod();
final ActionConfig actionConfig = formComponent.configuration.getRuntimeConfiguration().getActionConfig(
namespace, actionName);
if (actionConfig != null) {
ActionMapping mapping = new ActionMapping(actionName, namespace, actionMethod, formComponent.parameters);
String result = urlHelper.buildUrl(formComponent.actionMapper.getUriFromActionMapping(mapping),
formComponent.request, formComponent.response, actionParams, null, formComponent.includeContext, true);
formComponent.addParameter("action", result);
// let's try to get the actual action class and name
// this can be used for getting the list of validators
formComponent.addParameter("actionName", actionName);
try {
Class clazz = formComponent.objectFactory.getClassInstance(actionConfig.getClassName());
formComponent.addParameter("actionClass", clazz);
} catch (ClassNotFoundException e) {
// this is OK, we'll just move on
}
formComponent.addParameter("namespace", namespace);
// if the name isn't specified, use the action name
if (formComponent.name == null) {
formComponent.addParameter("name", actionName);
}
// if the id isn't specified, use the action name
if (formComponent.getId() == null && actionName!=null ) {
formComponent.addParameter("id", formComponent.escape(actionName));
}
} else if (action != null) {
// Since we can't find an action alias in the configuration, we just
// assume the action attribute supplied is the path to be used as
// the URI this form is submitting to.
// Warn user that the specified namespace/action combo
// was not found in the configuration.
if (namespace != null && LOG.isWarnEnabled()) {
LOG.warn("No configuration found for the specified action: '" + actionName + "' in namespace: '" + namespace + "'. Form action defaulting to 'action' attribute's literal value.");
}
String result = urlHelper.buildUrl(action, formComponent.request, formComponent.response, null, null, formComponent.includeContext, true);
formComponent.addParameter("action", result);
// namespace: cut out anything between the start and the last /
int slash = result.lastIndexOf('/');
if (slash != -1) {
formComponent.addParameter("namespace", result.substring(0, slash));
} else {
formComponent.addParameter("namespace", "");
}
// name/id: cut out anything between / and . should be the id and
// name
String id = formComponent.getId();
if (id == null) {
slash = result.lastIndexOf('/');
int dot = result.indexOf('.', slash);
if (dot != -1) {
id = result.substring(slash + 1, dot);
} else {
id = result.substring(slash + 1);
}
formComponent.addParameter("id", formComponent.escape(id));
}
}
// WW-1284
// evaluate if client-side js is to be enabled. (if validation
// interceptor does allow validation eg. method is not filtered out)
formComponent.evaluateClientSideJsEnablement(actionName, namespace, actionMethod);
}
相关推荐
总的来说,Struts 2.3.15.3 源码的学习可以帮助开发者深入理解MVC框架的设计与实现,以及如何在实际项目中有效地运用Struts 2。通过阅读源码,你可以探索其内部工作原理,提高问题排查能力,并了解如何优化和定制...
标签"struts2"直接指向了我们讨论的核心,即Struts 2框架。Struts 2以其灵活性和可扩展性著称,它允许开发者通过拦截器(Interceptor)机制来定制请求处理流程,同时支持多种视图技术,如JSP、FreeMarker、 Velocity...
和`org.apache.struts2.views.freemarker`等包提供了对这些模板引擎的支持。 7. **依赖注入(DI)**:Struts 2支持依赖注入,允许开发者通过配置文件声明Action类的依赖,框架会在运行时自动注入。这降低了代码的...
Struts 2.3.15.1 是一个流行的开源Java Web框架的版本,它基于MVC(Model-View-Controller)设计模式,用于构建高效、可扩展且易于维护的企业级应用程序。该框架由Apache软件基金会开发并维护,是Struts 1的升级版,...
4. **interceptors**:拦截器是Struts2中实现业务逻辑和控制逻辑分离的重要组件,它可以预处理或后处理Action的调用。开发者可以通过`<interceptor>`和`<interceptor-ref>`来定义和引用拦截器。 5. **default-...
在标签"struts-2.3"中,"2.3"表示Struts2的主版本号,这表明了使用的是Struts2的较新版本,通常会包含一些新特性、改进和安全修复。对于"源码"和"开发调试",意味着这个版本特别适合进行源代码级别的学习和问题排查...
开发者可以通过实现`com.opensymphony.xwork2.Action`接口或继承`org.apache.struts2.dispatcher.ng.ExecuteOperations`和`org.apache.struts2.dispatcher.ng.InitOperations`来创建自定义Action。Result则是Action...
Struts2.3.1.2源码是Java Web开发框架Struts2的一个特定版本,主要专注于提供MVC(Model-View-Controller)架构来构建动态Web应用。这个版本的源码提供了深入理解Struts2内部工作原理的机会,对开发者来说是宝贵的...
1. 更强的安全性:针对之前版本的安全漏洞进行了修复,例如Struts Shiro漏洞和Struts2 S2-045漏洞。 2. Action配置的改进:支持注解方式配置Action,使得配置文件更加简洁。 3. 插件扩展性增强:增加了更多内置插件...
官方发布的"struts-2.3.15.1-lib.zip"是一个包含Struts2框架2.3.15.1版本库文件的压缩包,它包含了所有必要的jar包,以帮助开发者更新他们的系统以抵御已知的安全威胁。此版本的发布是为了修复之前版本中的安全漏洞...
Struts 2是Java Web开发中的一个开源框架,主要用于构建MVC(模型-视图-控制器)架构的应用程序。此“struts-2.3.16.1-all”压缩包包含了Struts 2框架的完整开发包,适用于开发者进行项目开发和学习。 **Struts 2...
这些类通常继承自 `org.apache.struts2.dispatcher.ng.ExecuteOperations` 或实现 `com.opensymphony.xwork2.Action` 接口。 3. **配置文件**:Struts 2 使用 XML 配置文件(如 `struts.xml`)来定义动作映射,关联...
通过上述步骤,您可以有效地将Struts2从2.3.15.1版本升级到2.3.32版本,从而避免了S2-045和S2-046等已知的安全漏洞带来的威胁。此外,定期关注并及时更新所使用的开源库版本,对于保障系统的安全稳定运行至关重要。
1. **Action和Result**:在Struts 2中,业务逻辑主要由Action类实现,每个Action对应一个用户请求。Action处理完请求后,通过Result来决定如何展示响应。Result可以是重定向、转发到一个页面,或者渲染一个模板。 2...
纯Struts2 struts-2.3.16.1版本下的demo,1、Struts2标签 2、Action 3、ActionSupport中validate 4、prepare 5、modeldriven 6、国际化 7、Token 8、拦截器
Struts 2是Java开发企业级Web应用的一个著名框架,其2.3.15.1版本是一个重要的发行版。这个"struts-2.3.15.1-all.zip"压缩包包含了Struts 2框架的完整组件,是开发者进行Struts 2应用开发的基础。下面将详细阐述...
例如,Struts2著名的Ognl注入漏洞(CVE-2017-5638),在新版本中应该得到了解决。检查并应用相关的安全配置,以防止类似问题的发生。 4. **新特性与API变更**:Struts2.3可能引入了一些新特性,如增强的插件支持、...
在Struts 2.3.15.2的源码中,我们可以深入研究以下几个核心知识点: 1. **Action与Result**:Struts 2的核心是Action类,它是业务逻辑的载体。Action类处理HTTP请求,执行相应的业务逻辑,并通过Result返回相应的...
标题提到的"struts-2.3.14.3"是Struts 2框架的一个特定版本,该版本修复了一个重要的安全漏洞,体现了软件维护和更新的重要性,尤其是对于处理用户输入数据的Web应用程序。 Struts 2框架的核心功能包括动作调度、...