【问题标题】:How to call a DAO method from a Json Servlet如何从 Json Servlet 调用 DAO 方法
【发布时间】:2023-03-20 09:36:01
【问题描述】:

我的 JSP 中有一个依赖项下拉列表。我有一个 json servlet,我在其中填充了第二个下拉列表。根据为第一个下拉列表所做的选择,将确定第二个下拉列表。我在 jsonServlet 类中有硬编码值,但我希望能够从我的 DAO 方法中调用查询。我该怎么办?

JsonServlet:

package master.service;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import master.dao.MasterDataDao;
import master.dto.SiteDto;

import com.google.gson.Gson;

/**
 * Servlet implementation class JsonServlet
 * @param <E>
*/
public class JsonServlet<E> extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
 * @see HttpServlet#HttpServlet()
 */
protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

    MasterDataDao masterDataDao = new MasterDataDao();
    String divisionIdName = request.getParameter("divisionIdName");
        List<String> list = new ArrayList<String>();
        List<SiteDto> site = new ArrayList<SiteDto>();
        String json = null;

        if (divisionIdName.equals("33") || divisionIdName.equals("36")) {
            try {
                site.equals(masterDataDao.getAllJJSites());
                for (Iterator<SiteDto> iter = site.iterator(); iter.hasNext(); ){
                    SiteDto element = iter.next();
                    list.addAll(-1, element);
                }
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            for (Iterator<SiteDto> iter = site.iterator(); iter.hasNext(); ){
                SiteDto element = iter.next();

            }
        } else if (divisionIdName.equals("Select Division")) {
                list.add("Select Site");

        } else {
            try {
                site.equals(masterDataDao.getAllSites());
                for (Iterator<SiteDto> iter = site.iterator(); iter.hasNext(); ){
                    SiteDto element = iter.next();
                    list.addAll(-1, element);
                }
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        json = new Gson().toJson(list);
        response.setContentType("application/json");
        response.getWriter().write(json);
}

}

根据我的 JsonServlet 中的 DivisionID 选择,如果 DivisionID 是 33 或 36,我想在我的 MasterDataDao 类中调用此方法:

 public List<SiteDto> getAllJJSites() throws IOException, ClassNotFoundException, SQLException {
    List<SiteDto> siteDtoList = new ArrayList<SiteDto>();
    Connection con = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        String query = "Select Distinct Name, Id  From Addtl_Type Where Addtl_Type.is_active = '1' And Data_Field_Id = 3050 Order By Name";
        con = getConnection();
        ps = con.prepareStatement(query);
        rs = ps.executeQuery();
        // System.out.println("&*******" + rs.getFetchSize());
        while (rs.next()) {
            SiteDto siteDto = new SiteDto();
            siteDto.setId(rs.getString("Id"));
            siteDto.setName(rs.getString("Name"));
            siteDtoList.add(siteDto);
        }
    } finally {

        cleanUp(con, ps, rs);
    }
    return siteDtoList;
}

否则如果是另一个选择值(除了Select Division),我想用MasterDataDao类调用这个方法:

 public List<SiteDto> getAllSites() throws IOException, ClassNotFoundException, SQLException {
    List<SiteDto> siteDtoList = new ArrayList<SiteDto>();
    Connection con = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
        String query = "Select Distinct Name, Id  From Addtl_Type Where Addtl_Type.is_active = '1' And Data_Field_Id = 105 Order By Name";
        con = getConnection();
        ps = con.prepareStatement(query);
        rs = ps.executeQuery();
        // System.out.println("&*******" + rs.getFetchSize());
        while (rs.next()) {
            SiteDto siteDto = new SiteDto();
            siteDto.setId(rs.getString("Id"));
            siteDto.setName(rs.getString("Name"));
            siteDtoList.add(siteDto);
        }
    } finally {

        cleanUp(con, ps, rs);
    }
    return siteDtoList;
}

这可以在 JsonServlet 中实现吗?如果有怎么办?提前致谢。 如果需要更多信息,请告诉我。

我还在这里包含了我的 JSP。最初,我从这里致电 DAO。我引用了一个bean。 JSP:

<script>
$(document).ready(function() {

    $('#divisionId').change(function(event) {
        var divisionId = $("select#divisionId").val();
        $.get('JsonServlet', {
            divisionIdName : divisionId
        }, function(response) {

            var select = $('#siteId');
            select.find('option').remove();
            $.each(response, function(index, value) {
                $('<option>').val(value).text(value).appendTo(select);
            });
        });
    });
});
</script>


 </head>
 <body>

<form name="input" action="getMasterData" method="get">



    <br /> <br />
    <h1 align='center'>Master Data File</h1>
    <br /> <br />


    <table border="0" align='center'>

        <tr>
            <td>
                <h2>Division</h2>
            </td>
            <td align='left'><jsp:useBean id="masterDaoUtil"
                    class="master.dao.util.MasterDataConstants" /> 
                    <select name="divisionId" id="divisionId">
                    <option>Select Division</option>
                    <option value="33">
 <%=MasterDataConstants.DIVISION_TYPE_AUDIT_MANAGEMENT_GLOBAL_NAME%></option>
                    <option value="31">
 <%=MasterDataConstants.DIVISION_TYPE_CHANGE_MANAGEMENT_GLOBAL_NAME%></option>
                    <option value="34">
 <%=MasterDataConstants.DIVISION_TYPE_DEA_MANAGEMENT_GLOBAL_NAME%></option>
                    <option value="35">
 <%=MasterDataConstants.DIVISION_TYPE_EHS_MANAGEMENT_GLOBAL_NAME%></option>
                    <option value="23">
 <%=MasterDataConstants.DIVISION_TYPE_EVENT_MANAGEMENT_GLOBAL_NAME%></option>
                    <option value="36">
 \
 <%=MasterDataConstants.DIVISION_TYPE_QUALITY_EVENT_MANAGEMENT_GLOBAL_NAME%></option>
                    <option value="40">
 <%=MasterDataConstants.DIVISION_TYPE_NORAMCO_AUDIT_MANAGEMENT_GLOBAL_NAME%></option>
                    <option value="43">


<%=MasterDataConstants.DIVISION_TYPE_NORAMCO_CHANGE_MANAGEMENT_GLOBAL_NAME%></option>
                    <option value="41">
 <%=MasterDataConstants.DIVISION_TYPE_NORAMCO_DEA_MANAGEMENT_GLOBAL_NAME%></option>
                    <option value="42">
 <%=MasterDataConstants.DIVISION_TYPE_NORAMCO_EHS_MANAGEMENT_GLOBAL_NAME%></option>
                    <option value="44">
 <%=MasterDataConstants.DIVISION_TYPE_NORAMCO_EVENT_MANAGEMENT_GLOBAL_NAME%></option>
            </select></td>
        </tr>
        <tr>
            <td>
                <h2>Site Name</h2>
            </td>
            <td align='left'>
 <%--               <jsp:useBean id="masterDao"
                    class="master.dao.MasterDataDao" /> 
 --%>                       
                    <select name="siteId"
                id="siteId">
                    <option>Select Site</option>
 <%--                   <option value="0">ALL</option>
                    <c:forEach items="${masterDao.allSites}" var="siteDto">
                        <option value="${siteDto.id}">${siteDto.name}
 </option>
                    </c:forEach>
 --%>                           
            </select></td>
        </tr>


    </table>
    <br /> <br />
    <div style="text-align: center">
        <input type="submit" value="Submit">
    </div>

</form>
<%
    if (request.getAttribute("message") != null) {
%>
<p>
    <font size=4 color="red"> Master_Data(timestamp).xlsx and
        Consistency_Check_Data(timestamp).xlsx are located under
        d:/stage/MasterDataReports <%--Master_Data(timestamp).xlsx and Consistency_Check_Data(timestamp).xlsx are located under /jsc/ets/u02/tools7/apache-tomcat-7.0.55/webapps/MasterData/MasterDataReport--%>
    </font>
</p>
<%
    }
%>

最初在我使用 JSON 和 AJAX 之前,我将此语句用于现在已被注释掉的选项。

  <%--               <jsp:useBean id="masterDao"
                class="master.dao.MasterDataDao" /> 
  --%>                       
                <select name="siteId"
            id="siteId">
                <option>Select Site</option>
  <%--                   <option value="0">ALL</option>
                <c:forEach items="${masterDao.allSites}" var="siteDto">
                    <option value="${siteDto.id}">${siteDto.name}

有什么方法可以利用它吗?也许我可以从我的 servlet 对 JSP 进行函数调用?我知道这不是好的做法,但我想不出另一种方法。我需要获取 siteDto.id 值以及 siteDto.name 值。 提前致谢

【问题讨论】:

  • 当您创建所需类的实例然后在其上调用所需方法时,您面临的具体问题是什么?这只是基本的Java,绝对不依赖于类/方法依次在做什么,也不依赖于调用者在做什么。这基本上与 JSON/Ajax/JSP/Servlets 无关。
  • 嗨 BalusC。我尝试在我的 servlet 中直接调用 DAO 方法,但它希望我将我的方法更改为静态方法。这会导致问题,因为我在该方法中有连接调用也必须更改
  • 所以你没有创建它的实例?究竟是什么阻止您创建它的实例?
  • 现在让我试试。我想得更复杂了。谢谢你的建议。另外我想指出我有两个 servlet。有 2 个 servlet 有意义吗?我只是认为我需要 2,因为 JSON servlet 需要独立存在。
  • 您好 BalusC,所以我接受了您的建议并创建了 MasterDataDao 类的实例,并在 if else 语句中插入了正确的查询调用。现在我的java技能远非同级。遍历列表并显示值的最佳方法是什么?我已经用上面的更改更新了我的 JsonServlet 代码。我遇到了 list.add 与 list.addAll 的问题。再次提前感谢

标签: json ajax jsp servlets


【解决方案1】:

创建一个接口和实现DAO,如IMasterDataDAOMasterDataDAOImpl

如果您将来获得更多 if..else 条件,请使用 switch..case 而不是 if..else

使用servlet 中的接口为DAO 创建一个对象,如下所示:

IMasterDataDAO masterDAO = new MasterDataDAOImpl()

然后根据条件调用masterDAO.getAllJSites()masterDAO.getAllSites()

【讨论】:

  • 你好 Zayn 和 Prasanna。感谢您的答复。如上所述,我已经创建了接口和实现文件。我现在将如何迭代结果集并填充下拉列表?我写过这样的东西: if (divisionIdName.equals("33") || divisionIdName.equals("36")) { list.add("Select Site"); list.add(0, "ALL"); for (ListIterator iter = jj_site.listIterator(); iter .hasNext();) { list.add(siteDtoList.getId()); // 字符串元素 = iter.next(); }
  • 嗨,prasanna。我现在添加了我的 JSP 代码,并展示了在使用 JSON 之前我最初是如何进行选项调用的。它现在被注释掉了。有没有办法可以利用它?请在上面的我的 JSP 上顶一下。 ——
猜你喜欢
  • 2014-09-19
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多