OA项目笔记

OA模块预览:

 

软件开发的流程

l  需求调研分析

l  设计(概要设计、详细设计)

l  编码

l  测试

l  部署与维护

 

代码规范

l  注释:在代码中加入适当的注释:说明步骤,与说明非简单逻辑。

l  空行:在代码中加入适当的空行,就像写文章时要分段一样(增强可读性)。

l  要格式化代码、一个java文件中的代码不要过多、一个方法中的代码不要过多。

 

总之,要保证代码的有效、清晰、简洁。

有效:这是第一目标,代码要是可以解决问题的。

清晰:在有效的前提下,让代码结构与思路清晰。

简洁:代码与逻辑应尽量的简单,不要是给别人讲别人都听不明白。

 

Log4j的5个级别:

Fatal

Error

Warn

Info

Debug

 

流程说明:实现一组功能的步骤

l  1,充分了解需求,包括所有的细节,需要知道要做一个什么样的功能

l  2,设计实体/表

•    正向工程:设计实体、映射文件à 建表

•    反向工程:设计表 à 映射文件、实体

l  3,分析功能

•    分析到每个请求的粒度。

•    得到的结果是我们需要处理多少种请求,其中每种请求对应一个Action方法。

l  4,实现功能:

•    1,创建Action,并定义出其中的方法。

•    2,实现Action方法,并创建出所用到的新的Service方法。

•    3,实现Service方法,并创建出所用到的新的Dao方法。

•    4,实现Dao方法。

•    5,创建并完成JSP页面。

l  5,测试、运行

l  完成

 

流程总结:设计实体

l  1,有几个实体?

•    一般是一组增删改查对应一个实体。

l  2,实体之间有什么关系?

•    一般是页面引用了其他的实体时,就表示与这个实体有关联关系。

l  3,每个实体中都有什么属性?

•    1,主键

•    2,关联关系属性。在类图中,关联关系是一条线,有两端,每一端对应一个表达此关联关系的属性。有几个端指向本类,本类中就有几个关联关系属性。

•    3,一般属性。分析所有有关的页面,找出表单中要填写的或是在显示页面中要显示的信息等。

•    4,特殊属性:为解决某问题而设计的属性。比如要显示年龄,但不会设计一个int age字段,而是一个Date birthday字段,年龄是在显示时实时计算出来的。

l  完成

 

关联映射模板:

 

         多对一:

                   <many-to-onename="" class="" column=""></many-to-one>

         一对多:

                   <setname="">

                            <keycolumn=""></key>

                            <one-to-manyclass=""/>

                   </set>

         多对多:

                   <setname="" table="">

                            <keycolumn=""></key>

                            <many-to-manyclass="" column=""></many-to-many>

                   </set>

 

流程总结:Hibernate实体映射

l  1,写注释

•    格式为:?属性,表达的是本对象与?的?关系。

•    例:“department属性,本对象与Department的多对一”

l  2,拷模板:

l  3,填空:

•    name属性:属性名(注释中的第1问号)

•    class属性:关联的实体类型(注释中的第2个问号)

•    column属性:

•    <many-to-one column="..">:一般可以写成属性名加Id后缀,如属性为department,则column值写成departmentId。

•    一对多中的<keycolumn="..">:从关联的对方(对方是多对一)映射中把column值拷贝过来。

•    多对多中的<keycolumn=“..”>:一般可以写成本对象的名加Id后缀,如本对象名为User,则写为userId。

•    多对多中的<many-to-manycolumn=“..”>:一般可以写为关联对象的名称加Id后缀。

l  完成

 

分析请求:

  作用              方法名              返回值              页面

-------------------------------------------------------------------

列表                   list()                   list                      list.jsp

删除                   delete()             toList

添加页面         addUI()              addUI                 addUI.jsp

添加                   add()                  toList

修改页面         editUI()             editUI                editUI.jsp

修改                   edit()                  toList

 

toList的结果配置:

<result name="toList"type="redirectAction">roleAction_list</result>

 

增删改查共4个功能,6个请求,需要在Action中有6个对应的处理方法。

<result name="toList" type="redirectAction">roleAction_list</result>

 

 

增删改查所用的6个Action方法的模板

/** 列表 */

publicString list() throws Exception { return "list"; }

/** 删除 */

publicString delete() throws Exception { return "toList"; }

/** 添加页面 */

publicString addUI() throws Exception { return "saveUI"; }

