当前位置: 首页 > 面试题库 >

我应该在Struts2视图层中检索数据库记录吗?

刘嘉木
2023-03-14
问题内容

我有一个编辑页面,我想在其中 从数据库中检索主题和级别
,并显示为用户编辑课程的选择选项。

提交表单后,它将发出一个新请求,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标签就可以实现
任何结果。

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

  1. DAO Layer:仅执行简单的查询;
  2. BUSINESS Layer:它通过公开DAO层结果Service,聚合多个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;
    }

}

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;
    }
}

循序渐进,该框架既简单又强大,网络上有很多示例



 类似资料:
  • 问题内容: 有一个数据库,它在一个表中大约包含200万条记录。我从我的Java代码中运行查询,例如“ select * from table”。是否将从结果集中的数据库中获取完整数据。或不 。如果是,那么它将如何工作,我想学习此检索工作, 请让我知道,我在某处了解到它将从数据库中检索完整的数据并将其存储在临时存储中,并在输出中显示出来。还是与J2C有关 问题答案: 它会从结果集中的数据库中获取完整

  • 尝试站点parse.com将数据加载到数据库中 类DBHelper扩展了SQLiteOpenHelper{ 在模拟器上获取 java.lang.IllegalStateExcema:尝试重新打开已关闭的对象:SQLiteDatabase: /data/data/com.project.test/databases/myDBandroid.database.sqlite.SQLiteClosable

  • 如何使用ajax检索数据?我有我的ajax代码,在我的一些项目中从数据库检索记录时使用过,但不知道如何在Laravel5中使用,因为它有路由和控制器。 我有这个html 还有Ajax 在我的控制器中,我声明了两个雄辩的模型,模型1用于branchname表,模型2用于employees表 因此,我可以检索如下数据(参考下文) 如何返回我从employees表中提取的记录?从ajax第一次与控制器通

  • 问题内容: 在为数据库(例如MySQL)设计模式时,会出现一个问题,即是否要完全规范化表。 一方面,联接(以及外键约束等)非常慢,另一方面,您会获得冗余数据和潜在的不一致情况。 这里“最优化”是正确的方法吗?即创建一个书本归一化数据库,然后查看可以进行归一化以实现最佳速度增益的内容。 对于这种方法,我的担心是,我将选择一个可能不够快的数据库设计- 但是在那个阶段重构模式(同时支持现有数据)将非常痛

  • 问题内容: 我正在尝试根据特定的ID查询数据库。 如果这是第一次运行该活动,则该表将与id列一起存在,但是将不存在具有特定id的记录。如何检查该特定记录是否存在,如果不存在,则添加它?我发现有关检查特定列是否存在的很多信息,但与检查特定记录是否存在无关。 到目前为止,我已经尝试获取id列索引并检查它是否返回-1,但是由于某种原因,它实际上正在返回1。我可以在if语句中使用什么来验证尚未创建id列?

  • 问题内容: 我正在寻找最快和正确的方法来检查数据库中是否存在记录: 您有任何问题吗? 问题答案: 考虑那是你的课 我将您的参数保留为a,但我认为应该将其作为。 它比因为不需要在select子句中从表中检索所有值而更快。 您可以将字符串放入静态最终常量中,以使其更快。