Вы не передаете что-то в сервлет. Вы просто позволяете сервлету получить доступ к чему-либо.
Вам следует избавиться от этого main()
метода и переместить код взаимодействия с базой данных в класс DAO. Я также дал бы классу модели (с часовым поясом и местоположением) более чувствительное имя, начинающееся с заглавной буквы. Итак, со всеми, вы должны обновить код так, чтобы он выглядел примерно так:
Класс модели, Area
(назовите его как хотите, если это имеет смысл), он должен просто представлять одну сущность:
public class Area {
private String location;
private String timezone;
public String getLocation() { return location; }
public String getTimezone() { return timezone; }
public void setLocation(String location) { this.location = location; }
public void setTimezone(String timezone) { this.timezone = timezone; }
}
Базовый класс менеджера соединений, Database
, здесь вы загружаете драйвер только один раз и предоставляете геттер для соединения:
public class Database {
private String url;
private String username;
private String password;
public Database(String driver, String url, String username, String password) {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
throw new RuntimeException("Driver class is missing in classpath", e);
}
this.url = url;
this.username = username;
this.password = password;
}
public Connection getConnection() {
return DriverManager.getConnection(url, username, password);
}
}
Класс DAO, AreaDAO
, здесь вы помещаете все методы взаимодействия с БД:
public class AreaDAO {
private Database database;
public AreaDAO(Database database) {
this.database = database;
}
public List<Area> list() throws SQLException {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
List<Area> areas = new ArrayList<Area>();
try {
connection = database.getConnection();
statement = connection.prepareStatement("SELECT location, timezone FROM userclient");
resultSet = statement.executeQuery();
while (resultSet.next()) {
Area area = new Area();
area.setLocation(resultSet.getString("location"));
area.setTimezone(resultSet.getString("timezone"));
areas.add(area);
}
} finally {
if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}
return areas;
}
}
Наконец, в сервлете один раз инициализируйте DAO и получите список в методе HTTP:
public class AreaServlet extends HttpServlet {
private AreaDAO areaDAO;
public void init() throws ServletException {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/dbname";
String username = "user";
String password = "pass";
Database database = new Database(driver, url, username, password);
this.areaDAO = new AreaDAO(database);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
List<Area> areas = areaDAO.list();
request.setAttribute("areas", areas);
request.getRequestDispatcher("/WEB-INF/areas.jsp").forward(request, response);
} catch (SQLException e) {
throw new ServletException("Cannot retrieve areas", e);
}
}
}
Отобразите этот сервлет на url-pattern
из /areas
в web.xml
, чтобы вы могли вызвать его с помощью http://example.com/contextname/areas
/WEB-INF/areas.jsp
может выглядеть примерно так, при условии, что вы хотите отобразить области в таблице:
<table>
<c:forEach items="${areas}" var="area">
<tr>
<td>${area.location}</td>
<td>${area.timezone}</td>
</tr>
</c:forEach>
</table>
Смотри также: