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

Java 我应该在Struts2视图层中检索数据库记录吗?,java,jsp,model-view-controller,struts2,struts-action,Java,Jsp,Model View Controller,Struts2,Struts Action,我有一个编辑页面,我想从数据库中检索主题和级别,并显示为用户编辑课程的选择选项 提交表单时,它将发出一个新请求,用户输入由courseBean通过XML验证捕获。当XML验证失败时,它将使用刚刚捕获用户输入的courseBean转发到edit.jsp 因此,每次我转到edit.jsp,我都会检索数据库记录。我应该那样做吗 此外,我试图检索主题lit和级别lit,并将它们作为请求属性存储在action类中,该类第一次显示edit.jsp。但是,当从用户输入发出新请求时,从数据库检索的主题列表和级

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

提交表单时,它将发出一个新请求,用户输入由courseBean通过XML验证捕获。当XML验证失败时,它将使用刚刚捕获用户输入的courseBean转发到edit.jsp

因此,每次我转到edit.jsp,我都会检索数据库记录。我应该那样做吗

此外,我试图检索主题lit级别lit,并将它们作为请求属性存储在action类中,该类第一次显示edit.jsp。但是,当从用户输入发出新请求时,从数据库检索的主题列表和级别列表将不再可用

代码(edit.jsp):


主题
水平仪

您需要的是缓存。但是,如果数据库记录注定要频繁更改,这是不可取的

但是,如果所讨论的查询很小(我认为是),那么查询数据库不应该是一个大的性能问题

另一方面,查看您的JSP,我看到的只是不推荐使用和误用JSP scriplets

由于您添加了标签struts 2,我将假定这是一个struts 2 web项目。考虑(强烈)使用内置的Struts UI标签来完成脚本中的工作。

你的方法只能被描述为当你拥有一个核反应堆时,用一堆发电机为一座城市供电

我建议你从这里开始:


这将使您对框架及其全部功能有一个正确的认识

有一条建议,如果你想坚持MVC架构,就永远不要考虑业务逻辑。根据MVC架构,使用View的UI工程师根本不需要了解业务逻辑

在JSP页面中混合使用HTML和Java代码会使视图复杂化,并会在维护代码时产生问题


利用教程了解如何在Struts2中实现CRUD操作。

使用Struts2,您将不再需要使用
Scriptlet
s(
)。它们是旧的、坏的,它们是注入到视图页面中的业务逻辑,不要使用它们。您也不需要JSTL,只需使用Struts2标记即可实现任何结果

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

  • DAO层
    :它只做简单的查询
  • 业务层
    :通过
    服务
    (s)公开DAO层结果,聚合多个DAO调用,并在需要时执行多个业务操作
  • 表示层
    :Struts2中作为模型的动作;在这里,您从业务层调用服务,以检索JSP所需的对象
  • JSP(视图层)
    :JSP包含普通HTML,并通过操作的访问器(getter)访问所需数据,最终从值堆栈中访问任何其他所需元素(
    #session
    #request
    ,等等)

    在你的例子中,所有这些

  • 
    
    应该在DAO/业务层中,由两个函数公开,如
    getSubjectList()
    getLevelList()。那么在你的行动中,你应该有这样的东西:

    公共类操作{
    private List levelList;//private
    私有列表subjectList;//私有
    公共字符串execute()引发异常{
    //调用服务,加载数据
    levelList=getMyService().getLevelList();
    subjectList=getMyService().getSubjectList();
    //转发到JSP
    回归成功;
    }
    公共列表getLevelList(){
    返回水平列表;
    }
    公共列表getSubjectList(){
    返回主题列表;
    }
    }
    
    在JSP中,而不是:

    
    

    您可以通过以下方式访问列表(混合HTML/Struts2):

    
    
    或者,在选择的情况下,使用正确的Struts2 UI选择标记:

    
    
    如果一开始分离所有层太困难,那么将操作中的前三个级别展平,以了解如何分离Java(操作)和Struts2 UI标记(JSP)。 理解后,您可以将DAO逻辑移动到业务层,最好是移动到EJB中。当达到这一点时,将以更高的粒度再次拆分

    行动如下:

    公共类操作{
    private List levelList;//private
    私有列表subjectList;//私有
    公共字符串execute()引发异常{
    会话session2=HibernateUtil.getSessionFactory().getCurrentSession();
    事务tx=session2.beginTransaction();
    Query q=session2.createQuery(“来自主题”);
    subjectList=q.list();
    levelList=session2.createQuery(“从级别”).list();
    //转发到JSP
    回归成功;
    }
    公共列表getLevelList(){
    返回水平列表;
    }
    公共列表getSubjectList(){
    返回主题列表;
    }    
    }
    
    关于多次加载列表的问题,如果列表是固定的(例如每个月更改一次),或者每次都加载列表,则可以使用缓存(如果带有计时器,效果更好),这样做没有问题。 请注意,如果验证失败,ValidationInterceptor将把请求转发到输入类型中映射的JSP