在我的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/