gpt4 book ai didi

java - 我应该在 Struts2 View 层检索数据库记录吗?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:48:41 25 4
gpt4 key购买 nike

我有一个编辑页面,我想在其中从数据库中检索主题级别,并显示为选择选项供用户编辑类(class) .

当提交表单时,它会发出一个新的请求,用户输入被 courseBean 捕获并进行 XML 验证。当 XML 验证失败时,它将转发 courseBean,该 courseBean 刚刚捕获到 edit.jsp 的用户输入。

enter image description here

所以每次我访问 edit.jsp 时,我都会检索数据库记录。我应该那样做吗?

此外,我尝试检索subject litlevel lit 并将它们作为请求属性存储在显示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>

最佳答案

使用 Struts2,您将不需要使用 Scriptlet s ( <% stuff %> ) 了。它们又旧又坏,它们是在 View 页面中注入(inject)的业务逻辑,不要使用它们。您也不需要 JSTL,只需使用 Struts2 标签即可实现任何结果。

为了更好地解耦和分离代码和概念,您应该:

  1. DAO Layer : 它只做简单的查询;
  2. BUSINESS Layer : 它通过 Service 公开 DAO 层结果(s),聚合多个 DAO 调用并在需要时执行多个业务操作;
  3. PRESENTATION Layer :Actions,在Struts2中充当模型;在这里您从业务层调用服务,以检索 JSP 所需的对象;
  4. JSP (VIEW Layer) : JSP 包含纯 HTML,并通过操作的访问器 (Getter) 访问所需的数据,并最终访问值堆栈中的任何其他所需元素( #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>

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

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

如果一开始分离所有层太困难,在Actions中压平前三层,只是为了了解如何分离Java(Action)和Struts2 UI Tags(JSP)。 理解后,您可以将 DAO 逻辑移动到业务层,最好移动到 EJB 中。当实现这一目标时,以更细粒度再次拆分...

Action 将是这样的:

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 会将请求转发到 INPUT 类型结果中映射的 JSP,而不会到达 execute() 方法,因此您应该从 Action 实现 Preparable 接口(interface)并将加载内容放入 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 提供了一些强大的支持...

关于java - 我应该在 Struts2 View 层检索数据库记录吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13833456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com