/** 添加 */

publicString add() throws Exception { return "toList"; }

/** 修改页面 */

publicString editUI() throws Exception { return "saveUI"; }

/** 修改 */

publicString edit() throws Exception { return "toList"; }

 

 

myeclipse任务提示(Tasks视图):

格式:

// FIXME 说明 未完成的重要任务

// TODO 说明 未完成的任务

// XXX 说明 未完成的任务,级别最低

 

Myeclipse矩形选择:alt+shift+A

 

重定向到jsp页面:

<result name="toIndex"type="redirect">/index.jsp</result>

控制<s:password>密码框不回显:

<s:password name="password"showPassword="false"/>

 

服务器端验证

 

Action中:

         addFieldError("fieldName","message");

         addFieldError("login",  getText("login.failed"));//带国际化的错误消息

 

Jsp中:

         <s:fielderrorfieldName="fieldName"/>

         <s:fielderror/>//显示全部错误消息

 

Myeclipse快捷键:显示类的成员(字段和方法)ctrl+O

 

Myeclipse快捷键:查看类的继承结构,光标放到类名上,ctrl+T

 

解决frameset嵌套问题:

Js代码:

// 在被嵌套时就刷新上级窗口

if(window.parent!= window){

    window.parent.location.reload(true);

}

 

根据application对象拿到对应的ApplicationContext对象:

ApplicationContext ac =WebApplicationContextUtils.getWebApplicationContext(application);

 

在监听器Listener中拿到application对象和ApplicationContext对象:

 

public class InitServletContextListener implements ServletContextListener {

 

    public voidcontextInitialized(ServletContextEvent sce) {

       ServletContextapplication = sce.getServletContext();

       ApplicationContextac = WebApplicationContextUtils.getWebApplicationContext(application);

    }

 

    public voidcontextDestroyed(ServletContextEvent sce) {

    }

}

 

Sql case语句:

语法说明:

         方式一:

                   CASEvalue WHEN [compare_value] THEN result [WHEN [compare_value] THEN result ...][ELSE result] END

         方式二:

                   CASEWHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result]END

 

 

 

使用示例:

 

mysql> select id,name, (gender) as '性别' fromitcast_user;

+----+------------+------+

| id | name       | 性别 |

+----+------------+------+

| 19 | 张三       | 1   |

| 20 | 小红       | 2   |

| 21 | 超级管理员 |      |

+----+------------+------+

3 rows in set (0.00 sec)

 

mysql> select id,name, (CASE gender WHEN1 THEN '男' WHEN 2 THEN '女' ELSE '其他' END) as '性别' from itcast_user;

+----+------------+------+

| id | name       | 性别 |

+----+------------+------+

| 19 | 张三       | 男   |

| 20 | 小红       | 女   |

| 21 | 超级管理员 | 其他 |

+----+------------+------+

3 rows in set (0.00 sec)

 

mysql> select id,name, (CASE WHENgender=1 THEN '男' WHEN gender=2 THEN '女' ELSE '其他' END) as '性别' from itcast_user;

+----+------------+------+

| id | name       | 性别 |

+----+------------+------+

| 19 | 张三       | 男   |

| 20 | 小红       | 女   |

| 21 | 超级管理员 | 其他 |

+----+------------+------+

3 rows in set (0.00 sec)

 

最终版的“实现分页效果的流程”总结

想要实现分页效果,只需要在两个环节中写少量的代码,如下:

l  一、Action代码:

// 1,构建查询条件

HqlHelperhqlHelper = new HqlHelper(...);

// 2,查询并准备分页信息

PageBean pageBean = topicService.getPageBean(pageNum,hqlHelper);

ActionContext.getContext().getValueStack().push(pageBean);// 放到栈顶

l  二、JSP代码

         <%--1,显示列表 --%>

         <s:iteratorvalue=“recordList”>...</s:iterator>

         <%--2,分页信息 --%>

         <s:formaction=“userAction_list">...</s:form>

         <%@include file="/WEB-INF/jsp/public/pageView.jspf" %>

 

Jbpm工作流helloworld:

package cn.itcast.a_helloworld;

 

import java.util.List;

 

import org.jbpm.api.Configuration;

import org.jbpm.api.ProcessEngine;

import org.jbpm.api.task.Task;

import org.junit.Test;

 

public class HelloWorld_API {

 

         //建表

         @Test

         publicvoid createSchema() throws Exception { // hbm2ddl.auto=update

                   neworg.hibernate.cfg.Configuration()//

                                     .configure("jbpm.hibernate.cfg.xml")//

                                     .buildSessionFactory();

         }

 

         privatestatic ProcessEngine processEngine = new Configuration()//

                            .setResource("jbpm.cfg.xml")//

                            .buildProcessEngine();

 

         //1,部署流程定义

         @Test

         publicvoid deployProcessDefintion() throws Exception {

                   processEngine.getRepositoryService()//

                                     .createDeployment()//

                                     .addResourceFromClasspath("helloworld/helloworld.jpdl.xml")//

                                     .addResourceFromClasspath("helloworld/helloworld.png")//

                                     .deploy();

         }

 

         //2,启动流程实例

         @Test

         publicvoid startProcessInstance() throws Exception {

                   processEngine.getExecutionService().startProcessInstanceByKey(

                                     "helloworld");

         }

 

         //3,查询我的个人任务列表

         @Test

         publicvoid findMyPersonalTaskList() throws Exception {

//               StringuserId = "员工";

//               String userId = "部门经理";

                    String userId = "总经理";

 

                   //查询

                   List<Task>taskList = processEngine.getTaskService().findPersonalTasks( userId);

 

                  // 显示

                   System.out.println("=============【" + userId + "】的个人任务列表============");

                   for(Task task : taskList) {

                            System.out.println("id="+ task.getId()//

                                               +", name=" + task.getName()// 任务名称

                                               +", assignee=" + task.getAssignee()); // 办理人

                   }

         }

 

         //4,办理任务

         @Test

         publicvoid completeTask() throws Exception {

                   StringtaskId = "30001";

                   processEngine.getTaskService().completeTask(taskId);

         }

}

 

jbpm流程定义相关操作:ProcessDefinition

package cn.itcast.b_processdefinition;

 

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Set;

import java.util.zip.ZipInputStream;

 

import org.jbpm.api.Configuration;

import org.jbpm.api.ProcessDefinition;

import org.jbpm.api.ProcessDefinitionQuery;

import org.jbpm.api.ProcessEngine;

import org.junit.Test;

 

public class ProcessDefinitionTest {

 

         //使用指定的配置文件生成ProcessEngine对象

         //private ProcessEngine processEngine = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();

 

         //使用默认的配置文件生成ProcessEngine对象(jbpm.cfg.xml)

         //private ProcessEngine processEngine = new Configuration().buildProcessEngine();

 

         //获取单例的ProcessEngine对象(使用的是默认的配置文件:jbpm.cfg.xml)

         privateProcessEngine processEngine = Configuration.getProcessEngine();

 

         //部署(添加)

         //jbpm4_deployment

         //jbpm4_lob

         //jbpm4_deployprop

         @Test

         publicvoid testDeploy() throws Exception {

                   //NewDeployment deployment = processEngine.getRepositoryService().createDeployment();

                   //deployment.addResourceFromClasspath("helloworld/helloworld.jpdl.xml");

                   //deployment.addResourceFromClasspath("helloworld/helloworld.png");

                   //deployment.deploy();

 

                   StringdeploymentId = processEngine.getRepositoryService()//

                                     .createDeployment()//

                                     .addResourceFromClasspath("helloworld/helloworld.jpdl.xml")//

                                     .addResourceFromClasspath("helloworld/helloworld.png")//

                                     .deploy();

                   System.out.println("部署成功:deploymentId= " + deploymentId);

         }

 

         //部署(zip)

         @Test

         publicvoid testDeploy_zip() throws Exception {

                   //找到zip资源

                   InputStreamin =this.getClass().getClassLoader().getResourceAsStream("first.zip");

                   ZipInputStreamzipInputStream = new ZipInputStream(in);

 

                   //部署

                   StringdeploymentId = processEngine.getRepositoryService()//

                                     .createDeployment()//

                                     .addResourcesFromZipInputStream(zipInputStream)//

                                     .deploy();

                   System.out.println("部署成功:deploymentId= " + deploymentId);

         }

 

         //查询所有

         @Test

