开发简单请假流程DEMO时知识和错误汇总
搞了将近一周,才把这个请假流程给搞定,在这期间遇到的问题N多,其实很感慨的说Struts2的组件超难用的,组件连把布局都加进去了,超郁闷的,不过为了熟悉下struts2还是硬着头皮用了。有涉及到的技术是Struts2+Jbpm4.3.总结下,遇到的问题以及解决方案,以及一些小知识。
①.Struts2部分。
1.Struts2的组件:下拉单选框,存放Value和Name是通过list属性。
list="#{Value1:Name1,Value2:Name2...}"
例如:<struts:select name="identity"
list="#{'personnel':'员工','manager':'经理','boss':'老板'}" />
2.struts.xml配置中,action结点下的result配置,如果result是指向另外一个Action,需指定属性
type="redirectAction"
例如:
<result name="manager" type="redirectAction">/showTask.action</result>
3.Struts2中的request和response以及Session获取方式:
private ActionContext context = ActionContext.getContext(); //获取Request private HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST); //获取Response private HttpServletResponse response = (HttpServletResponse) context.get(ServletActionContext.HTTP_RESPONSE); //获取Session private Map<String,Object> session = context.getSession();
4.表单的属性名会通过set方法传入到action中的属性名中,而action处理的结果通过相应的get方法来传入到页面上。就不用像以前Struts1那样通过ActionForm来传递了
5.struts2的标签获取session中的值,
如:<struts:property value="#session.loginUser.name"/>
6.访问出错:No result defined for action XXX and result success
解决方法:在package结点添加属性 namespace="/"
7.在jsp页面上用流的方式输出图片,出现
getOutputStream() has already been called for this response异常
解决方法:
在流输出后加入以下两行代码:
out.clear();
out = pageContext.pushBody();
②.Spring (做其他DEMO单元测试时问题)
1.org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity
原因:在配置文件中没有找到对于的PO对象,加入类似于如下代码即可:
<!-- 我记得以前指定名字叫packagesToScan就可的,现在要指定annotatedClasses --> <property name="annotatedClasses"> <list> <value>com.shine.jpbm4.po.WfBusiness</value> <value>com.shine.jpbm4.po.WfStep</value> <value>com.shine.jpbm4.po.WorkflowBusiInfo</value> </list> </property>
2.使用Spring的bean属性拷贝工具类,不允许名字一样,而类型却不一样。
③.Jbpm4.3 部分
1.用TaskService进行completeTask(taskId,variables)时出现
No unnamed transitions were found for the task for 'XXX'错误.
原因:在JPDL文件定义中,每个transition都有指定对应的名字,如果指定了名字,在进行completeTask时必须指定transtion名字,其实也不 一定是transtion的名字,还有可能是其他类型结点的名字,我们统称为outCome
解决方法:使用completeTask(taskId,outCome,vauables)方式进行提交任务。
2.对上面的补充,可通过TaskService获取指定taskId的所有outComes
方法:taskService.getOutcomes(taskId);
3.org.hibernate.HibernateException: instance not of expected entity type
原因进行变量的传输的时候,实体要序列化,实体内部包含的实体也都必须序列化,即实现Serializable接口
4.Jbpm乱码问题:
当提交的表单POST方式提交的时候,遇到的乱码问题,因为JPDL.XML文件指定的是UTF-8编码,但是Tomcat处理提交数据默认是使用ISO-8859-1,因此需要设置提交requet的编码,以前都使用过滤器进行的,为了简单起见,直接指定request为UTF-8编码格式,request.setCharacterEncoding("UTF-8")