论坛首页 Java企业应用论坛

使用struts+spring+hibernate做项目的困惑。

浏览 47429 次
该帖已经被评为精华帖
作者 正文
   发表时间: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提供的事务管理功能进行管理呢?尽管一个方法本身就是一个事务。
0 请登录后投票
   发表时间: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定制的
0 请登录后投票
   发表时间:2005-02-03  
to 大愚弱智

比如
&lt;INPUT class=input name=username size=30 value="${form.username}"&gt;

和直接访问一个url内有&username=

spring在html表单上的绑定对url后同名参数有效率吗?
如果无效...不用也罢

我一直使用spring,form绑定是根据form内的set方法映射request的parameters.
controller用最上层的,simpleFormController总觉得不够灵活
0 请登录后投票
   发表时间:2005-02-25  
alin_ass 写道
to 大愚弱智

比如
&lt;INPUT class=input name=username size=30 value="${form.username}"&gt;

和直接访问一个url内有&username=

spring在html表单上的绑定对url后同名参数有效率吗?
如果无效...不用也罢



搞不明白你想问啥子问题?
alin_ass 写道
to 大愚弱智

我一直使用spring,form绑定是根据form内的set方法映射request的parameters.
controller用最上层的,simpleFormController总觉得不够灵活

SimpleFormController源自AbstractFormController,实际上最灵活的,你要首先读懂这两个类的文档,最重要的是它的WorkFlow说明,要不然,把它当初Servlet来用好没意思。
0 请登录后投票
   发表时间:2005-06-29  
引用
struts的标签库复杂

这我不太同意,struts在一些方面确实不够灵活,但是就标签库来说,复杂度还是可以接受的。一般的表现层的任务都可以轻松的完成,困难一点的和html嵌套完成。

还有关于po的使用问题,如果从view层一直到dao使用的是同一个东西的话会不会加大各层之间的耦合,对以后可能存在的扩展(比如:从单一系统转到分布式)造成不便?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics