webwork源代码解读

今天大致的看了下webwork2.2.4的几个核心的类,做个总结 :)

首先来看WebWork2.2.4.怎么分离HTTP请求,其实他是通过ServletDispatcher来达到目的.代码如下所示:
在ServletDispatcher里service方法的代码实现如下
java 代码
  1. DispatcherUtils du = DispatcherUtils.getInstance();
  2. du.prepare(request, response);
  3. try {
  4. request = du.wrapRequest(request, getServletContext());
  5. } catch (IOException e) {
  6. String message = "Could not wrap servlet request with MultipartRequestWrapper!";
  7. LOG.error(message, e);
  8. throw new ServletException(message, e);
  9. }
  10. ActionMapping mapping = ActionMapperFactory.getMapper().getMapping(request);
  11. if (mapping == null) {
  12. try {
  13. response.sendError(404);
  14. } catch (IOException e) {
  15. LOG.error("Could not send 404 after not finding any ActionMapping", e);
  16. }
  17. return;
  18. }
  19. du.serviceAction(request, response, getServletContext(), mapping);

最后一句进行了相应的处理,在DispatcherUtils 处理代码如下:
java 代码
  1. public HashMap createContextMap(Map requestMap,
  2. Map parameterMap,
  3. Map sessionMap,
  4. Map applicationMap,
  5. HttpServletRequest request,
  6. HttpServletResponse response,
  7. ServletContext servletContext) {
  8. HashMap extraContext = new HashMap();
  9. extraContext.put(ActionContext.PARAMETERS, new HashMap(parameterMap));
  10. //存放SessionMap,即对HttpSession封装后的map
  11. extraContext.put(ActionContext.SESSION, sessionMap);
  12. //存放applicationMap,即对Application封装后的map
  13. extraContext.put(ActionContext.APPLICATION, applicationMap);
  14. Locale locale = null;
  15. if (Configuration.isSet(WebWorkConstants.WEBWORK_LOCALE)) {
  16. locale = LocalizedTextUtil.localeFromString(Configuration.getString(WebWorkConstants.WEBWORK_LOCALE), request.getLocale());
  17. } else {
  18. locale = request.getLocale();
  19. }
  20. extraContext.put(ActionContext.LOCALE, locale);
  21. extraContext.put(ActionContext.DEV_MODE, Boolean.valueOf(devMode));
  22. extraContext.put(WebWorkStatics.HTTP_REQUEST, request);//存放HttpServletRequest
  23. extraContext.put(WebWorkStatics.HTTP_RESPONSE, response);
  24. extraContext.put(WebWorkStatics.SERVLET_CONTEXT, servletContext);
  25. extraContext.put(ComponentInterceptor.COMPONENT_MANAGER, request.getAttribute(ComponentManager.COMPONENT_MANAGER_KEY));
  26. // helpers to get access to request/session/application scope
  27. extraContext.put("request", requestMap);//存放RequestMap
  28. extraContext.put("session", sessionMap);
  29. extraContext.put("application", applicationMap);
  30. extraContext.put("parameters", parameterMap);
  31. AttributeMap attrMap = new AttributeMap(extraContext);
  32. extraContext.put("attr", attrMap);
  33. return extraContext;


对于HttpSession ,HttpServletRequest...等,webwork进行了相应的封装SessionMap,RequestMap..我们很容易通过它们来操作底层的HttpSession....

在ActionContext 里提供了~getSession()来获取的当前的SessionMap,对SessionMap的操作即是主要对HttpSession的操作,SesionMap的部分代码如下:
java 代码
  1. 1. public Object get(Object key) {
  2. 2. if (session == null) { //这里的session即是HttpSession
  3. 3. return null;
  4. 4. }
  5. 5.
  6. 6. synchronized (session) {
  7. 7. return session.getAttribute(key.toString());
  8. 8. }
  9. 9. }
  10. 10.
  11. 11. /**
  12. 12. * Saves an attribute in the session.
  13. 13. *
  14. 14. * @param key the name of the session attribute.
  15. 15. * @param value the value to set.
  16. 16. * @return the object that was just set.
  17. 17. */
  18. 18. public Object put(Object key, Object value) {
  19. 19. synchronized (this) {
  20. 20. if (session == null) {
  21. 21. session = request.getSession(true);
  22. 22. }
  23. 23. }
  24. 24.
  25. 25. synchronized (session) {
  26. 26. entries = null;
  27. 27. session.setAttribute(key.toString(), value);
  28. 28.
  29. 29. return get(key);
  30. 30. }
  31. 31. }
  32. 32.

对于ServletActionContext,继承ActionContext而来,主要提供了getRequest(),getResponse()等方法来对HttpServletRequest,HttpServletResponse进行操作,可以getRequest().getSession()来获取的HttpSession, 也可以通过 getServletContext() 来获得Servlet 的上下文。

:)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值