我有一个编辑页面,我想在其中 从数据库中检索主题和级别 ,并显示为用户编辑课程的选择选项。
提交表单后,它将发出一个新请求,CourseBean使用XML验证捕获用户输入。当XML验证 失败时,它将与刚刚捕获用户 输入的courseBean转发到edit.jsp。
在此处输入图片说明
因此,每次我进入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,您将不再需要使用Scriptlets(<% stuff %>)。 它们陈旧,糟糕,它们是在视图页面中注入的业务逻辑,请不要使用 它们。您也不需要JSTL,只需使用Struts2标签就可以实现 任何结果。
Scriptlets
<% stuff %>
为了更好地分离和分离代码和概念,您应该具有:
DAO Layer
BUSINESS Layer
PRESENTATION Layer
JSP (VIEW Layer)
#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();。然后,在您的操作中,您应该具有以下内容
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; } }
and in your JSP, instead of:
> <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" />
如果一开始很难将所有层分开,则将操作中的前三个级别展平,只是为了了解如何分离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会将请求转发到映射到INPUT类型结果中的JSP,而无需到达execute()方法,因此您应从Action实现Preparable接口并将装入的东西放入prepare()方法中,每次执行由 PrepareInterceptor
prepare()
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; } }
循序渐进,该框架既简单又强大,网络上有很多示例