java - 如何在MVC中连接到Java(jsp,servlet)中的不同表?

标签 java jsp servlets

在我的Java Web项目中,我有四个软件包,即com.hrms.model,com.hrms.service,com.hrms.servlet,com.hrms.utility。
在模型中,我具有基类项目,员工以及对其属性以及获取数据的获取者和设置者的培训。

在服务中,我具有服务实现接口,并且该接口的实现是;

package com.hrms.service;

public class EmployeeServiceImplement implements IEmployeeService 
{


/** Initialize logger */
public static final Logger log = 
Logger.getLogger(EmployeeServiceImplement.class.getName());

private static Connection connection;

private static Statement statement;

private PreparedStatement preparedStatement;

/**
 * Add set of employees for as a batch from the selected employee List
 * 
 * @throws SQLException
 *             - Thrown when database access error occurs or this method is
 *             called on a closed connection
 * @throws SAXException
 *             - Encapsulate a general SAX error or warning
 * @throws IOException
 *             - Exception produced by failed or interrupted I/O operations.
 * @throws ParserConfigurationException
 *             - Indicates a serious configuration error.
 * 
 */
@Override
public void addEmployee(Employee employee) 
{

    String employeeID = EmployeeCommonUtility.generateIDs(getEmployeeIDs());

    try 
    {
        connection = EmployeeDBConnection.getDBConnection();
        /*
         * Query is available in EmployeeQuery.xml file and use
         * insert_employee key to extract value of it
         */
 preparedStatement=connection.
prepareStatement(EmployeeQueryUtility.
queryByID(EmployeeConstants.QUERY_ID_INSERT_EMPLOYEES));
        connection.setAutoCommit(false);

        //Generate employee IDs
        employee.setEmployeeID(employeeID);
        preparedStatement.setString(EmployeeConstants.
COLUMN_INDEX_ONE, employee.getEmployeeID());
        preparedStatement.setString(EmployeeConstants.
COLUMN_INDEX_TWO, employee.getNIC());
            // Add employee
        preparedStatement.execute();
        connection.commit();

    } 
} 

    catch (SQLException | SAXException | IOException | ParserConfigurationException | ClassNotFoundException e) 
    {
        log.log(Level.SEVERE, e.getMessage());
    } 

    finally 
    {
        /*
         * Close prepared statement and database connectivity at the end of
         * transaction
         */
        try 
        {
            if (preparedStatement != null) 
            {
                preparedStatement.close();
            }

            if (connection != null) 
            {
                connection.close();
            }
        } 

        catch (SQLException e) 
        {
            log.log(Level.SEVERE, e.getMessage());
        }
    }
} 
//from this part onwards i have replased employees with project, since it's 
project section which causes the error.
@Override
public Project getProjectByID(String projectID) 
{
    return actionOnProject(projectID).get(0);
}
@Override
public ArrayList<Project> getProjects() 
{
    return actionOnProject(null);
}
private ArrayList<Project> actionOnProject(String projectID) 
{
    ArrayList<Project> projectList = new ArrayList<Project>();

    try 
    {
        connection = ProjectDBConnection.getDBConnection();
        /*
         * Before fetching project it checks whether project ID is
         * available
         */
        if (projectID != null && !projectID.isEmpty()) 
        {
            /*
             * Get project by ID query will be retrieved from
             * ProjectQuery.xml
             */
            preparedStatement = connection.prepareStatement
(ProjectQueryUtility.queryByID(ProjectConstants.QUERY_ID_GET_PROJECT));
            preparedStatement.setString
(ProjectConstants.COLUMN_INDEX_ONE, projectID);
        }
        /*
         * If project ID is not provided for get employee option it display
         * all projects
         */
        else 
        {
            preparedStatement = connection.prepareStatement
(ProjectQueryUtility.queryByID(ProjectConstants.QUERY_ID_ALL_PROJECTS));
        }

        ResultSet resultSet = preparedStatement.executeQuery();

        while (resultSet.next()) 
        {
            Project project = new Project();

    project.setProjectID
(resultSet.getString(ProjectConstants.COLUMN_INDEX_ONE));

 project.setName
(resultSet.getString(ProjectConstants.COLUMN_INDEX_TWO));

    project.setStartDate
(resultSet.getString
(ProjectConstants.COLUMN_INDEX_THREE));

  project.setEndDate
(resultSet.getString(ProjectConstants.COLUMN_INDEX_FOUR));

  project.setDepartment(resultSet.getString
(ProjectConstants.COLUMN_INDEX_FIVE));
            project.setCost(Double.parseDouble
(resultSet.getString(ProjectConstants.COLUMN_INDEX_SIX)));

  project.setClientID
(resultSet.getString
(ProjectConstants.COLUMN_INDEX_SEVEN));

            projectList.add(project);
        }

    } 

    catch (SQLException | SAXException | 
IOException | ParserConfigurationException | ClassNotFoundException e) 
    {
        log.log(Level.SEVERE, e.getMessage());
    } 

    finally 
    {
        /*
         * Close prepared statement and database connectivity at the end of
         * transaction
         */
        try 
        {
            if (preparedStatement != null) 
            {
                preparedStatement.close();
            }

            if (connection != null)
            {
                connection.close();
            }
        } 

        catch (SQLException e) 
        {
            log.log(Level.SEVERE, e.getMessage());
        }
    }

    return projectList;
}


同样,我在这里有更新,删除和列出数据库中员工的方法。

在Servlet中,我有不同的Servlet来添加,删除,更新和获取员工。

 **In Utility** I have these classes;

public class EmployeeCommonUtility 
{

/** Initialize logger */
public static final Logger log = Logger.getLogger(IEmployeeService.class.getName());

public static final Properties properties = new Properties();

static {
    try {

        // Read the property only once when load the class
        properties.load(EmployeeQueryUtility.class.getResourceAsStream(EmployeeConstants.PROPERTY_FILE));

    } 

    catch (IOException e) 
    {
        log.log(Level.SEVERE, e.getMessage());
    }
}

/**
 * Add new Employee ID
 * 
 * @param arrayList
 * @return
 */
public static String generateIDs(ArrayList<String> arrayList) 
{

    String id;
    int next = arrayList.size();
    next++;
    id = EmployeeConstants.EMPLOYEE_ID_PREFIX + next;
    if (arrayList.contains(id)) 
    {
        next++;
        id = EmployeeConstants.EMPLOYEE_ID_PREFIX + next;
    }

    return id;
}
}


public class EmployeeConstants 
{

/** Constant for config.properties key for query file path */
public static final String QUERY_XML = "queryFilePath";

/** Constant for file path of config.properties */
public static final String PROPERTY_FILE = "employee.config.properties";
.
.
.
.
}


此类包含项目中的所有常量。
employee.config.properties包含用户名,密码和相关的.xml查询文件名,以检索数据。

public class EmployeeQueryUtility extends EmployeeCommonUtility 
{

/**
 * This method read the EmployeeQuery.xml file and retrieve the query by
 * query id.
 * 
 * @param id
 *            QueryID to retrieve elements
 * 
 * @return String formatted query will be returned as output
 * 
 * @throws ParserConfigurationException
 *             - Indicates a serious configuration error.
 * @throws IOException
 *             - This class is the general class of exceptions produced by
 *             failed or interrupted I/O operations.
 * @throws SAXException
 *             - Encapsulate a general SAX error or warning.
 * 
 * @see EmployeeServiceImplement#addEmployees()
 * @see EmployeeServiceImplement#createEmployeeTable()
 * @see EmployeeServiceImplement#displayAllEmployees()
 * @see EmployeeServiceImplement#removeEmployee(String)
 * 
 */
public static String queryByID(String id) throws SAXException, IOException, ParserConfigurationException 
{
    NodeList nodeList;
    Element element = null;
    /*
     * Read the EmployeeQuery.xml file and read each query node into node
     * list. It refers tag name query
     */
    nodeList = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(System.getProperty("catalina.base") + "\\wtpwebapps\\HRMS\\WEB-INF\\EmployeeQuery.xml"))
            .getElementsByTagName(EmployeeConstants.TAG_NAME);

    /*
     * Extract the node from node list using query id query id is taken from
     * query node attribute
     */

    for (int value = 0; value < nodeList.getLength(); value++) 
    {
        element = (Element) nodeList.item(value);
        if (element.getAttribute(EmployeeConstants.ATTRIB_ID).equals(id))
            break;
    }

    return element.getTextContent().trim();
}
}

package com.hrms.utility;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * This is the Database connection creation class .
 * @see #CommonUtility
 */

