我应该找回在Struts2视图层数据库记录?(Should I retrieve database

2019-07-04 23:58发布

我有我想从数据库中检索科目水平 ,并显示用户的选择选项编辑过程中编辑页面。

当提交表单时,就会使一个新的请求,用户输入与XML验证courseBean抓获。 当XML验证失败,它会与刚刚捕获的用户输入edit.jsp文件courseBean转发。

所以每次我去edit.jsp文件的时候,我会检索数据库记录。 我应该做的呀?

此外,我试图找回点燃点燃级主题 ,并将它们存储在其中在第一时间显示edit.jsp文件的动作类的请求属性。 但是,当新的请求从用户输入制作,从数据库中检索的主题列表级别列表将不再可用。

码(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>

Answer 1:

使用Struts2的你将不再需要使用Scriptlet秒( <% stuff %>了)。 他们是老,坏,他们在查看页面注入业务逻辑,不使用它们。 你不需要JSTL没有,只是用Struts2的标签就可以实现任何结果。

对于代码和概念更好的去耦和分离,你应该有:

  1. DAO Layer :它只是普通的查询;
  2. BUSINESS Layer :它暴露通过DAO层导致Service (S),聚合多个DAO调用并在必要时进行一些业务操作;
  3. PRESENTATION Layer :该操作,即在Struts2充当模型; 在这里,你从业务层调用服务,以获取由JSP所需的对象;
  4. JSP (VIEW Layer) :该JSP包含普通的HTML,并访问通过行动的访问者(吸气剂)所需的数据,并最终从所述值栈(任何其他必要的元件#session#request等)。

    在你的榜样,这一切

 <% 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 /业务层,由两个函数等暴露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>

或者,在选择的情况下,用适当的Struts2的UI选择标签:

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

如果分离所有的层一开始是太难了,压平在操作前三个级别,只是为了了解如何粘虫的Java(行动)和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;
    }    
}

关于名单的多个装载你的问题,你可以使用一个高速缓存(如果有计时器更好),如果该列表是固定的(它改变了一个例如一个月),或每次加载它,有没有在做题那。 请注意,如果验证失败,ValidationInterceptor将转发在输入类型结果映射请求到JSP,没有达到execute()方法,所以你应该从行动落实制备的接口,并把装载的东西到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;
    }
}

按步骤进行,该框架是简单而强大,网络有大量的实例和StackOverflow上提供了一些很大的支持...



Answer 2:

你需要的是一个高速缓存。 但是,如果数据库中的记录也必然发生变化经常是不可取的。

然而,如果查询的问题是小(我认为是)查询数据库应该不会有大的性能问题。

在另一方面,看着你的JSP所有我看到的是过时和JSP scriplets的滥用。

既然你已经添加了标签Struts 2的我会认为这是一个Struts 2的Web项目。 考虑(强烈)使用内置的支柱UI标签在你scriplets所做的工作。

你的方法只能被描述为使用一堆发电机的,当你在您的处置有一个核反应堆提供动力的一个城市。

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

这会给你的框架的正确思路和它的全部功能。



Answer 3:

一个建议是,如果你想坚持到MVC架构则永远不会有业务逻辑视图。 根据MVC架构与谁查看工作UI工程师不用不知道业务逻辑可言。

在JSP页面中混用HTML和Java代码视图复杂化,并会导致维护代码的问题。

利用本教程来看看如何在Struts 2中实现CRUD操作。



文章来源: Should I retrieve database record in Struts2 view layer?