Struts2.1.8使用心得

这次的项目用到最新的Struts2.1.8,在用的过程中遇到了很多问题,在此一一记录。
一、jsonplugin0.34的问题
jsonplugin0.34在struts2.1.6后就有问题了,其核心原因是xwork在2.1.2版本后将com.opensymphony.xwork2.util.TextUtils去掉了,解决办法将这个类重新考到jsonplugin包里。

二、Struts2标签问题
个人对Struts标签实在不敢恭维,实在难用。在使用了simple主题后情况有所改观。不过,Struts2的flt模板也存在问题。比如checkboxlist:
The java code is :
<table border="0" cellspacing="1" width="100%" cellpadding="0"	class="contextRow">
    <s:checkboxlist cssClass="contextFieldData" name="delValueList" list="descList" listKey="tag_value_id" listValue="valueName" />
</table>
 
The rendered HTML code is:
 
<table border="0" cellspacing="1" width="100%" cellpadding="0" class="contextRow">
<tr>
    <td class="tdLabel"></td>
    <td>
       <input type="checkbox" name="delValueList" value="1311" id="delValueList-1"/>
      <label for="delValueList-1" class="checkboxLabel">16AP</label>
      <input type="checkbox" name="delValueList" value="294" id="delValueList-2"/>
      <label for="delValueList-2" class="checkboxLabel">ADRR</label>
      <input type="checkbox" name="delValueList" value="1312" id="delValueList-3"/>
      <label for="delValueList-3" class="checkboxLabel">AP16</label>
      <input type="checkbox" name="delValueList" value="296" id="delValueList-4"/>
      <label for="delValueList-4" class="checkboxLabel">BAT</label>
      <input type="checkbox" name="delValueList" value="295" id="delValueList-5"/>
      <label for="delValueList-5" class="checkboxLabel">CARP</label>
      <input type="checkbox" name="delValueList" value="248" id="delValueList-6"/>
      <label for="delValueList-6" class="checkboxLabel">EXER</label>
    </td>
</tr>
</table>

看见没,cssClass根本没显示,看了checkboxlist.ftl发现就是如此,在文件中添加如下部分就可以了
<#if parameters.cssClass??>
     class="${parameters.cssClass?html}"<#rt/>
</#if>


三、JFreeChart应用
由于这次项目需要有各种JFreeChart图输出,综合考虑采用如下方式 Struts2.1.8使用心得
1.BaseAction是个基类,里面有常用的getSession()等的方法
2.JFreeChartChart是抽象基类,实现了JFreeChart各种图形的实现方式,提供getData()抽象方法用于子类实现
3.ExitChartAction其实是一个出口基类,通过传递图类型参数确定转向哪些子类
4.众多JFreeChartChart子类,实现getData()方法提供JFreeChart图形数据。

四、拦截器--日志管理
借鉴了网上一位仁兄的方法,具体在哪儿看到的记不清楚了,不过还是非常感谢这位仁兄。
        <interceptors>
            <interceptor name="myInterceptor"
                class="com.chiyu.action.admin.log.LoggerInterceptor">
            </interceptor>
            <interceptor-stack name="myStack">
                <interceptor-ref name="myInterceptor"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="myStack">
        </default-interceptor-ref>


...导入包略
public class LoggerInterceptor extends AbstractInterceptor {
    private IAdminOperationLogService adminOperationLogService;
    private IAdminService adminService;
    private static final long serialVersionUID = 1358600090729208361L;

    @SuppressWarnings("unchecked")
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("日志拦截器已经开始启动..");
        String actionName = invocation.getAction().getClass().toString();
        invocation.invoke();
        final Map<String, Object> parameters = invocation
                .getInvocationContext().getParameters();
        boolean result = invocation.getProxy().getExecuteResult();
        String method = invocation.getProxy().getMethod();
        // 取得请求相关的ActionContext实例
        ActionContext ctx = invocation.getInvocationContext();

        HttpServletRequest request = ServletActionContext.getRequest();
        String ip = request.getRemoteAddr();
        Map session = ctx.getSession();
        // 取出名为user的session属性
        String name = (String) session.get(Admin.ADMIN_KEY);
        Admin admin = adminService.findAdminByAdminName(name);
        System.out.println(admin);
        if (admin != null) {
            Adminoperationlog adminLog = new Adminoperationlog();
            adminLog.setAdminId(admin.getAdminId());
            adminLog.setAdminName(name);
            adminLog.setDealTime(new java.sql.Date(System.currentTimeMillis()));
            adminLog.setOperationIp(ip);
            adminLog.setOperationSource(actionName + "---" + method + "---"
                    + parameters + "---" + result);
            adminOperationLogService.save(adminLog);
        }
        return Action.SUCCESS;
    }

    setter和getter略
}


五、OGNL语言
关于OGNL的概念可以google一下,我主要记录一些常用的用法
1.action中的某属性,有setter和getter,这种属性是最好表示的。其实就是request.getAttribute("xxx")或者request.getParameter("xxx");
表达方式${xxx},有人说javascript可以引用吗?答案是可以的
var a = ${xxx};//可以获得值

那如果在struts2标签里呢?也好说,这里举一个页面跳转的例子
<s:action name="xxx" namespace="/xxx" executeResult="true">
    <s:param name="pictureType" value="%{xxx}"></s:param>
</s:action>

2.<s:if test="" />中的判断条件,假设有个属性叫xxx
在test里可以写成xxx == 1或者%{#xxx == 1},但有一点要注意,如果是和字符串比较
xxx == 'a'这样是不行的一定要双引号xxx == "a"
3.其实还有很多应用,我在这就不一一列举了,大家可以一块商讨,下面附上 OGNL参考手册奉献给大家。

你可能感兴趣的:(JavaScript,struts,项目管理,jfreechart,Google)