- 浏览: 17328 次
- 性别:
- 来自: 北京
最新评论
-
twell:
你好,我遇到了一个跟你同样的问题,你现在跟德国那家公司联系得怎 ...
需求管理DOORS如何和java交互,希望有个jar适配器 -
aochant:
看上去很不错啊,可是楼主 你的包在哪里呀?
对jbpm提供了扩展,大家可以直接用我的包,轻松的取出各种列表,待办,已办,办结,待签,已签 -
皇室勇少:
认真的看过。但是对于业务数据过多的话。我还是选择另外设计业务表 ...
jbpm分页 -
madrocket:
通过前段时间对doors一个接口适配器的寻找,有如下3种方式: ...
需求管理DOORS如何和java交互,希望有个jar适配器
获取jbpm的待办列表,比如用户admin的共有100条待办数据,调用jbpm的API如下:
- 获取待办列表:
- JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
- TaskMgmtSession taskMgmtSession = jbpmContext.getTaskMgmtSession();
- //只能获取尚未完成的任务列表(待办任务)
- List list = taskMgmtSession.findTaskInstances(userId);
下面的jbpm的源码
- public List findTaskInstances(String actorId) {
- List result = null;
- try {
- Query query = session.getNamedQuery("TaskMgmtSession.findTaskInstancesByActorId");
- query.setString("actorId", actorId);
- result = query.list();
- } catch (Exception e) {
- log.error(e);
- jbpmSession.handleException();
- throw new JbpmException("couldn't get task instances list for actor '"+actorId+"'", e);
- }
- return result;
- }
TaskMgmtSession.findTaskInstancesByActorId所对应的sql语句如下:
- <query name="TaskMgmtSession.findTaskInstancesByActorId">
- <![CDATA[
- select ti
- from org.jbpm.taskmgmt.exe.TaskInstance as ti
- where ti.actorId = :actorId
- and ti.isOpen = true
- ]]>
- </query>
可以看到jbpm并没有实现分页的处理
仅仅是把所有的记录都查询出来了
所以下面,进行了封装,实现了分页。
首先建立Page.java
- package com.eway.framework.basecomponent.services.jbpm.util;
- /**
- * Created by IntelliJ IDEA.
- * User: yuchen
- * Date: 2008-11-24
- * Time: 17:26:31
- * To change this template use File | Settings | File Templates.
- */
- public class Page {
- private int pageSize ;//每页显示的条数
- private int recordCount;//总共的条数
- private int currentPage;//当前页面
- public Page() {
- }
- public Page(int pageSize, int recordCount, int currentPage) {
- this.pageSize = pageSize;
- this.recordCount = recordCount;
- this.setCurrentPage(currentPage,"");
- }
- //构造方法
- public Page(int pageSize, int recordCount) {
- this(pageSize, recordCount, 1);
- }
- //总页数
- public int getPageCount() {
- int size = recordCount / pageSize;//总条数/每页显示的条数=总页数
- int mod = recordCount % pageSize;//最后一页的条数
- if (mod != 0)
- size++;
- return recordCount == 0 ? 1 : size;
- }
- //包含,起始索引为0
- public int getFromIndex() {
- //System.out.println("from index:"+(currentPage-1) * pageSize);
- return (currentPage - 1) * pageSize+1;
- }
- //不包含
- public int getToIndex() {
- //System.out.println("to index:"+Math.min(recordCount, currentPage * pageSize));
- return Math.min(recordCount, currentPage * pageSize);
- }
- //得到当前页
- public int getCurrentPage() {
- return currentPage;
- }//设置当前页
- /**
- *
- * @param currentPage
- * @param inner
- */
- public void setCurrentPage(int currentPage,String inner) {
- int validPage = currentPage <= 0 ? 1 : currentPage;
- validPage = validPage > getPageCount() ? getPageCount() : validPage;
- this.currentPage = validPage;
- }//得到每页显示的条数
- /**
- *
- * @param currentPage
- */
- public void setCurrentPage(int currentPage) {
- this.currentPage = currentPage;
- }
- //得到每页显示的条数
- public int getPageSize() {
- return pageSize;
- }//设置每页显示的条数
- public void setPageSize(int pageSize) {
- this.pageSize = pageSize;
- }//得到总共的条数
- public int getRecordCount() {
- return recordCount;
- }//设置总共的条数
- public void setRecordCount(int recordCount) {
- this.recordCount = recordCount;
- }
- }
为了统一管理hibernate的session,笔者写了HibernateUtil.java
- package com.eway.framework.basecomponent.services.jbpm.util;
- import org.hibernate.HibernateException;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- /**
- * Created by IntelliJ IDEA.
- * User: yuchen
- * Date: 2008-11-26
- * Time: 12:23:03
- * To change this template use File | Settings | File Templates.
- */
- //定义一个HibernateUtil类来初始化hinernate 创建SessionFactory实例,并提供创建Session实例,关闭Session实例
- //以及打开/关闭事务 和从新创建SessionFactory实例的使用方法(所以方法都为静态)
- public class HibernateUtil {
- private static final SessionFactory sessionFactory;
- static {
- try {
- sessionFactory = new Configuration().configure().buildSessionFactory();
- } catch (Throwable ex) {
- ex.printStackTrace();
- throw new ExceptionInInitializerError(ex);
- }
- }
- public static final ThreadLocal<Session> tLocalsess = new ThreadLocal<Session>();
- public static final ThreadLocal<Transaction> tLocaltx = new ThreadLocal<Transaction>();
- /*
- getting the thread-safe session for using 取得session
- */
- public static Session currentSession() {
- Session session = (Session) tLocalsess.get();
- try {
- if (session == null || !session.isOpen()) {
- session = openSession();
- tLocalsess.set(session);
- }
- System.out.println("session.isOpen()===="+session.isOpen());
- } catch (HibernateException e) {
- e.printStackTrace();
- }
- return session;
- }
- /*
- * closing the thread-safe session 关闭session
- */
- public static void closeSession() {
- Session session = (Session) tLocalsess.get();
- tLocalsess.set(null);
- try {
- if (session != null && session.isOpen()) {
- session.close();
- }
- } catch (HibernateException e) {
- }
- }
- /*
- * begin the transaction 开始事务
- */
- public static void beginTransaction() {
- Transaction tx = (Transaction) tLocaltx.get();
- try {
- if (tx == null) {
- tx = currentSession().beginTransaction();
- tLocaltx.set(tx);
- }
- } catch (HibernateException e) {
- }
- }
- // close the transaction 关闭事务
- public static void commitTransaction() {
- Transaction tx = (Transaction) tLocaltx.get();
- try {
- if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack())
- tx.commit();
- tLocaltx.set(null);
- } catch (HibernateException e) {
- }
- }
- // for rollbacking 事务回滚
- public static void rollbackTransaction() {
- Transaction tx = (Transaction) tLocaltx.get();
- try {
- tLocaltx.set(null);
- if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
- tx.rollback();
- }
- } catch (HibernateException e) {
- }
- }
- private static Session openSession() throws HibernateException {
- return getSessionFactory().openSession();
- }
- private static SessionFactory getSessionFactory() throws HibernateException {
- return sessionFactory;
- }
- }
用于获取hibernate的session和事务处理,同时写了一个filter类,用于关闭session
笔者用的web服务器是tomcat,采用webwork+spring+hibernate+jbpm(如果你不是这样的,也具体不影响什么)
CloseSessionFilter.java
- package com.eway.framework.basecomponent.services.jbpm.util;
- import java.io.IOException;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- /**
- * Created by IntelliJ IDEA.
- * User: yuchen
- * Date: 2008-11-26
- * Time: 13:10:04
- * To change this template use File | Settings | File Templates.
- */
- public class CloseSessionFilter implements Filter {
- Log log = LogFactory.getLog(this.getClass());
- protected FilterConfig config;
- public void init(FilterConfig config) throws ServletException {
- this.config = config;
- }
- public void doFilter(
- ServletRequest request,
- ServletResponse response,
- FilterChain chain)
- throws IOException, ServletException {
- try {
- chain.doFilter((HttpServletRequest) request, (HttpServletResponse) response);
- }
- finally {
- try {
- HibernateUtil.closeSession();
- log.debug("close session success");
- }
- catch (Exception e) {
- HibernateUtil.rollbackTransaction();
- log.debug("can not close session!\nerrors:" + e.getMessage());
- }
- finally {
- HibernateUtil.closeSession();
- }
- }
- }
- public void destroy() {
- }
- }
这个需要在web.xml中配置一下
- <filter>
- <filter-name>closeHibernateSessionFilter</filter-name>
- <filter-class>com.eway.framework.basecomponent.services.jbpm.util.CloseSessionFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>closeHibernateSessionFilter</filter-name>
- <url-pattern>/jbpm/*</url-pattern>
- </filter-mapping>
JbpmBaseJdbcDAO .java负责处理查询,根据传来的sql,page,和参数进行查询,并返回查询结果
- package com.eway.framework.basecomponent.services.jbpm.util;
- import org.hibernate.Session;
- import org.hibernate.Query;
- import org.hibernate.HibernateException;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import java.util.List;
- import java.util.Map;
- import java.util.HashMap;
- /**
- * Created by IntelliJ IDEA.
- * User: yuchen
- * Date: 2008-11-24
- * Time: 17:26:16
- * To change this template use File | Settings | File Templates.
- */
- public class JbpmBaseJdbcDAO {
- private Page page;
- private Session hibernateSession;
- /**
- * 默认构造器
- */
- public JbpmBaseJdbcDAO() {
- this.page = null;
- this.hibernateSession = HibernateUtil.currentSession(); //当前的hibernate会话
- }
- /**
- * 带参构造器
- *
- * @param pageSize
- * @param currentPage
- * @param recordCount
- */
- public JbpmBaseJdbcDAO(int pageSize, int currentPage, int recordCount) {
- page = new Page();
- page.setRecordCount(recordCount);
- page.setCurrentPage(currentPage);
- page.setPageSize(pageSize);
- this.hibernateSession = HibernateUtil.currentSession(); //当前的hibernate会话
- }
- /**
- * @param page
- */
- public JbpmBaseJdbcDAO(Page page) {
- this.page = page;
- }
- /*
- * 根据sql,参数查询出结果
- * @param sql
- * @param parameterMap
- * @return
- */
- public List<Object> findByOutQuery(String sql, Map<String, Object> parameterMap) {
- Query query = null;
- List list = null;
- try {
- log.info("hibernateSession.isOpen()====" + hibernateSession.isOpen());
- boolean issql = sql.indexOf("from") != -1;//sql中包含字符串 “from”
- if (issql)
- query = hibernateSession.createQuery(sql); //查询对象
- else
- query = hibernateSession.getNamedQuery(sql); //查询对象
- if (this.page != null) {
- page.setRecordCount(this.getTotalCount(sql, parameterMap));
- int pageSize = page.getPageSize();//每页显示的条数
- int firstResult = page.getFromIndex();//从第多少条记录开始查询
- if (pageSize > 0 && firstResult > 0) {
- query.setFirstResult(firstResult);
- query.setMaxResults(pageSize);
- }
- }
- parameterMap = parameterMap == null ? new HashMap() : parameterMap;
- for (String key : parameterMap.keySet()) { //对查询条件进行迭代
- if (key != null && !"".equals(key)) {
- Object value = parameterMap.get(key);
- if (value != null) {
- query.setParameter(key, value); //加入查询条件
- }
- }
- }
- list = query.list();
- } catch (HibernateException e) {
- log.error("method--[findByOutQuery] throws HibernateException" + e.getMessage());
- e.printStackTrace();
- }
- return list;
- }
- /**
- * 根据sql,参数和页码查询出结果
- *
- * @param sql
- * @param parameterMap
- * @param page
- * @return
- */
- public List<Object> findByOutQuery(String sql, Map<String, Object> parameterMap, Page page) {
- this.page = page;
- return this.findByOutQuery(sql, parameterMap);
- }
- /**
- * 根据sql,参数和页码查询出结果
- *
- * @param sql
- * @param parameterMap
- * @param pageSize
- * @param currentPage
- * @param recordCount
- * @return
- */
- public List<Object> findByOutQueryAndPage(String sql, Map<String, Object> parameterMap, int pageSize, int currentPage, int recordCount) {
- page = new Page();
- page.setRecordCount(recordCount);
- page.setCurrentPage(currentPage);
- page.setPageSize(pageSize);
- return this.findByOutQuery(sql, parameterMap);
- }
- /**
- * 取到总共的条数
- *
- * @param sql
- * @param parameterMap
- * @return
- */
- private Integer getTotalCount(String sql, Map<String, Object> parameterMap) {
- Integer amount = 0;
- Query query = null;
- try {
- boolean issql = sql.indexOf("from") != -1;//sql中包含字符串 “from”
- if (!issql) {
- query = hibernateSession.getNamedQuery(sql);
- sql = query.getQueryString();
- }
- int sql_index = sql.indexOf(" from");
- String countStr = "select count(*) " + sql.substring(sql_index);
- query = hibernateSession.createQuery(countStr); //查询对象
- parameterMap = parameterMap == null ? new HashMap() : parameterMap;
- for (String key : parameterMap.keySet()) { //对查询条件进行迭代
- if (key != null && !"".equals(key)) {
- Object value = parameterMap.get(key);
- if (value != null) {
- query.setParameter(key, value); //加入查询条件
- }
- }
- }
- List list = query.list();
- if (!list.isEmpty()) {
- Object count = list.get(0);
- amount = Integer.parseInt(count.toString());
- }
- } catch (HibernateException e) {
- log.error("method--[getTotalCount] throws HibernateException" + e.getMessage());
- e.printStackTrace();
- }
- return amount;
- }
- private static Log log = LogFactory.getLog(JbpmBaseJdbcDAO.class);
- //getter and setter method
- public Page getPage() {
- return page;
- }
- public void setPage(Page page) {
- this.page = page;
- }
- }
那么谁来调用
JbpmBaseJdbcDAO .java呢?
有下面的接口提供给用户使用
- package com.eway.framework.basecomponent.services.jbpm;
- import com.eway.framework.basecomponent.services.jbpm.util.Page;
- import java.util.Collection;
- import java.util.List;
- /**
- * Created by IntelliJ IDEA.
- * Author: xinpeng
- * Date: 2008-10-21
- * Time: 11:08:14
- * To change this template use File | Settings | File Templates.
- */
- public interface JbpmWorklistQueryService {
- public Collection<TaskInstanceDTO> queryToSignInListByPage(String userId,Page page);
- public List queryTodoListByPage(String userId, Page page);
- public Collection<TaskInstanceDTO> queryCompletedListByPage(String userId, Page page);
- }
可以看到方法public List queryTodoListByPage(String userId, Page page);正是我们所需要的
根据参与者和page对象可以取到当前参与者的对应page的待办列表
JbpmWorklistQueryServiceImpl.java是此接口的实现类
- package com.eway.framework.basecomponent.services.jbpm;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import java.math.BigDecimal;
- import java.util.*;
- import com.eway.framework.basecomponent.services.jbpm.util.Page;
- import com.eway.framework.basecomponent.services.jbpm.util.JbpmBaseJdbcDAO;
- /**
- * Created by IntelliJ IDEA.
- * Author: xinpeng
- * Date: 2008-10-21
- * Time: 11:08:37
- * To change this template use File | Settings | File Templates.
- */
- public class JbpmWorklistQueryServiceImpl implements JbpmWorklistQueryService {
- private static final Log log = LogFactory.getLog(JbpmWorklistQueryServiceImpl.class);
- public Collection<TaskInstanceDTO> queryToSignInListByPage(String userId, Page page) {
- //todo:改为分页的实现
- Collection<TaskInstanceDTO> todoList = new ArrayList<TaskInstanceDTO>();
- return todoList;
- }
- /**
- * 取到待办列表
- */
- public List queryTodoListByPage(String userId, Page page) {
- List todoList = new ArrayList();
- String sqlPath = "TaskMgmtSession.findTaskInstancesByActorId";
- JbpmBaseJdbcDAO baseJdbcDao = new JbpmBaseJdbcDAO();
- Map paraMap = new HashMap();
- paraMap.put("actorId", "admin");
- todoList = baseJdbcDao.findByOutQuery(sqlPath, paraMap, page);
- //
- // String sql = "select * from JBPM_TASKINSTANCE a where a.actorId_=? and a.isSuspended_ = ? and a.isOpen_ = ? and a.start_ is not null order by a.START_ desc";
- // Object[] args = new Object[]{userId, false, true};
- // List lstResultMap = baseJdbcDAO.findByOutQuery(sql, args);
- // for (Object mapItem : lstResultMap) {
- // Map map = (Map) mapItem;
- // String name = (String) map.get("NAME_");
- // log.debug("name = " + name);
- // TaskInstanceDTO taskInstance = new TaskInstanceDTO();
- // BigDecimal big = (BigDecimal) map.get("ID_");
- // taskInstance.setId(big.longValue());
- // taskInstance.setName(name);
- // taskInstance.setActorId((String) map.get("ACTORID_"));
- // taskInstance.setStart((Date) map.get("START_"));
- // taskInstance.setTokenId(((BigDecimal) map.get("TOKEN_")).longValue());
- // taskInstance.setTaskId(((BigDecimal) map.get("TASK_")).longValue());
- // taskInstance.setTaskMgmtInstanceId(((BigDecimal) map.get("TASKMGMTINSTANCE_")).longValue());
- // //taskInstance.setSwimlaneInstanceId(((BigDecimal)map.get("SWIMLANINSTANCE_")).longValue());
- // todoList.add(taskInstance);
- // }
- // log.info("todoList==" + todoList);
- return todoList;
- }
- /**
- * 取到办结列表
- * @param userId
- * @param page
- * @return
- */
- public Collection<TaskInstanceDTO> queryCompletedListByPage(String userId, Page page) {
- //todo:改为分页的实现
- JbpmBaseJdbcDAO jbpmBaseJdbcDAO = new JbpmBaseJdbcDAO();
- Collection<TaskInstanceDTO> completedList = new ArrayList<TaskInstanceDTO>();
- return completedList;
- }
- }
这样在客户端,,对此接口的方法进行调用就可以分页了。。
下面是客户端调用的代码
当然也是用webwork的一个action进行访问
webwork的具体配置就省去了,相信大家已经很熟悉了
JbpmAction.java中的获取待办列表的方法todoList 对待办列表进行了调用。
- package com.mycompany.jbpm.action;
- import com.eway.framework.basecomponent.services.jbpm.util.IDeployJbpmProcessService;
- import com.eway.framework.basecomponent.services.jbpm.util.Page;
- import com.eway.framework.basecomponent.services.jbpm.JbpmProcessDefinitionService;
- import com.eway.framework.basecomponent.services.jbpm.JbpmProcessInstanceService;
- import com.eway.framework.basecomponent.services.jbpm.JbpmWorklistQueryService;
- import com.opensymphony.webwork.ServletActionContext;
- import java.util.List;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.jbpm.taskmgmt.exe.TaskInstance;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- * Created by IntelliJ IDEA.
- * User: yucehn
- * Date: 2008-11-25
- * Time: 17:20:01
- * To change this template use File | Settings | File Templates.
- */
- public class JbpmAction {
- private String processName;
- private IDeployJbpmProcessService ideployJbpmProcessService;//流程发布
- private JbpmProcessDefinitionService jbpmProcessDefinitionService;//流程定义服务
- private Page page = new Page();
- private int currentPageNum;
- private List jbpmProcessDefinitionList;
发表评论
-
开放流程用户组
2009-04-02 22:54 1061开放流程用户组与2009年3月28日在beijing open ... -
修改jpdl加入流程表单和任务表单,表单权限控制,一些构思和草图。
2008-12-05 11:17 1156jpdl3.1未改之前(流 ... -
对jbpm提供了扩展,大家可以直接用我的包,轻松的取出各种列表,待办,已办,办结,待签,已签
2008-12-05 15:46 1785对jbpm提供了扩展,大家可以直接用我的包,轻松的取出各种列表 ... -
从jbpm3.1.2到jbpm3.2.3
2008-12-12 10:40 1933笔者以前用的jbpm3.1.2。。。 使用jbpm的hiber ... -
扩展jbpm的一个大纲
2008-12-16 10:08 18801. 会签 简单描述:多人对同一任务进行审核,每人处理后方 ... -
全局事务jta小探(三)
2009-04-02 22:17 1101附录: <%@page contentType= ... -
全局事务jta小探(二)
2009-04-02 22:12 1793对应设置的xml <jdbc-connect ... -
全局事务jta小探(一)
2009-04-02 22:09 2202JTA事务 环境介绍 整合前 ... -
需求管理DOORS如何和java交互,希望有个jar适配器
2009-01-06 11:06 2408目前遇到一个项目,客户用了doors(c语言写的)实现需求管理 ...
相关推荐
【jbpm与OA项目(六).pdf】...综上所述,该文档详细介绍了在Web开发中实现分页功能的方法,并预告了对JBPM审批流程管理的学习路径。理解并掌握这两个知识点,将有助于开发者在实际项目中构建更高效、用户友好的系统。
2. **分页问题**:基于第1个问题的解决方案,可以在自定义的Hibernate查询基础上实现分页功能。 3. **统计流程实例状态**:可以通过查询JBPM系统表中的流程实例来统计各个流程实例的状态。另一种方法是在业务表中...
遗憾的是,由于提供的文本中包含的特殊字符和分页信息,无法直接解读具体的流程图细节,但以上概述了jbpm实现的核心概念和流程,希望能帮助理解jbpm的工作原理。对于更详细的流程图分析,建议参考原始的doc文档。
同时,该工程师还实现了分页优化、JBPM 工作流引入和自定义标签设计等功能。 在迅达商贸管理系统中,该工程师主要负责开发基于 Struts2、Spring、Hibernate 的系统,实现了快速高效协作和异地网上办公。
传智播客的OA系统(改写版),使用Struts2,spring,hibernate,jbpm整合,系统包含了三大模块,分别是:系统管理,站内消息,审批流转。系统管理中还包含了权限分配,其中有很多技术点,比如,jquery的页面验证,强大的...
他还利用ThreadLocal实现页面分页,JSTL和自定义函数处理JSP页面,DWR处理授权,JBPM实现工作流程,Freemarker进行动态表单设计,Quartz用于任务调度,如考勤管理和工资计算。他在项目中负责系统分析设计、分页组件...
例如,Web OA系统使用了MyEclipse、Oracle和Tomcat,结合Struts+Hibernate+Spring架构,使用ThreadLocal实现分页,JSTL和自定义函数处理JSP页面,DWR进行授权,JBPM实现公文流转,Quartz处理任务调度,Freemarker...
求职者在此项目中负责DAO模式和工厂模式的设计,以及分页组件、流向单维护等模块的开发,使用了JSP + JavaBean架构,并应用Ajax技术。 - **基于小波分解的数字图像水印嵌入和提取**:这是科研性质的项目,求职者...
- 在多个项目中,工程师展现了其在实际应用中的技能,例如使用Struts+Hibernate+Spring的多层架构,对ThreadLocal模式、JSTL、DWR、JBPM、Freemarker、Quartz等技术的掌握,这体现了他在企业级应用开发中的实战经验...
- DaoSupport用于通用的DAO操作,封装分页功能,并使用自定义泛型。 - 文件上传下载通过IO和特定库如JSPSmartUpload、Spring的POI实现。 这份简历展示了应聘者扎实的Java Web开发基础,丰富的框架使用经验以及...
数据库 Redis、服务器 Nginx、分布式系统 Hadoop、SSH2 框架、MySql、Sqlserver、Oracle、Eclipse/MyEclipse、SVN、CVS、VSS、Java 基础技术 Jsp、Servlet、Jdbc、JavaScript、Ajax、JQuery、JBPM、PowerDesigner、...
1. 实现了分页优化,利用面向对象原则提高了代码复用性和可读性。 2. 引入了JBPM工作流引擎,提升了物流配送流程的效率,实现自动化流程控制。 3. 设计了自定义标签,根据角色权限动态生成页面菜单,增强了权限管理...
8. **设计原则与模式**:在分页功能的设计中,遵循面向对象的五大原则,实现了接口抽象,提高了代码的复用性和可读性。此外,使用自定义标签和权限管理模型,展示了灵活应对业务需求的能力。 9. **权限与安全**:...
- **分页技巧**:了解如何在Servlet、Hibernate和Spring等不同技术栈中实现分页功能。 - **错误处理**:处理常见的404、500错误,并自定义错误页面。 #### 前端技术心得 - **动画效果**:使用CSS3动画或JavaScript...
* 使用 Hibernate 实现持久化层,使用泛型 DAO 封装添/删/改/查/分页/统计这些操作 * 实现细粒度权限管理使用 Struts2 中提供的拦截器实现对 Action 方法的拦截 * 粗粒度权限管理使用 Filter 实现 * 使用 Java、...
在Java项目中,公共模块的提取可以使用Struts、Spring、Hibernate、JBPM、Ajax、JSP等技术。这些技术可以帮助开发者快速构建项目,并提供了许多有用的功能,例如Struts的MVC框架、Spring的依赖注入、Hibernate的对象...