Home > Web Front-end > JS Tutorial > body text

Detailed explanation of the method of calling Action in Webwork_javascript skills

WBOY
Release: 2016-05-16 15:16:22
Original
1695 people have browsed it

This article mainly introduces you to the knowledge related to webwork action calling through three aspects. The three aspects are:

1. This part of the framework class relationship

2.Webwork obtains and packages web parameters

3.DefaultActionProxyFactory, DefaultActionProxy, DefaultActionInvocation

Along the way, we finally start to summarize the core business classes of webwork. Webwork repackages the web parameters passed by the client, executes the business Action class, and feeds back the execution results. This source code analysis corresponds to the flow of the WebWork framework in the figure below. The red box in the picture.

1. This part of the framework class relationship

2.Webwork obtains and packages web parameters

•Each web framework more or less packages web request parameters for your own convenience, and of course webwork is no exception.
•Webwork’s entry method for each response request:

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException {
try {
if (encoding != null) {
try {
request.setCharacterEncoding(encoding);
} catch (Exception localException) {
}
}
if (locale != null) {
response.setLocale(locale);
}
if (this.paramsWorkaroundEnabled) {
request.getParameter("foo");
}
request = wrapRequest(request); //封装 request请求
serviceAction(request, response, getNameSpace(request), getActionName(request), getRequestMap(request), getParameterMap(request), getSessionMap(request), getApplicationMap());
} catch (IOException e) {
String message = "Could not wrap servlet request with MultipartRequestWrapper!";
log.error(message, e);
sendError(request, response, , new ServletException(message, e));
}
}
Copy after login

•Accept request and response parameters, and encapsulate the request parameters. This encapsulation is mainly for special processing of multimedia requests, such as file upload requests in projects, exporting various types of files, etc...

•After wrapping the request, the service method calls the ServletDispatche.serviceAction() method, and calls the six methods getApplicationMap, getSessionMap, getRequestMap, getParameterMap, getActionName, and getNameSpace to start the foreplay before calling the Action business logic.

•The getNameSpace method is used to obtain the namespace to which an Action belongs. For example: "/my/MyAction.action" returns "/my". The specific implementation is as follows:

protected String getNameSpace(HttpServletRequest request){
String servletPath = request.getServletPath();
return getNamespaceFromServletPath(servletPath);
}
public static String getNamespaceFromServletPath(String servletPath){
servletPath = servletPath.substring(, servletPath.lastIndexOf("/"));
return servletPath;
}
Copy after login

•getActionName returns the name of the requested Action. For example: "MyAction.action" returns "MyAction". The specific implementation is as follows:

protected String getActionName(HttpServletRequest request){
String servletPath = (String)request.getAttribute("javax.servlet.include.servlet_path");
if (servletPath == null) {
servletPath = request.getServletPath();
}
return getActionName(servletPath);
}
protected String getActionName(String name){
int beginIdx = name.lastIndexOf("/");
int endIdx = name.lastIndexOf(".");
return name.substring(beginIdx == - ? : beginIdx + , endIdx == - ? name.length() : endIdx);
}
Copy after login

• The getRequestMap method returns a Map containing all attributes in the request. The specific implementation class is RequestMap. The specific code is as follows:

protected Map getRequestMap(HttpServletRequest request){
return new RequestMap(request);
}
Copy after login

•The getParameterMap method returns a Map containing all parameters in the request. The specific code is as follows:

protected Map getParameterMap(HttpServletRequest request) throws IOException{
return request.getParameterMap();
}
Copy after login

•The getSessionMap method returns a Map containing all attributes in the session. The specific implementation class is SessionMap. The specific code is as follows:

protected Map getSessionMap(HttpServletRequest request){
return new SessionMap(request);
}
Copy after login

•The getApplicationMap method returns a Map containing all attributes in Application. The specific implementation class is ApplicationMap. The specific code is as follows:

protected Map getApplicationMap(){
return new ApplicationMap(getServletContext());
}
Copy after login

•The reason why WebWork encapsulates the attributes and parameters of the request, the attributes in the session, and the attributes in the Application into a Map is just for the convenience of its own use.