         publicvoid findAll() throws Exception {

                   //查询

                   List<ProcessDefinition>list = processEngine.getRepositoryService()//

                                     .createProcessDefinitionQuery()//

                                     //过滤条件

                                     //.processDefinitionKey("")//

                                     //.processDefinitionNameLike("%xx%")//

                                     //排序条件

                                     //.orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//

                                     //.orderDesc(ProcessDefinitionQuery.PROPERTY_VERSION)//

                                     //执行查询

                                     //.uniqueResult();

                                     //.count();

                                     //.page(firstResult, maxResults)//

                                     .list();

 

                   //显示

                   for(ProcessDefinition pd : list) {

                            System.out.println("id=" +pd.getId()// 格式为:{key}-{version},用于唯一的标识一个流程定义

                                               +", name=" + pd.getName()// 流程定义的名称,jpdl.xml中根元素的name属性的值

                                               +", key=" + pd.getKey()// 流程定义的key,jpdl.xml中根元素的key属性的值,默认是name属性的值

                                               +", version=" + pd.getVersion()// 自动生成的,同一个名称的第一个为1,以后的自动加1.

                                               +", deploymentId=" + pd.getDeploymentId()); // 所属的部署对象

                   }

         }

 

         //查询所有最新版本的流程定义

         @Test

         publicvoid findAllLatestVersions() throws Exception {

                   //查询所有,让所有最大的版本都排到最后面

                   List<ProcessDefinition>all = processEngine.getRepositoryService()//

                                     .createProcessDefinitionQuery()//

                                     .orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)//

                                     .list();

 

                   //过滤出所有最新的版本

                   Map<String,ProcessDefinition> map = new HashMap<String, ProcessDefinition>();

                   for(ProcessDefinition pd : all) {

                            map.put(pd.getKey(),pd);

                   }

 

                   //显示

                   for(ProcessDefinition pd : map.values()) {

                            System.out.println("id="+ pd.getId()// 格式为:{key}-{version},用于唯一的标识一个流程定义

                                               +", name=" + pd.getName()// 流程定义的名称,jpdl.xml中根元素的name属性的值

                                              + ",key=" + pd.getKey()// 流程定义的key,jpdl.xml中根元素的key属性的值,默认是name属性的值

                                               +", version=" + pd.getVersion()// 自动生成的,同一个名称的第一个为1,以后的自动加1.

                                               +", deploymentId=" + pd.getDeploymentId()); // 所属的部署对象

                   }

         }

 

         //删除

         @Test

         publicvoid deleteById() throws Exception {

                   StringdeploymentId = "80001";

 

                   删除指定的部署对象(流程定义),如果有关联的执行信息,就会报错

                   //processEngine.getRepositoryService().deleteDeployment(deploymentId);

 

                   //删除指定的部署对象(流程定义),如果有关联的执行信息,会被同时删除

                   processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);

         }

 

         //删除指定key的所有版本的流程定义

         @Test

         publicvoid deleteByKey() throws Exception {

                   //查询出指定key的所有版本的流程定义

                   List<ProcessDefinition>list = processEngine.getRepositoryService()//

                                     .createProcessDefinitionQuery()//

                                     .processDefinitionKey("helloworld")//

                                     .list();

 

                   //一一删除

                   for(ProcessDefinition pd : list) {

                            processEngine.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());

                   }

         }

 

         //查看流程图(xxx.png)

         @Test

         publicvoid getImageResource() throws Exception {

                   StringdeploymentId = "50001";

                   StringresourceName = "helloworld/helloworld.png";

 

                   //获取指定部署对象中的所有资源的名称

                   Set<String>names = processEngine.getRepositoryService().getResourceNames(deploymentId);

                   System.out.println("所有的资源名称:");

                   for(String name : names) {

                            System.out.println("\t"+ name);

                   }

 

                   //获取指定部署对象中的指下资源的内容

                   InputStreamin = processEngine.getRepositoryService().getResourceAsStream(deploymentId,resourceName);

 

                   //保存到e盘

                   OutputStreamout = new FileOutputStream("e:/process.png");

                   for(int b = -1; (b = in.read()) != -1;) {

                            out.write(b);

                   }

                   in.close();

                   out.close();

         }

}

 

ProcessInstanceTest.java

 

package cn.itcast.c_processinstance;

 

import java.util.List;

 

import org.jbpm.api.Configuration;

import org.jbpm.api.ProcessEngine;

import org.jbpm.api.ProcessInstance;

import org.jbpm.api.task.Task;

import org.junit.Test;

 

public class ProcessInstanceTest {

 

         privateProcessEngine processEngine = Configuration.getProcessEngine();

 

         @Test