public class EmployeeDBConnection extends EmployeeCommonUtility 
{

private static Connection connection;

// This works according to singleton pattern
private EmployeeDBConnection() 
{
}

/**
 * Create Database connection for the given URL, Username and Password
 * 
 * @return Connection this returns SQL connection for MySql Database
 * 
 * @throws ClassNotFoundException
 *             - Thrown when an application tries to load in a class through
 *             its string name
 * @throws SQLException
 *             - An exception that provides information on a database access
 *             error or other errors
 */
public static Connection getDBConnection() throws ClassNotFoundException, SQLException 
{
    /*
     * This create new connection objects when connection is closed or it is
     * null
     */
    if (connection == null || connection.isClosed())
    {


    Class.forName(properties.getProperty(EmployeeConstants.DRIVER_NAME));
        connection = DriverManager.getConnection(properties.getProperty(EmployeeConstants.URL),
                properties.getProperty(EmployeeConstants.USERNAME), properties.getProperty(EmployeeConstants.PASSWORD));
    }

    return connection;
}
}


在GetEmployee.jsp中

<%@page import="com.hrms.model.Employee"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<jsp:include page="/WEB-INF/views/header.jsp"></jsp:include>
<h2 class="h2" >Get Employee</h2>
<br>
<br>
<%
    Employee employee = (Employee) request.getAttribute("employee");
%>

<form method="POST" action="UpdateEmployeeServlet">
    <table>
        <tr>
            <td>Employee ID</td>
            <td><input type="text" name="employeeID" disabled="disabled"
                value="<%=employee.getEmployeeID()%>" /></td>
        </tr>
        <tr>
            <td>NIC</td>
            <td><input type="text" name="NIC" 
                value="<%=employee.getNIC()%>" /></td>
        </tr>
        <tr>
            <td>Employee Name</td>
            <td><input type="text" name="employeeName"
                value="<%=employee.getName()%>" /></td>
        </tr>

        <tr>
            <td colspan="2">
                <input type="hidden" name="employeeID" value=" 
 <%=employee.getEmployeeID()%>" /> 
                <input type="submit" value="Update Employee" class="btn btn- 
 primary"/>
            </td>
        </tr>
    </table>
</form>

<table>
    <tr>
        <td colspan="2">
            <form method="POST" action="DeleteEmployeeServlet">
                <input type="hidden" name="employeeID" value="<%=employee.getEmployeeID()%>" /> 
                <input type="submit" value="Delete  Employee" class="btn btn-primary"/>
            </form>
        </td>
    </tr>
</table>
<jsp:include page="/WEB-INF/views/footer.jsp"></jsp:include>
</body>
</html>


在ListEmployee.jsp中

 <%@page import="com.hrms.model.Project"%>
 <%@page import="java.util.ArrayList"%>
 <%@page import="com.hrms.service.ProjectServiceImplement"%>
 <%@page import="com.hrms.service.IProjectService"%>

 <html>
 <head>
 <!-- Bootstrap -->
 <link href="css/bootstrap.min.css" rel="stylesheet">

 </head>
 <body>
 <jsp:include page="/WEB-INF/views/header.jsp"></jsp:include>
 <br>
 <br>
 <form method="POST" action="addProject.jsp">
    <td scope="row"><input type="submit" value= "Add Project" 
 class="btn btn-primary btn-md" />  
 </form>
  <div align="left">
    <table class="table table-hover">
     <caption><h2 style="color:#800080" class="text-center">
 HumanConcepts inc. Project Database</h2></caption>
      <thead>
      <tr>
            <th scope="col">Project ID</th>
            <th scope="col">Project Name</th>
            <th scope="col">Start Date</th>
            <th scope="col">End Date</th>
            <th scope="col">Department</th>
            <th scope="col">Cost</th>
            <th scope="col">Client ID</th>
        </tr>
        <thead>
        <%
            IProjectService iProjectService = new ProjectServiceImplement();
                        ArrayList<Project> 
 arrayList = iProjectService.getProjects();

                        for(Project project : arrayList){
        %>
        <tbody>
         <tr>
            <td scope="row"> <%=project.getProjectID() %> </td>
            <td scope="row"> <%=project.getName() %> </td>
            <td scope="row"> <%=project.getStartDate() %> </td>
            <td scope="row"> <%=project.getEndDate() %> </td>
            <td scope="row"> <%=project.getDepartment() %> </td>
            <td scope="row"> <%=project.getCost() %> </td>
            <td scope="row"> <%=project.getClientID() %> </td>
            <form method="POST" action="GetProjectServlet">
            <td scope="row">
            <input type="submit" value= "Select Project" 
 class="btn btn-primary btn-xs" />  
            <input type="hidden" name="projectID" 
value="<%=project.getProjectID()%>"/>
             </form>
             </td>  
            </tr>
        <tbody>         
        <%  
           }
        %>     
    </table>
    </div>
    <jsp:include page="/WEB-INF/views/footer.jsp"></jsp:include>
