今天大致的看了下webwork2.2.4的几个核心的类,做个总结 :)
首先来看WebWork2.2.4.怎么分离HTTP请求,其实他是通过ServletDispatcher来达到目的.代码如下所示:
在ServletDispatcher里service方法的代码实现如下
最后一句进行了相应的处理,在DispatcherUtils 处理代码如下:
对于HttpSession ,HttpServletRequest...等,webwork进行了相应的封装SessionMap,RequestMap..我们很容易通过它们来操作底层的HttpSession....
在ActionContext 里提供了~getSession()来获取的当前的SessionMap,对SessionMap的操作即是主要对HttpSession的操作,SesionMap的部分代码如下:
对于ServletActionContext,继承ActionContext而来,主要提供了getRequest(),getResponse()等方法来对HttpServletRequest,HttpServletResponse进行操作,可以getRequest().getSession()来获取的HttpSession, 也可以通过 getServletContext() 来获得Servlet 的上下文。
:)
首先来看WebWork2.2.4.怎么分离HTTP请求,其实他是通过ServletDispatcher来达到目的.代码如下所示:
在ServletDispatcher里service方法的代码实现如下
java 代码
- DispatcherUtils du = DispatcherUtils.getInstance();
- du.prepare(request, response);
- try {
- request = du.wrapRequest(request, getServletContext());
- } catch (IOException e) {
- String message = "Could not wrap servlet request with MultipartRequestWrapper!";
- LOG.error(message, e);
- throw new ServletException(message, e);
- }
- ActionMapping mapping = ActionMapperFactory.getMapper().getMapping(request);
- if (mapping == null) {
- try {
- response.sendError(404);
- } catch (IOException e) {
- LOG.error("Could not send 404 after not finding any ActionMapping", e);
- }
- return;
- }
- du.serviceAction(request, response, getServletContext(), mapping);
最后一句进行了相应的处理,在DispatcherUtils 处理代码如下:
java 代码
- public HashMap createContextMap(Map requestMap,
- Map parameterMap,
- Map sessionMap,
- Map applicationMap,
- HttpServletRequest request,
- HttpServletResponse response,
- ServletContext servletContext) {
- HashMap extraContext = new HashMap();
- extraContext.put(ActionContext.PARAMETERS, new HashMap(parameterMap));
- //存放SessionMap,即对HttpSession封装后的map
- extraContext.put(ActionContext.SESSION, sessionMap);
- //存放applicationMap,即对Application封装后的map
- extraContext.put(ActionContext.APPLICATION, applicationMap);
- Locale locale = null;
- if (Configuration.isSet(WebWorkConstants.WEBWORK_LOCALE)) {
- locale = LocalizedTextUtil.localeFromString(Configuration.getString(WebWorkConstants.WEBWORK_LOCALE), request.getLocale());
- } else {
- locale = request.getLocale();
- }
- extraContext.put(ActionContext.LOCALE, locale);
- extraContext.put(ActionContext.DEV_MODE, Boolean.valueOf(devMode));
- extraContext.put(WebWorkStatics.HTTP_REQUEST, request);//存放HttpServletRequest
- extraContext.put(WebWorkStatics.HTTP_RESPONSE, response);
- extraContext.put(WebWorkStatics.SERVLET_CONTEXT, servletContext);
- extraContext.put(ComponentInterceptor.COMPONENT_MANAGER, request.getAttribute(ComponentManager.COMPONENT_MANAGER_KEY));
- // helpers to get access to request/session/application scope
- extraContext.put("request", requestMap);//存放RequestMap
- extraContext.put("session", sessionMap);
- extraContext.put("application", applicationMap);
- extraContext.put("parameters", parameterMap);
- AttributeMap attrMap = new AttributeMap(extraContext);
- extraContext.put("attr", attrMap);
- return extraContext;
对于HttpSession ,HttpServletRequest...等,webwork进行了相应的封装SessionMap,RequestMap..我们很容易通过它们来操作底层的HttpSession....
在ActionContext 里提供了~getSession()来获取的当前的SessionMap,对SessionMap的操作即是主要对HttpSession的操作,SesionMap的部分代码如下:
java 代码
- 1. public Object get(Object key) {
- 2. if (session == null) { //这里的session即是HttpSession
- 3. return null;
- 4. }
- 5.
- 6. synchronized (session) {
- 7. return session.getAttribute(key.toString());
- 8. }
- 9. }
- 10.
- 11. /**
- 12. * Saves an attribute in the session.
- 13. *
- 14. * @param key the name of the session attribute.
- 15. * @param value the value to set.
- 16. * @return the object that was just set.
- 17. */
- 18. public Object put(Object key, Object value) {
- 19. synchronized (this) {
- 20. if (session == null) {
- 21. session = request.getSession(true);
- 22. }
- 23. }
- 24.
- 25. synchronized (session) {
- 26. entries = null;
- 27. session.setAttribute(key.toString(), value);
- 28.
- 29. return get(key);
- 30. }
- 31. }
- 32.
对于ServletActionContext,继承ActionContext而来,主要提供了getRequest(),getResponse()等方法来对HttpServletRequest,HttpServletResponse进行操作,可以getRequest().getSession()来获取的HttpSession, 也可以通过 getServletContext() 来获得Servlet 的上下文。
:)