我有我想从数据库中检索科目和水平 ,并显示用户的选择选项编辑过程中编辑页面。
当提交表单时,就会使一个新的请求,用户输入与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>
使用Struts2的你将不再需要使用Scriptlet
秒( <% stuff %>
了)。 他们是老,坏,他们在查看页面注入业务逻辑,不使用它们。 你不需要JSTL没有,只是用Struts2的标签就可以实现任何结果。
对于代码和概念更好的去耦和分离,你应该有:
-
DAO Layer
:它只是普通的查询; -
BUSINESS Layer
:它暴露通过DAO层导致Service
(S),聚合多个DAO调用并在必要时进行一些业务操作; -
PRESENTATION Layer
:该操作,即在Struts2充当模型; 在这里,你从业务层调用服务,以获取由JSP所需的对象; 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上提供了一些很大的支持...
你需要的是一个高速缓存。 但是,如果数据库中的记录也必然发生变化经常是不可取的。
然而,如果查询的问题是小(我认为是)查询数据库应该不会有大的性能问题。
在另一方面,看着你的JSP所有我看到的是过时和JSP scriplets的滥用。
既然你已经添加了标签Struts 2的我会认为这是一个Struts 2的Web项目。 考虑(强烈)使用内置的支柱UI标签在你scriplets所做的工作。
你的方法只能被描述为使用一堆发电机的,当你在您的处置有一个核反应堆提供动力的一个城市。
我建议你从这里开始: http://struts.apache.org/2.x/docs/home.html
这会给你的框架的正确思路和它的全部功能。
一个建议是,如果你想坚持到MVC架构则永远不会有业务逻辑视图。 根据MVC架构与谁查看工作UI工程师不用不知道业务逻辑可言。
在JSP页面中混用HTML和Java代码视图复杂化,并会导致维护代码的问题。
利用本教程来看看如何在Struts 2中实现CRUD操作。