该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-12-14
bjwulin 写道 环境:
现在遇到的下列问题: 1、我的PO都是按照对象关系来建立的,因此用hibernate查询的时候,一个查询竟然涉及到9个表,有可能是A和B、c有关系,而B又和D有关系,等等。这样一个很长的left join,我觉得对效率有很大的影响。 我想hibernate级连的深度是可以设定的,你如果需要eager fetch数据的话,那么可以设定一下级连的深度。而且使用lazy="true"加上cache也可以避免你的问题哦。 bjwulin 写道 2、用Struts,用ActionForm做VO,就存在转换的问题,因为PO是面向对象的,而ActionForm是和表现对应的,一般来说我都将几个PO要显示的属性合成一个ActionForm,这样就带来了转换的问题,麻烦!!!用BeanUtils的copy,又出现问题,lazy initiation错误,尽管我不copy lazy的属性。于是我只有封装BeanUtils,指定那些不用copy,那些要copy的。还有PO的hashcode(),我只有将非lazy=true的属性写到hashcode中。 尝试一下webwork的model driven Action。 bjwulin 写道 3、从ActionForm到PO时,还有个问题,就是ActionForm的信息不全,我通常只有从数据库Load一个对象,然后在copy属性,然后在dao.save(obj)。这样的效率有没有影响? 这些显然是struts form bean的失败之处。呵呵,解决同上。 bjwulin 写道 4、因为将事务交给Spring 容器管理,因此,一些需要共享事务的原子操作,我就只有利用HibernateCallback对象,将一个大操作的select ,delete,insert ,update都放在callback里面,我不知道有没有比这更好的方式? 呵呵,变成可配置的事务似乎会降低某些事务操纵的灵活性。但是这些原子操作为什么不用spring提供的事务管理功能进行管理呢?尽管一个方法本身就是一个事务。 |
|
返回顶楼 | |
发表时间:2004-12-21
既然已经使用spring,就应该放弃struts,特讨厌的struts,标签库复杂得偏教我连struts都不曾认真把它学会!
spring本身也是mvc,spring的FormController类似于struts的Action,而ActionForm在springframework里消失了,spring可以把任何java类绑定为ActionForm(它实际的名字叫做command)。spring比struts还多了一个MultiActionController,对于点击一个链接这样的Action,映射到MultiActionController的其中一个Handler就可以了。 struts的标签库复杂,在springframework里面只用jstl再加上spring的taglib就基本解决所有view层的问题。 在spring里面里假如用spring的MVC的话(也就是使用spring的controller、validator),建议不使用dto,把bo当成dto使用很方便,spring可以绑定任何的java类做为表单绑定,这比struts绑定的表单只能派生自ActionForm要高明多了,老抱着struts不放的人可要清醒了。 例如,编辑一个student: public class EditStudentFC extends SimpleFormController{ public EditStudentFC ();{ //声明绑定表单的command的Class this.setCommandClass(Student.class);; } protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors); throws Exception { Student student = (Student); command; this.getStudentDao();.store(student);; return new ModelAndView("");; } /**backing 一个student给view层编辑,这个student你可以当成bo或po或ActionForm或dto。 **/ protected Object formBackingObject(HttpServletRequest request); throws Exception { String id=(String);request.getParameter("studentId");; Student student=(Student); this.getStudentDao();.load(id);; return student; } } jsp绑定: 在这里我们只绑定name,id没绑定,也没设置<input name="id" type="hidden" value='<c:out value="${command.id}" />'>,但spring还能把id原原本本的发回给onSubmit的command,在这里就不存在把dto转换为po的问题,直接保存这个command也就等同于保存po了。 <FORM method="post"> name: <spring:bind path="command.name"> <INPUT type="text" name="name" value='<c:out value="${status.value}" />' /> <!-- 显示错误信息 --> <FONT color=#ff000> <c:out value="${status.errorMessage}" /> </FONT> </spring:bind> <p> <INPUT type="submit" value="Edit Student"> </FORM> 至于在一个页面同显示不能使用bo的情形,那只能做dto了,而且这种dto的设计也有技巧:首先考虑使用继承。例如,要显示的Student有一个计算属性totalCourse(课程总数),要做它的DTO: public class StudentDto extends Student{ private int totalCourse; public int getTotalCourse();{ ... } public void setTotalCourser(int totalCourser);{ ... } } 这样再配合你们写的BeanUtil.copy就简单些了。 对于显示多张表的数据的情形,spring更擅长: protected Map referenceData(HttpServletRequest request); throws Exception { Map model = new HashMap();, referenceData = new HashMap();; School school=schoolDao.load(schoolId);; //由于lazy=true,所以这里强行加载students,每一个student的courses Student students=studentDao.findBySchool(schoolId);; for(int i=0;i<students.size();;i++);{ Student stu=(Student);students.get(i);; Courser courses=courseDao.findByStudent(stu.getId(););; Studnet.setCourses(courses);; } school.setStudents(students);; model.put("school",school);: referenceData.put("model", model);; return referenceData; } jsp显示: 为了让做美工的能看得清楚从controller传过来的数据,我在jsp头部注释加这样标明: model{ School school{ List<Student> students{ Student student{ List <Course> courses{ Courser courser; } } } } } 这样做目的是最大可能防止lazy load的异常--因为约定:对于父类的子类的列表,在这里明确标明加载了才使用(例如使用model.school.students)。 我曾使用这种方法把4张表的数据同时发送给jsp页面显示--当然数据量不大,主要是引用子表的信息。 School:<c:out value="${model.school.name}" /> <br> Students: <br> <c:forEach items="${model.school.students}" var="student"> Student: <c:out value="${student.name}" /><br> <br> Coursers: <c:forEach items="${student.coursers}" var="course"> <c:out value="${courser.name}" /><br> </c:forEach> </c:forEach> --------------------- 感觉jstl好像就是为spring 的controller和hibernate定制的 |
|
返回顶楼 | |
发表时间:2005-02-03
to 大愚弱智
比如 <INPUT class=input name=username size=30 value="${form.username}"> 和直接访问一个url内有&username= spring在html表单上的绑定对url后同名参数有效率吗? 如果无效...不用也罢 我一直使用spring,form绑定是根据form内的set方法映射request的parameters. controller用最上层的,simpleFormController总觉得不够灵活 |
|
返回顶楼 | |
发表时间:2005-02-25
alin_ass 写道 to 大愚弱智
比如 <INPUT class=input name=username size=30 value="${form.username}"> 和直接访问一个url内有&username= spring在html表单上的绑定对url后同名参数有效率吗? 如果无效...不用也罢 搞不明白你想问啥子问题? alin_ass 写道 to 大愚弱智
我一直使用spring,form绑定是根据form内的set方法映射request的parameters. controller用最上层的,simpleFormController总觉得不够灵活 SimpleFormController源自AbstractFormController,实际上最灵活的,你要首先读懂这两个类的文档,最重要的是它的WorkFlow说明,要不然,把它当初Servlet来用好没意思。 |
|
返回顶楼 | |
发表时间:2005-06-29
引用 struts的标签库复杂
这我不太同意,struts在一些方面确实不够灵活,但是就标签库来说,复杂度还是可以接受的。一般的表现层的任务都可以轻松的完成,困难一点的和html嵌套完成。 还有关于po的使用问题,如果从view层一直到dao使用的是同一个东西的话会不会加大各层之间的耦合,对以后可能存在的扩展(比如:从单一系统转到分布式)造成不便? |
|
返回顶楼 | |