public void serviceAction(HttpServletRequest request, HttpServletResponse response, String namespace, String actionName, Map requestMap, Map parameterMap, Map sessionMap, Map applicationMap) {
HashMap extraContext = createContextMap(requestMap, parameterMap, sessionMap, applicationMap, request, response, getServletConfig());
extraContext.put("com.opensymphony.xwork.dispatcher.ServletDispatcher", this);
OgnlValueStack stack = (OgnlValueStack) request.getAttribute("webwork.valueStack");
if (stack != null) {
extraContext.put("com.opensymphony.xwork.util.OgnlValueStack.ValueStack", new OgnlValueStack(stack));
}
try {
ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, actionName, extraContext);
request.setAttribute("webwork.valueStack", proxy.getInvocation().getStack());
proxy.execute();
if (stack != null) {
request.setAttribute("webwork.valueStack", stack);
}
} catch (ConfigurationException e) {
log.error("Could not find action", e);
sendError(request, response, 404, e);
} catch (Exception e) {
log.error("Could not execute action", e);
sendError(request, response, 500, e);
}
}
Copy after login

•First, ServiceAction calls createContextMap to create the Action context (extraContext). It wraps JavaServlet related objects and puts them into extraContext Map objects.

• Then check whether there is an available value stack in the previous request. If so, put it into the extraContext Map object for use in this request.

•ActionContext (com.opensymphony.xwork.ActionContext) is the context when Action is executed. The context can be regarded as a container (in fact, our container here is just a Map). It stores the information that Action needs to use when executing. to the object.

• ServletActionContext (com.opensymphony.webwork. ServletActionContext), this class directly inherits ActionContext, which provides direct access to JavaServlet-related objects.

•The main function of OgnlValueStack is to access the properties of objects through expression language.

3.DefaultActionProxyFactory, DefaultActionProxy, DefaultActionInvocation

The foreplay is finally over, and the three brothers called by Action are about to come on stage to perform the most important operation. They are the following three lines of code, which are the same as the reading code of xwork.xml before requesting the jump in Webwork Learning Path (5) Very similar writing and design:

ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(namespace, actionName, extraContext);
request.setAttribute("webwork.valueStack", proxy.getInvocation().getStack());
Copy after login

proxy.execute(); •通过由前面获得的namespace、actionName、extraContext 创建调用代理 ActonProxy 实例,这里也就是 DefaultActionProxy,之后调用 了 ActionProxy.execute 方法来执行我们逻辑Action.execute。

•ActionProxy是一个接口,ActionProxyFactory则是一个抽象类,默认情况下它们是通过 DefaultActionProxy和DefaultActionProxyFactory来完成操作的。

•在 ActionProxyFactory 中有一个静态变量 factory ,它指向的是一个 DefaultActionProxyFactory 实例,代码如下:

static ActionProxyFactory factory = new DefaultActionProxyFactory();
public static void setFactory(ActionProxyFactory factory){
factory = factory;
}
public static ActionProxyFactory getFactory(){
return factory;
}
Copy after login

• DefaultActionProxyFactory 的 createActionProxy 方法返回了 DefaultActionProxy 实例。

public ActionProxy createActionProxy(String namespace, String actionName, Map extraContext)throws Exception {
setupConfigIfActionIsCommand(namespace, actionName);
return new DefaultActionProxy(namespace, actionName, extraContext, true);
} •DefaultActionProxy的构造函数
protected DefaultActionProxy(String namespace, String actionName, Map extraContext, boolean executeResult) throws Exception{
if (LOG.isDebugEnabled()) {
LOG.debug("Creating an DefaultActionProxy for namespace " + namespace + " and action name " + actionName);
}
this.actionName = actionName;
this.namespace = namespace;
this.executeResult = executeResult;
this.extraContext = extraContext;
this.config = ConfigurationManager.getConfiguration().getRuntimeConfiguration().getActionConfig(namespace, actionName);
if (this.config == null)
{
String message;
String message;
if ((namespace != null) && (namespace.trim().length() > 0)) {
message = LocalizedTextUtil.findDefaultText("xwork.exception.missing-package-action", Locale.getDefault(), new String[] {
namespace, actionName });
} else {
message = LocalizedTextUtil.findDefaultText("xwork.exception.missing-action", Locale.getDefault(), new String[] {
actionName });
}
throw new ConfigurationException(message);
}
prepare();
}
Copy after login

•将传入的名称空间、 Action 的名字等参数赋予本地变量,接着通过 ConfigurationManager 获得当前请求的 Action 的配置信息[这里在5中已经描述过]。接着调用自身的 prepare 方法创建一个 ActionInvocation 对象赋予自身变量 invocation。在之后的 execute 方法中通过操纵invocation 来实现我们自己写的Action 的调用。

protected void prepare() throws Exception {
this.invocation = ActionProxyFactory.getFactory().createActionInvocation(this, this.extraContext);
}
Copy after login

以上所示是针对Webwork中Action 调用 的相关知识,希望对大家有所帮助。

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template