使用Struts2,您将不再需要使用
scriptlets(
<% stuff %>)。
它们陈旧,糟糕,它们是在视图页面中注入的业务逻辑,请不要使用
它们。您也不需要JSTL,只需使用Struts2标签就可以实现
任何结果。
为了更好地分离和分离代码和概念,您应该具有:
DAO Layer
:仅执行简单的查询;BUSINESS Layer
:它通过公开DAO层结果Service,聚合多个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; }}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
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; }}循序渐进,该框架既简单又强大,网络上有很多示例



