Struts2.1.8使用心得
程序员文章站
2022-06-11 12:16:30
...
这次的项目用到最新的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:
看见没,cssClass根本没显示,看了checkboxlist.ftl发现就是如此,在文件中添加如下部分就可以了
三、JFreeChart应用
由于这次项目需要有各种JFreeChart图输出,综合考虑采用如下方式
1.BaseAction是个基类,里面有常用的getSession()等的方法
2.JFreeChartChart是抽象基类,实现了JFreeChart各种图形的实现方式,提供getData()抽象方法用于子类实现
3.ExitChartAction其实是一个出口基类,通过传递图类型参数确定转向哪些子类
4.众多JFreeChartChart子类,实现getData()方法提供JFreeChart图形数据。
四、拦截器--日志管理
借鉴了网上一位仁兄的方法,具体在哪儿看到的记不清楚了,不过还是非常感谢这位仁兄。
五、OGNL语言
关于OGNL的概念可以google一下,我主要记录一些常用的用法
1.action中的某属性,有setter和getter,这种属性是最好表示的。其实就是request.getAttribute("xxx")或者request.getParameter("xxx");
表达方式${xxx},有人说javascript可以引用吗?答案是可以的
那如果在struts2标签里呢?也好说,这里举一个页面跳转的例子
2.<s:if test="" />中的判断条件,假设有个属性叫xxx
在test里可以写成xxx == 1或者%{#xxx == 1},但有一点要注意,如果是和字符串比较
xxx == 'a'这样是不行的一定要双引号xxx == "a"
3.其实还有很多应用,我在这就不一一列举了,大家可以一块商讨,下面附上OGNL参考手册奉献给大家。
一、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图输出,综合考虑采用如下方式
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参考手册奉献给大家。