</body>
</html>


对于每个员工,项目和培训,我都有相同格式的代码段。

在index.jsp中,我有4个按钮单击以访问它们。在每一个文件中,我都将它们重定向到相关的servlet。
基本上我正在尝试实施
简单的管理员面板。

此员工班级运作正常,但是在剩下的两个班级上,他们抛出了一个例外,


  HTTP状态500 –内部服务器错误
  消息在行[56]处发生异常处理[WEB-INF / views / ListProjects.jsp]
  
  描述服务器遇到意外情况,阻止其满足请求。
  
  例外
  
  org.apache.jasper.JasperException:在行[56]处理[WEB-INF / views / ListProjects.jsp]时发生异常
  53:
  54:<%
  55:IProjectService iProjectService = new ProjectServiceImplement();
  56:ArrayList arrayList = iProjectService.getProjects();
  57:
  58:for(项目专案:arrayList){
  59:%>


由于将所有代码段都放在这里确实很困难,因此,如果您需要澄清代码中的任何位置,请随时要求我将其放置。我认为,在同一数据库中两次建立两个新连接时,会导致此错误。但是我不知道如何通过保留MVC在不同的表之间导航。

有什么建议可以克服这个错误?
谢谢!

全栈跟踪

2018年5月17日9:00:32 org.apache.catalina.core.StandardWrapperValve调用
严重:路径为[/ HRMS]的上下文中的Servlet [ListProjectServlet]的Servlet.service()引发了异常[在行[56]处理[WEB-INF / views / ListProjects.jsp]时发生了异常。

53:
54:<%
55:IProjectService iProjectService = new ProjectServiceImplement();
56:ArrayList arrayList = iProjectService.getProjects();
57:
58:for(项目专案:arrayList){
59:%>

Stacktrace:]有根本原因
java.lang.NoClassDefFoundError:无法初始化类com.hrms.utility.ProjectDBConnection
    在com.hrms.service.ProjectServiceImplement.actionOnProject(ProjectServiceImplement.java:242)
    在com.hrms.service.ProjectServiceImplement.getProjects(ProjectServiceImplement.java:137)
    在org.apache.jsp.WEB_002dINF.views.ListProjects_jsp._jspService(ListProjects_jsp.java:186)
    在org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    在javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    在org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:444)
    在org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
    在org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
    在javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    在org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    在org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)
    在org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
    在org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384)
    在org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
    在com.hrms.servlet.ListProjectServlet.doPost(ListProjectServlet.java:47)
    在javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    在javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    在org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
    在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    在org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
    在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    在org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)
    在org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    在org.apache.coyote.AbstractProtocol $ ConnectionHandler.process(AbstractProtocol.java:754)
    在org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1376)
    在org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    在java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源)
    在java.util.concurrent.ThreadPoolExecutor $ Worker.run(未知源)
    在org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)
    在java.lang.Thread.run(未知来源)

最佳答案

问题似乎是在类路径(com.hrms.utility.ProjectDBConnection)上找不到类root cause java.lang.NoClassDefFoundError

调用jsp文件的第56行上调用的iProjectService.getProjects()时,将使用此类。

该方法正在调用actionOnProject(null),而后者又调用connection = ProjectDBConnection.getDBConnection()

检查此类是否存在,因为对于Employee,它具有不同的名称。

如果存在,请确保在运行时类路径上找到它。

关于java - 如何在MVC中连接到Java(jsp,servlet)中的不同表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50382677/

相关文章:

java - 查找给定 java.util.Date 对象距当前日期的天数

javascript - 在超链接的点击事件上调用javascript函数

javascript - .val() 不返回输入文本

java - 从 servlet 调用独立的 java 程序

html - 如何将 JSP 文件中的 HTML 表单的值提交和发送到 Servlet?

java - 在Java(或一般情况下)中,迭代器应该是可重用的还是设计为一次性使用的?

java - Android 图标像素化/模糊

java - Android - 移动布局或动画项目到购物车

java - 无法使用 request.getParameter() 或 request.getAttributes() 从同一个 Servlet 中检索数据,尝试都只获取 null

java - 如何将一个简单的 Servlet 与 JDBC 结合起来?代码导致 ClassNotFoundException