传智播客--进销存之对Action的抽取和自己的WebForm的实现


今天我们继续使用反射和泛型技术对我们的快速开发做前期的准备工作.这个项目主要体现了快速开发的思想.在前期的时候,优势不是很明显,但我们把基础都做 好之后,越是往后我们会发现明显的优势.和快速的开发速度.但这个是有代价的,就是前期充分的准备工作.今天我们主要是使用第一天实现的DAO层和 Service层.并对Action抽取出一个基础的BaseAction.

1.使用 spring 提供的日志功能
logger.error()
这个方法是由 spring 框架提供的功能.
总结:
--日志的使用是很重要的,记录程序在运行时的情况.

2.在 Action 中抽取出来一个 BaseAction
1)在所有 Actiond 基类中并且是具体执行子类的方法之前把 request 中接收到参数信息进行一个转换,具体为自动循环把这个参数信息添加把一个 MAP 键值中.
2)在父类 Action 中把转换的 MAP 信息添加到另一个对象中去(WebForm),并且 WebForm 要求能够在具体的子类 Action 中能够访问到.
3)在 WebForm 类中利用反射设计一个通用自动化的把 MAP 中的信息依次 set 到我们的实体对象中去
4)在具体的子类中条用父类的 webForm 及相应的转换方法及可完成表单数据传递到逻辑对象中.
实现过程:
FrameworkEngine:
在这个类中同过传进来的 HttpServletRequest 得到相应的数据,并返回 WebForm 对象.
判断上 HttpServletRequest 传参数的三种情况:
-是不是"multipart/form-data"二进制的形式
-是不是"text/xml",在AJAX中经常出现的.
-是不是常见的文本

3.WebForm:
把视图层中的 VO 数据自动填充到 PO 对象中,返回被 VO 对象填充过的 PO 对象.
排除两种情况:
-属性为空
-MAP 中已经有这个键值了
    for (PropertyDescriptor propertyDescriptor : propertys) {
                String propertyName = propertyDescriptor.getName();
                Object propertyValue = null;
                if (!bw.isWritableProperty(propertyName)) {
                    continue;
                }
                if (!textElement.containsKey(propertyName)) {
                    continue;
                }

                Object value = textElement.get(propertyName);
                // 判断是否需要忽略空值
                if (ignoreBlankString) {
                    if (value == null || "".equals(value)) {
                        continue;
                    } else {
                        propertyValue = ConvertUtils.convert(value, propertyDescriptor.getPropertyType());
                    }
                } else {
                    // 赋值值进行类型转换
                    propertyValue = ConvertUtils.convert(value, propertyDescriptor.getPropertyType());
                }
                map.put(propertyName, propertyValue);
        }
总结:
--由于是使用Id的时候,总要进行类型转换很不方便,所以这里又把 Serializable 改成 Long
--很多功能都是在开源的项目中去借鉴,通过改写来实现我们的功能.
--让程序员全力关注项目的业务开发,而不是基础模块.

4.StrutsAction
我们提取一个公共的Action.这个Action 继承DispatchAction.并切其他的Action统一继承StrutsAction.
将在StrutsAction中统一处理字符乱码问题.表单提交问题...大大的减少代码的重复编写.更好的面向对象.提高代码质量.

5.数据重复提交的抽取
将这段代码抽取在StrutsAction中,所有的action都继承这个基本的StrutsAction.我们利用这个进行判断,统一处理表单重复提 交的问题.

        if (!isTokenValid(request, true)) {
                        request.setAttribute("msg", "重复提交数据");
                        request.setAttribute("newurl", request.getRequestURL());
                        return mapping.findForward("list");
        }

6.懒加载用的也是 OpenSessionInView
    <!-- 解决实体延迟加载而Hibernate session已关闭的问题 -->
    <filter>
        <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
        <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

你可能感兴趣的:(DAO,spring,Hibernate,object,webform,action)