Я успешно получил данные из нижележащего класса из базы данных PostgreSQL. Строки данных таблицы в PostgreSQL добавляются в ArrayList<> userlist
. Я поделился исправленными кодами.
class UserList extends ArrayList<User> {
// as in comments said it seems really bad idea is to extend ArrayList. So, avoid it!
}
Класс User:
public class User {
private String firstName;
private String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public void calculateSimilarityUser(User u){
.... //some codes
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
Класс UserDAO:
public class UserDAO {
static Connection currentCon = null;
static ResultSet rs = null;
private ArrayList<User> userlist = new ArrayList<>();
public ArrayList<User> LoadFromDatabase(){
PreparedStatement userinfoStmt = null;
String loadUsersInfo = "SELECT * FROM userinfo";
try {
currentCon = ConnectionManager.getConnection();
userinfoStmt = currentCon.prepareStatement(loadUsersInfo);
rs = userinfoStmt.executeQuery();
while (rs.next()) {
User us = new User(rs.getString("firstname"), rs.getString("lastname"), rs.getInt("index"));
userlist.add(us);
}
userinfoStmt.close();
currentCon.close();
} catch (Exception e) {
}
return userlist;
}
Индекс.jsp
<%
UserDAO inf= new UserDAO();
ArrayList<User> userList = inf.LoadFromDatabase();
Recommender rc = new Recommender(userList);
%>
Расширение ArrayList не имеет никакого смысла в вашем случае. В принципе вы можете назвать свой класс UserDAO
. И нет необходимости создавать переменные уровня класса, вы можете создавать локальные переменные.
public class UserDAO { // no need to extend and changed name to UserDAO
public List<User> retainTopUsersItems(int maxNumOfReturnedResources, List<User> userList) {
List<User> retainList = new ArrayList<User>();
for (int i = 0; i < maxNumOfReturnedResources; i++) {
retainList.add(userList.get(i));
}
return retainList;
}
public List<User> loadFromDatabase() {
Connection userinfoCon = null;
ResultSet userinfoRS = null;
List<User> userlist = new ArrayList<>();
В вашем jsp используйте извлеченный список из метода.
<%
// UserList users = new UserList();
UserDAO inf= new UserDAO();
List<User> userList = inf.loadFromDatabase(); // See the changes
Recommender rc = new Recommender(userList); // Change constructor definition in your Recommender
%>
Примечание. Не уничтожайте свое исключение и не бросайте его или не регистрируйте?
ArrayList<User>
в некоторых ситуациях и не могу удалить его. У меня есть класс User, который представляет спецификацию пользователей, и ArrayList<User>
делает что-то с этими пользователями. Должен ли я использовать новый класс для извлечения пользователей из базы данных?
ArrayList<User> userlist = new ArrayList<>();
Я просто говорю вам, чтобы удалить extends ArrayList<User>
. И нет необходимости создавать новый класс, ваш существующий класс делает это только.
LoadFromDatabase()
, но на самом деле ничего не делаете с reuslt, насколько я вижу. (Вы также проглатываете исключения и не создаете новый список при каждом вызове, что кажется плохой идеей, но это другой вопрос.)users.LoadFromDatabase()
. Не пользователи возражают против самого себя. И все эти переменные экземпляра должны быть локальными переменными метода.