         publicvoid deployProcessDefinition() {

                   processEngine.getRepositoryService()//

                                     .createDeployment()//

                                     .addResourceFromClasspath("cn/itcast/c_processinstance/test.jpdl.xml")//

                                     .addResourceFromClasspath("cn/itcast/c_processinstance/test.png")//

                                     .deploy();

         }

 

         //启动流程实例

         //jbpm4_execution

         @Test

         publicvoid testStartProcessInstance() throws Exception {

                   ProcessInstancepi =processEngine.getExecutionService().startProcessInstanceByKey("test");

 

                   System.out.println("流程实例启动成功:id="+ pi.getId() //

                                     +", state=" + pi.getState() // 状态

                                     +", processDefinitionId=" + pi.getProcessDefinitionId()); // 所使用的流程定义的ID

         }

 

         //查询个人任务列表

 

         @Test

         publicvoid testFindMyPersonalTaskList() throws Exception {

                   StringuserId = "张三";

 

                   //查询

                   //List<Task> list =processEngine.getTaskService().findPersonalTasks(userId);

                   //分页

                   List<Task>list = processEngine.getTaskService()//

                                     .createTaskQuery()//

                                     .assignee(userId)//指定办理人条件

                                     .page(0,100)// 分页

                                     .list();

 

                   //显示

                   System.out.println("======【" + userId + "】的个人任务列表======");

                   for(Task task : list) {

                            System.out.println("id="+ task.getId()//

                                               +", name=" + task.getName()//

                                               +", assignee=" + task.getAssignee()//

                                               +", createTime=" + task.getCreateTime()//

                                               +", executionId=" + task.getExecutionId());

                   }

         }

 

         //办理任务

         @Test

         publicvoid testCompleteTask() throws Exception {

                   StringtaskId = "130002";

                   processEngine.getTaskService().completeTask(taskId);

         }

 

         //向后执行一步

         @Test

         publicvoid testSignalExecution() throws Exception {

                   StringexecutionId = "test.130001";

                   processEngine.getExecutionService().signalExecutionById(executionId);

         }

}

 

ProcessVariableTest.java

 

package cn.itcast.d_processvariable;

 

import org.jbpm.api.Configuration;

import org.jbpm.api.ExecutionService;

import org.jbpm.api.ProcessEngine;

import org.jbpm.api.ProcessInstance;

import org.jbpm.api.TaskService;

import org.junit.Test;

 

public class ProcessVariableTest {

 

         privateProcessEngine processEngine = Configuration.getProcessEngine();

 

         //启动流程实例

         @Test

         publicvoid testStartProcessInstance() throws Exception {

                   ProcessInstancepi =processEngine.getExecutionService().startProcessInstanceByKey("test");

                   System.out.println("流程实例启动成功:id="+ pi.getId());

         }

 

         //设置流程变量

         @Test

         publicvoid testSetVariable() throws Exception {

                   StringexecutionId = "test.150001";

                   processEngine.getExecutionService().setVariable(executionId,"请假天数", 15);

         }

 

         //获取流程变量

         @Test

         publicvoid testGetVariable() throws Exception {

                   StringexecutionId = "test.150001";

                   Integerdays = (Integer) processEngine.getExecutionService().getVariable(executionId,"请假天数");

                   System.out.println("请假天数 = "+ days);

         }

 

         /**

         {

                   ExecutionServiceexecutionService = processEngine.getExecutionService();

                   TaskServicetaskService = processEngine.getTaskService();

 

                   //============ 设置变量 ========================

                   executionService.setVariable(executionId,name, value); // 设置一个变量

                   executionService.setVariables(executionId,variablesMap); // 设置多个变量

                   taskService.setVariables(taskId,variables); // 设置多个变量

 

                   executionService.startProcessInstanceByKey(processDefinitionKey,variablesMap); // 启动流程实例时,先设置一些变量

                   taskService.completeTask(taskId,variablesMap); // 真正办理完任务前先设置一些变量

                  

                  

                   //============ 获取变量 ========================

                   executionService.getVariable(executionId,variableName); // 获取一个变量

                   executionService.getVariableNames(executionId);// 返回Set<String>,是所有变量的名称集合

                   executionService.getVariables(executionId,variableNames); //获取多个变量,返回Map<String,Object>,表示指定名称的变量信息

        

                   taskService.getVariable(taskId,variableName);

                   taskService.getVariableNames(taskId);

                   taskService.getVariables(taskId,variableNames);

         }

         */

}

 

ProcessVariableTest2.java

 

package cn.itcast.d_processvariable;

 

import org.jbpm.api.Configuration;

import org.jbpm.api.ProcessEngine;

import org.jbpm.api.ProcessInstance;

import org.junit.Test;

 

public class ProcessVariableTest2 {

 

         privateProcessEngine processEngine = Configuration.getProcessEngine();

 

         //启动流程实例

         @Test

         publicvoid testStartProcessInstance() throws Exception {

                   ProcessInstancepi =processEngine.getExecutionService().startProcessInstanceByKey("test");

                   System.out.println("流程实例启动成功:id="+ pi.getId());

         }

 

         //设置流程变量

         @Test

         publicvoid testSetVariable() throws Exception {

                   StringexecutionId = "test.150001";

                   Formform = new Form(1L, "我要请假,我是张三"); // 通过指定id来模拟一个游离状态的对象

                   processEngine.getExecutionService().setVariable(executionId,"form", form);

         }

 

         //获取流程变量

         @Test

         publicvoid testGetVariable() throws Exception {

                   StringexecutionId = "test.150001";

                   Formform = (Form) processEngine.getExecutionService().getVariable(executionId,"form");

                   System.out.println(form);

         }

 

}

 

1,工作流框架

         处理流程的

         流程多,有变化

2,准备环境 + HelloWorld

 

 

 

一、概念

         Deployment                        部署对象

         ProcessDefinition    流程定义

 

         Execution                            “执行”对象

         ProcessInstance                流程实例(Root Execution)

         Task                             任务

 

二、操作

         管理流程定义

                   部署

                   查询

                   删除

                   获取流程图片

 

         执行流程实例

                   启动流程实例

                   操作流程变量

                   查询任务列表

                   办理任务

                   向后执行一步

 

三、API

         Configuration

                   getProcessEngine()

                   setResource(Stringres)

                   buildProcessEngine()

         ProcessEngine

                   getRepositoryService()

                   getExecutionService()

                   getTaskService()

                   get...Service()

 

=====================================================

 

设计流程

         连线Transition

         活动Activity / 节点Node

         事件Event

 

 

// 从classpath的根目录中查找a.txt文件

this.getClass().getClassLoader().getResourceAsStream("a.txt");

 

// 从classpath的根目录中查找a.txt文件

this.getClass().getResourceAsStream("/a.txt");

 

// 从当前类所在的包中查找a.txt文件

this.getClass().getResourceAsStream("a.txt");

 

 

======================================================

活动 Activity

 

         预先定义好的活动

                   Start                   开始活动

                   End                     结束活动

                   State                  状态活动

                   Decision   判断活动

                   Fork/Join  分支/聚合活动

                   Task          任务活动

         自定义的活动

                   Custom+ ExternalActivityBehaviour

        

事件 Event

 

 

 

在网页中高亮正执行的活动:

 

1,获取当前正在执行的活动名称

         processInstance.findActiveActivityNames()

2,获取活动对应的坐标

         repositoryService.getActivityCoordinates(processDefinitionId,activityName)

3,获取流程图片

         repositoryService().getResourceAsStream(deploymentId,resourceName);

 

 

 

任务:

         指定个人任务的办理人的方式:

                   1,直接指定:assignee="张三"

                   2,使用变量:assignee="#{manager}",变量值是一个字符串

                   3,使用AssignmentHandler

                            assignable.setAssignee(userId);// 指定个人任务的办理人

                   4,直接指定任务的办理人:

                            taskService.assignTask(taskId,userId);

         组任务与组任务分配方式:

                   1,直接指定:candidate-users="王工程师,李工程师,赵工程师"

                   2,使用变量:candidate-users="#{userIds}"

                            变量值是一个字符串,多个人之间使用英文的逗号隔开。

                   3,使用AssignmentHandler

                            assignable.addCandidateUser("小A"); //添加一个候选人(组任务)

                            assignable.addCandidateUser("小B"); //添加一个候选人(组任务)

                            assignable.addCandidateUser("小C"); //添加一个候选人(组任务)

                           

 

 

1,组任务:一个任务,很多人都能看到(同一组的人)。

2,先把任务拾取过来,就变成了自己的个人任务,别人就看不到了。

3,如果因事不能继续办理这个任务,可以选择:

         a,退回到组任务列表,让别人再去拾取与办理。

         b,直接把任务指定给某人。

 

 

Hibernate不同版本的xml配置文件的写法不一样

1,Hibernate 3.6.0 的XML的头:

 

         <!--hibernate.cfg.xml文件 -->

         <!DOCTYPEhibernate-configuration PUBLIC

                   "-//Hibernate/HibernateConfiguration DTD 3.0//EN"

                   "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

 

         <!--hbm.xml文件 -->

         <!DOCTYPEhibernate-mapping PUBLIC

                   "-//Hibernate/HibernateMapping DTD 3.0//EN"

                   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

 

         <!--hbm.xml文件中也可以使用这个 -->

         <!doctypehibernate-mapping public

       "-//hibernate/hibernate mapping dtd 3.0//en"

       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

 

 

2,Hibernate 3.3.1 的XML的头:

 

         <!--hibernate.cfg.xml文件 -->

         <!DOCTYPEhibernate-configuration PUBLIC

         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

        

         <!--hbm.xml文件 -->

         <!DOCTYPEhibernate-mapping PUBLIC

       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

 

 

 

 

 

头不能写错,否则会抛如下异常:

Caused by:org.hibernate.HibernateException: Could not parse configuration: file:/E:/workspace/ItcastOA/WebRoot/WEB-INF/classes/hibernate.cfg.xml

         atorg.hibernate.cfg.Configuration.doConfigure(Configuration.java:1528)

         atorg.hibernate.cfg.Configuration.configure(Configuration.java:1477)

         atorg.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:601)

         atorg.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)

         atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)

         atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)

         ...48 more

Caused by: org.dom4j.DocumentException:www.hibernate.org Nested exception: www.hibernate.org

         atorg.dom4j.io.SAXReader.read(SAXReader.java:484)

         atorg.hibernate.cfg.Configuration.doConfigure(Configuration.java:1518)

         ...53 more

 

 

中字的编码:

iso8859-1

utf-8                            E4B8 AD

gbk/gb2312               D6D0

 

 

表单采用Post方式提交,解决乱码的方法为:

         request.setCharacterEncoding(myEncoding );

 

表单采用Get方式提交,解决乱码的方法为:

         方式一:

                   key= new String(key.getBytes("iso8859-1"), "utf-8");

         方式二:

                   修改server.xml:   URIEncoding="utf-8"

         方式三(不依赖Tomcat的配置,推荐):

                   浏览器中两次URL编码。

                   服务器中自己再做一次URL解码。

 

Struts.xml

<!-- 让OGNL中可以使用静态的方法-->

<constantname="struts.ognl.allowStaticMethodAccess" value="true"/>

 

 

Jsp页面:

 

<s:aaction="processDefinitionAction_delete" οnclick="returndelConfirm()">

         <s:paramname="key" value="%{@java.net.URLEncoder@encode(key,'utf-8')}"></s:param>  

         删除

</s:a>

 

%{@java.net.URLEncoder@encode(key,'utf-8')}

 

下载图片struts.xml配置:

<!-- 流程定义设置 -->

<actionname="ProcessDefinitionAction_*"class="ProcessDefinitionAction" method="{1}">

    <resultname="list">/WEB-INF/jsp/ProcessDefinitionAction/list.jsp</result>

    <resultname="toList"type="redirectAction">ProcessDefinitionAction_list</result>

    <resultname="addUI">/WEB-INF/jsp/ProcessDefinitionAction/addUI.jsp</result>

    <!--下载用的设置 -->

    <resultname="downloadProcessImage">

       <paramname="contentType">image/png</param>

       <paramname="inputName">inputStream</param>

    </result>

</action>

 

 

/**

 * 保存上传的文件,并返回文件在服务端的真实存储路径

 */

protected String saveUploadFile(File upload) {

    SimpleDateFormatsdf = new SimpleDateFormat("/yyyy/MM/dd/");

    // >> 获取路径

    StringbasePath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload_files");

    StringsubPath = sdf.format(new Date());

    // >> 如果文件夹不存在,就创建

    Filedir = new File(basePath + subPath);

    if (!dir.exists()) {

       dir.mkdirs();// 递归的创建不存在的文件夹

    }

    // >> 拼接路径

    Stringpath = basePath + subPath + UUID.randomUUID().toString();

    // >> 移动文件

    upload.renameTo(new File(path));// 如果目标文件夹不存在,或是目标文件已存在,就会不成功,返回false,但不报错。

    return path;

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值