我应该在Struts2视图层检索数据库logging吗?

我有一个编辑页面,我想从数据库中检索主题关卡 ,并显示为用户编辑课程的选项。

当表单被提交时,它会发起一个新的请求,用户input被courseBean用XMLvalidation捕获。 当XMLvalidation失败时,它将使用刚刚捕获用户input到edit.jspcourseBean进行转发。

在这里输入图像描述

所以每次去edit.jsp ,我都会检索数据库logging。 我应该这样做吗?

此外,我试图检索主题点亮水平亮 ,并将它们作为请求属性存储在第一次显示edit.jsp的操作类中。 但是,当新的请求是从用户input,从数据库检索到的主题列表级别列表将不再可用。

代码(edit.jsp):

<% Session session2 = HibernateUtil.getSessionFactory().getCurrentSession(); Transaction tx = session2.beginTransaction(); Query q = session2.createQuery("from Subject"); List subjectList = q.list(); List levelList = session2.createQuery("from Level").list(); %> <div class="control-group"> <label class="control-label" for="inputPassword">Subject</label> <div class="controls"> <select name="subject_id"> <% for (Object subjectObject : subjectList) { Subject subject = (Subject) subjectObject; %> <option value="<%=subject.getId()%>"><%=subject.getName()%></option> <% } //end for %> </select> </div> </div> <div class="control-group"> <label class="control-label" for="inputPassword">Level</label> <div class="controls"> <select name="level_id"> <% for (Object levelObject : levelList) { Level level = (Level) levelObject; %> <option value="<%=level.getId()%>"><%=level.getName()%></option> <% } //end for %> </select> </div> </div> 

使用Struts2你不再需要使用Scriptlet<% stuff %> )。 他们是老的,坏的,他们是在查看页面注入的业务逻辑,不要使用它们。 你不需要JSTL,只要使用Struts2标签就可以达到任何效果。

为了更好的解耦和代码和概念的分离,你应该有:

  1. DAO Layer :它只是简单的查询;
  2. BUSINESS Layer :它通过Service公开DAO层结果,聚合多个DAO调用,并在需要时执行多个业务操作;
  3. PRESENTATION Layer :Struts2中的Actions,作为模型; 在这里您可以从业务层调用服务来检索JSP所需的对象;
  4. JSP (VIEW Layer) :JSP包含纯HTML,并通过Action的访问器(Getters)访问所需的数据,最终访问Value Stack( #session#session等)中的其他所需元素。

    在你的例子中,所有这一切

 <% Session session2 = HibernateUtil.getSessionFactory().getCurrentSession(); Transaction tx = session2.beginTransaction(); Query q = session2.createQuery("from Subject"); List subjectList = q.list(); List levelList = session2.createQuery("from Level").list(); %> 

应该在DAO / Business Layers中,通过getSubjectList();两个函数暴露出来getSubjectList();getLevelList(); 。 然后在你的行动中,你应该有这样的东西:

 public class YourAction { private List<Object> levelList; // private private List<Object> subjectList; // private public String execute() throws Exception { // Call the service, load data levelList = getMyService().getLevelList(); subjectList = getMyService().getSubjectList(); // Forwarding to the JSP return SUCCESS; } public List<Object> getLevelList() { return levelList; } public List<Object> getSubjectList() { return subjectList; } } 

并在你的JSP中,而不是:

 <select name="subject_id"> <% for (Object subjectObject : subjectList) { subject subject = (Subject) subjectObject; %> <option value="<%=subject.getId()%>"><%=subject.getName()%></option> <% } //end for %> </select> 

你像访问列表(丑陋混合的HTML / Struts2方式):

 <select name="subject_id"> <s:iterator value="subjectList"> <option value="<s:property value="id"/>"> <s:property value="name"/> </option> </s:iterator> </select> 

或者在Select的情况下,使用适当的Struts2 UIselect标签:

 <s:select name = "subject_id" list = "subjectList" listKey = "id" listValue = "name" /> 

如果在开始时分离所有的图层太困难了,那么可以将Actions中的前三个级别扁平化,以了解如何区分Java(Action)和Struts2 UI标签(JSP)。 理解之后,您可以将DAO逻辑移至业务层,最好移至EJB中。 当达到那个时候,再细分一次

行动将是这样的东西:

 public class YourAction { private List<Object> levelList; // private private List<Object> subjectList; // private public String execute() throws Exception { Session session2 = HibernateUtil.getSessionFactory().getCurrentSession(); Transaction tx = session2.beginTransaction(); Query q = session2.createQuery("from Subject"); subjectList = q.list(); levelList = session2.createQuery("from Level").list(); // Forwarding to the JSP return SUCCESS; } public List<Object> getLevelList() { return levelList; } public List<Object> getSubjectList() { return subjectList; } } 

关于多重加载列表的问题,如果列表是固定的(例如每个月更改一个),则可以使用caching(如果使用计时器,那么可以更好),或者每次加载一个caching,这样做没有问题那。 请注意,如果validation失败,ValidationInterceptor会将请求转发给映射到INPUTtypes结果的JSP,而不会到达execute()方法,所以您应该从Action实现Preparable接口,并将加载的东西放入prepare()方法, PrepareInterceptor每次执行

 public class YourAction implements Preparable { private List<Object> levelList; // private private List<Object> subjectList; // private public void prepare() throws Exception { // Call the service, load data, // every time even if validation fails levelList = getMyService().getLevelList(); subjectList = getMyService().getSubjectList(); } public String execute() throws Exception { // Forwarding to the JSP return SUCCESS; } public List<Object> getLevelList() { return levelList; } public List<Object> getSubjectList() { return subjectList; } } 

继续步骤,框架是容易和强大的,networking有很多的例子和StackOverflow提供了一些很好的支持…

你需要的是一个caching。 但是,如果数据库logging必然频繁更改,那么这是不可取的。

但是,如果问题的查询很小(我认为是这样),查询数据库不应该是一个很大的性能问题。

在另一个说明中,我看到的所有JSP都被弃用,并滥用了JSP脚本。

既然你已经添加了标签struts 2,我将假设这是一个struts 2 web项目。 考虑(强烈)使用内置的struts UI标签来完成你在脚本中完成的工作。

你的方法只能被描述为当你拥有一个核反应堆时,使用一堆发电机来驱动一座城市。

我build议你从这里开始: http : //struts.apache.org/2.x/docs/home.html

这将给你一个框架的适当的想法和它的全部function。

一个build议,如果你想坚持MVC架构,那么从来没有视图中的业务逻辑。 根据MVC架构,使用View的UI工程师根本不需要了解业务逻辑。

在JSP页面中混合使用HTML和Java代码会使View复杂化,并会在维护代码时造成问题。

使用这个教程来看看如何在Struts 2中实现CRUD操作。