


Detailed explanation of the method of calling Action in Webwork_javascript skills
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)); } }
•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; }
•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); }
• 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); }
•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(); }
•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); }
•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()); }
•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); } }
•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());
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; }
• 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(); }
•将传入的名称空间、 Action 的名字等参数赋予本地变量,接着通过 ConfigurationManager 获得当前请求的 Action 的配置信息[这里在5中已经描述过]。接着调用自身的 prepare 方法创建一个 ActionInvocation 对象赋予自身变量 invocation。在之后的 execute 方法中通过操纵invocation 来实现我们自己写的Action 的调用。
protected void prepare() throws Exception { this.invocation = ActionProxyFactory.getFactory().createActionInvocation(this, this.extraContext); }
以上所示是针对Webwork中Action 调用 的相关知识,希望对大家有所帮助。

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Detailed explanation of JavaScript string replacement method and FAQ This article will explore two ways to replace string characters in JavaScript: internal JavaScript code and internal HTML for web pages. Replace string inside JavaScript code The most direct way is to use the replace() method: str = str.replace("find","replace"); This method replaces only the first match. To replace all matches, use a regular expression and add the global flag g: str = str.replace(/fi

So here you are, ready to learn all about this thing called AJAX. But, what exactly is it? The term AJAX refers to a loose grouping of technologies that are used to create dynamic, interactive web content. The term AJAX, originally coined by Jesse J

10 fun jQuery game plugins to make your website more attractive and enhance user stickiness! While Flash is still the best software for developing casual web games, jQuery can also create surprising effects, and while not comparable to pure action Flash games, in some cases you can also have unexpected fun in your browser. jQuery tic toe game The "Hello world" of game programming now has a jQuery version. Source code jQuery Crazy Word Composition Game This is a fill-in-the-blank game, and it can produce some weird results due to not knowing the context of the word. Source code jQuery mine sweeping game

Article discusses creating, publishing, and maintaining JavaScript libraries, focusing on planning, development, testing, documentation, and promotion strategies.

This tutorial demonstrates how to create a captivating parallax background effect using jQuery. We'll build a header banner with layered images that create a stunning visual depth. The updated plugin works with jQuery 1.6.4 and later. Download the

This article demonstrates how to automatically refresh a div's content every 5 seconds using jQuery and AJAX. The example fetches and displays the latest blog posts from an RSS feed, along with the last refresh timestamp. A loading image is optiona

Matter.js is a 2D rigid body physics engine written in JavaScript. This library can help you easily simulate 2D physics in your browser. It provides many features, such as the ability to create rigid bodies and assign physical properties such as mass, area, or density. You can also simulate different types of collisions and forces, such as gravity friction. Matter.js supports all mainstream browsers. Additionally, it is suitable for mobile devices as it detects touches and is responsive. All of these features make it worth your time to learn how to use the engine, as this makes it easy to create a physics-based 2D game or simulation. In this tutorial, I will cover the basics of this library, including its installation and usage, and provide a

The article discusses strategies for optimizing JavaScript performance in browsers, focusing on reducing execution time and minimizing impact on page load speed.
