📄 requesthandler.java
字号:
} // Process the eventReturn. String eventReturn = requestManager.getRequestAttribute(requestUri, eventReturnString); if (Debug.verboseOn()) Debug.logVerbose("[Response Qualified]: " + eventReturn, module); // Set the next view (don't use event return if success, default to nextView (which is set to eventReturn later if null); also even if success if it is a type "none" response ignore the nextView, ie use the eventReturn) if (eventReturn != null && (!"success".equals(eventReturnString) || eventReturn.startsWith("none:"))) nextView = eventReturn; if (Debug.verboseOn()) Debug.logVerbose("[Event Response Mapping]: " + nextView, module); // get the previous request info String previousRequest = (String) request.getSession().getAttribute("_PREVIOUS_REQUEST_"); String loginPass = (String) request.getAttribute("_LOGIN_PASSED_"); // restore previous redirected request's attribute, so redirected page can display previous request's error msg etc. String preReqAttStr = (String) request.getSession().getAttribute("_REQ_ATTR_MAP_"); Map preRequestMap = null; if(preReqAttStr!=null){ request.getSession().removeAttribute("_REQ_ATTR_MAP_"); byte [] reqAttrMapBytes = StringUtil.fromHexString(preReqAttStr); preRequestMap = (java.util.Map)org.ofbiz.base.util.UtilObject.getObject(reqAttrMapBytes); java.util.Iterator keys= preRequestMap.keySet().iterator(); while(keys.hasNext()){ String key = (String) keys.next(); if("_ERROR_MESSAGE_LIST_".equals(key) || "_ERROR_MESSAGE_MAP_".equals(key) || "_ERROR_MESSAGE_".equals(key) || "_EVENT_MESSAGE_LIST_".equals(key) || "_EVENT_MESSAGE_".equals(key)){ Object value = preRequestMap.get(key); request.setAttribute(key, value); } } } if (Debug.verboseOn()) Debug.logVerbose("[RequestHandler]: previousRequest - " + previousRequest + " (" + loginPass + ")", module); // if previous request exists, and a login just succeeded, do that now. if (previousRequest != null && loginPass != null && loginPass.equalsIgnoreCase("TRUE")) { request.getSession().removeAttribute("_PREVIOUS_REQUEST_"); if (Debug.infoOn()) Debug.logInfo("[Doing Previous Request]: " + previousRequest, module); doRequest(request, response, previousRequest, userLogin, delegator); return; // this is needed or else we will run the view twice } String successView = requestManager.getViewName(requestUri); if ("success".equals(eventReturnString) && successView.startsWith("request:")) { // chains will override any url defined views; but we will save the view for the very end if (nextView != null) { request.setAttribute("_POST_CHAIN_VIEW_", nextView); } nextView = successView; } // Make sure we have some sort of response to go to if (nextView == null) nextView = successView; if (Debug.verboseOn()) Debug.logVerbose("[Current View]: " + nextView, module); // Handle the responses - chains/views if (nextView != null && nextView.startsWith("request:")) { // chained request Debug.logInfo("[RequestHandler.doRequest]: Response is a chained request.", module); nextView = nextView.substring(8); doRequest(request, response, nextView, userLogin, delegator); return; // this just to be safe; not really needed } else { // handle views // first invoke the post-processor events. Collection postProcEvents = requestManager.getPostProcessor(); if (postProcEvents != null) { Iterator i = postProcEvents.iterator(); while (i.hasNext()) { Map eventMap = (Map) i.next(); String eType = (String) eventMap.get(ConfigXMLReader.EVENT_TYPE); String ePath = (String) eventMap.get(ConfigXMLReader.EVENT_PATH); String eMeth = (String) eventMap.get(ConfigXMLReader.EVENT_METHOD); try { String returnString = this.runEvent(request, response, eType, ePath, eMeth); if (returnString != null && !returnString.equalsIgnoreCase("success")) throw new EventHandlerException("Post-Processor event did not return 'success'."); else if (returnString == null) nextView = "none:"; } catch (EventHandlerException e) { Debug.logError(e, module); } } } if (nextView != null && nextView.startsWith("url:")) { // check for a url for redirection Debug.logInfo("[RequestHandler.doRequest]: Response is a URL redirect.", module); nextView = nextView.substring(4); callRedirect(nextView, response, request); } else if (nextView != null && nextView.startsWith("cross-redirect:")) { // check for a cross-application redirect Debug.logInfo("[RequestHandler.doRequest]: Response is a Cross-Application redirect.", module); String url = nextView.startsWith("/") ? nextView : "/" + nextView; callRedirect(url + this.makeQueryString(request), response, request); } else if (nextView != null && nextView.startsWith("request-redirect:")) { // check for a Request redirect Debug.logInfo("[RequestHandler.doRequest]: Response is a Request redirect.", module); nextView = nextView.substring(17); callRedirect(makeLinkWithQueryString(request, response, "/" + nextView), response, request); } else if (nextView != null && nextView.startsWith("view:")) { // check for a View Debug.logInfo("[RequestHandler.doRequest]: Response is a view.", module); nextView = nextView.substring(5); renderView(nextView, requestManager.allowExtView(requestUri), request, response); } else if (nextView != null && nextView.startsWith("none:")) { // check for a no dispatch return (meaning the return was processed by the event Debug.logInfo("[RequestHandler.doRequest]: Response is handled by the event.", module); } else if (nextView != null) { // a page request Debug.logInfo("[RequestHandler.doRequest]: Response is a page [" + nextView + "]", module); renderView(nextView, requestManager.allowExtView(requestUri), request, response); } else { // unknown request throw new RequestHandlerException("Illegal response; handler could not process [" + eventReturnString + "]."); } } } /** Find the event handler and invoke an event. */ public String runEvent(HttpServletRequest request, HttpServletResponse response, String type, String path, String method) throws EventHandlerException { EventHandler eventHandler = eventFactory.getEventHandler(type); return eventHandler.invoke(path, method, request, response); } /** Returns the default error page for this request. */ public String getDefaultErrorPage(HttpServletRequest request) { //String requestUri = RequestHandler.getRequestUri(request.getPathInfo()); //return requestManager.getErrorPage(requestUri); return requestManager.getDefaultErrorPage(); } public String makeQueryString(HttpServletRequest request) { Map paramMap = UtilHttp.getParameterMap(request); StringBuffer queryString = new StringBuffer(); if (paramMap != null && paramMap.size() > 0) { queryString.append("?"); Iterator i = paramMap.keySet().iterator(); while (i.hasNext()) { String name = (String) i.next(); Object value = paramMap.get(name); if (value instanceof String) { if (queryString.length() > 1) { queryString.append("&"); } queryString.append(name); queryString.append("="); queryString.append(value); } } } return queryString.toString(); } /** Returns the RequestManager Object. */ public RequestManager getRequestManager() { return requestManager; } /** Returns the ServletContext Object. */ public ServletContext getServletContext() { return context; } /** Returns the ViewFactory Object. */ public ViewFactory getViewFactory() { return viewFactory; } /** Returns the EventFactory Object. */ public EventFactory getEventFactory() { return eventFactory; } public static String getRequestUri(String path) { List pathInfo = StringUtil.split(path, "/"); if (pathInfo == null || pathInfo.size() == 0) { Debug.logWarning("Got nothing when splitting URI: " + path, module); return null; } if (((String)pathInfo.get(0)).indexOf('?') > -1) { return ((String) pathInfo.get(0)).substring(0, ((String)pathInfo.get(0)).indexOf('?')); } else { return (String) pathInfo.get(0); } } public static String getNextPageUri(String path) { List pathInfo = StringUtil.split(path, "/"); String nextPage = null; if (pathInfo == null) { return nextPage; } for (int i = 1; i < pathInfo.size(); i++) { String element = (String) pathInfo.get(i); if (element.indexOf('~') != 0) { if (element.indexOf('?') > -1) { element = element.substring(0, element.indexOf('?')); } if (i == 1) { nextPage = element; } else { nextPage = nextPage + "/" + element; } } } return nextPage; } private void callRedirect(String url, HttpServletResponse resp, HttpServletRequest req) throws RequestHandlerException { if (Debug.infoOn()) Debug.logInfo("[Sending redirect]: " + url, module); // set the attributes in the session so we can access it. java.util.Enumeration attributeNameEnum = req.getAttributeNames(); Map reqAttrMap = FastMap.newInstance(); while (attributeNameEnum.hasMoreElements()) { String name = (String) attributeNameEnum.nextElement(); Object obj = req.getAttribute(name); if (obj instanceof Serializable) { reqAttrMap.put(name, obj); } } if (reqAttrMap.size() > 0) { byte[] reqAttrMapBytes = UtilObject.getBytes(reqAttrMap); if (reqAttrMapBytes != null) { req.getSession().setAttribute("_REQ_ATTR_MAP_", StringUtil.toHexString(reqAttrMapBytes)); } } // send the redirect try { resp.sendRedirect(url); } catch (IOException ioe) { throw new RequestHandlerException(ioe.getMessage(), ioe); } catch (IllegalStateException ise) { throw new RequestHandlerException(ise.getMessage(), ise); } } private void renderView(String view, boolean allowExtView, HttpServletRequest req, HttpServletResponse resp) throws RequestHandlerException { GenericValue userLogin = (GenericValue) req.getSession().getAttribute("userLogin"); GenericDelegator delegator = (GenericDelegator) req.getAttribute("delegator"); // workaraound if we are in the root webapp String cname = UtilHttp.getApplicationName(req); String oldView = view; if (view != null && view.length() > 0 && view.charAt(0) == '/') view = view.substring(1); // if the view name starts with the control servlet name and a /, then it was an // attempt to override the default view with a call back into the control servlet, // so just get the target view name and use that String servletName = req.getServletPath().substring(1); Debug.logInfo("servletName=" + servletName + ", view=" + view, module); if (view.startsWith(servletName + "/")) { view = view.substring(servletName.length() + 1); Debug.logInfo("a manual control servlet request was received, removing control servlet path resulting in: view=" + view, module); } if (Debug.verboseOn()) Debug.logVerbose("[Getting View Map]: " + view, module); // before mapping the view, set a session attribute so we know where we are req.setAttribute("_CURRENT_VIEW_", view); String viewType = requestManager.getViewType(view); String tempView = requestManager.getViewPage(view); String nextPage = null; if (tempView == null) { if (!allowExtView) { throw new RequestHandlerException("No view to render."); } else { nextPage = "/" + oldView; } } else { nextPage = tempView; } if (Debug.verboseOn()) Debug.logVerbose("[Mapped To]: " + nextPage, module); long viewStartTime = System.currentTimeMillis(); // setup chararcter encoding and content type
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -