今天是学习oa的第二天,学的知识点比较多,我做了笔记:
Service层设计:
1,先有get(Long),因为还想要获取其他对象(不是T),所以再定义一个get(Class, Long)
2, 为什么有get(Class, Long),但不加上以下两个方法呢?
<E> E delete(Class<E> clazz, Long id);
<E> List<E> findAll(Class<E> clazz);
可以加上,但是在程序中只使用到了get(Class, Long),所以就只定义了get方法。
3,为什么使用Long型的主键呢?也可以使用Serializable类型,因为Session.get()方法就是接受这个类型。
包 资源(类、接口等)
cn.itcast.oa.service.daosupport ServiceBase(原名为DaoBase)
ServiceImplBase(原名为DaoBaseImpl)
cn.itcast.oa.service Service的接口
Cn.itcast.oa.service.impl Service的实现类
说明: Service接口可以通过继承ServiceBase得到增删改查的方法声明。Service的实现类可以通过继承ServiceImplBase得到增删改查方法的实现。通过ServiceImplBase中的getSession()与getJbpmContext()方法可以方便的获得Session与JbpmContext。
使用反射获取类型参数的真实类型的代码如下:
public DaoBaseImpl () {
Type type = this.getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) type;
this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
}
事务管理:
使用过滤器加 ThreadLocal 实现
因为Session可以通过JbpmContext.getSession()获得,所以只需管理 JbpmContext即可;过滤器拦截*.do的请求。
一个请求(线程)使用同一个JbpmContext 如果请求中没有使用JbpmContext或Session,就不要创建JbpmContext。
在过滤器中关闭JbpmContext时,也要调用 ThreadLocal.remove(),因为Web容器有线程池,就是两次请求有可能是使用的同一个线程。
JbpmContextFilter中的相关代码:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException {
try {
chain.doFilter(request, response);
} catch (Exception e) {
JbpmContext jc = JbpmContextUtils.getJbpmContext(false);
if (jc != null) {
jc.setRollbackOnly();
}
throw new ServletException(e);
} finally {
JbpmContextUtils.closeAndRemoveCurrentJbpmContext();
}
}
每个业务方法是做一件事,应使用同一个事务
1, 一个请求是一个线程
2, Web容器有线程池,所以先后的两次请求,有可能使用的是同一个线程
1. JbpmContextUtils
2. JbpmContextFilter
解决提交的表单内容的中文乱码:
所有的页面都将使用utf-8编码,所以提交的表单内容也是utf-8编码。
在过滤器中设置request的编码为utf-8:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
chain.doFilter(request, response);
}