Можно ли вернуть ResultSet для работы в JSTL? - PullRequest
0 голосов
/ 26 ноября 2010

возможно ли вернуть переменную ResultSet в тег forest JSTL? Я получаю сообщение об ошибке с нулевым значением и по неправильной причине говорит, что класс db2.MyServ не существует, хотя он и существует. Кто-нибудь знает, что я делаю неправильно и как перебрать мой ResultSet rs на jstl?

Класс MyServ2 (импорт и т. Д. Пропущен)

     package db2;

public class MyServ2 extends HttpServlet {
    private static final long serialVersionUID = 1L;
       private DBClass db;
       private ResultSet rs;

    public MyServ2() {
        super();
        db = new DBClass();
        db.dbConnect("jdbc:oracle:thin:@elanweb:1510:xxxxx", "xxxxx", "xxx");

    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        rs = db.getResultSet(request.getParameter("query"));
        try {
            while(rs.next()){
                System.out.println(rs.getString(1).toString());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }


    public ResultSet getRs()
    {
        return rs;
    }

}

index.jsp

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>

    <%@ page import="db2.MyServ2" %>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<html>
<head>
</head>
<body>
successful login
<jsp:useBean id="myserv2" class="db2.MyServ2"/>

<c:if test="${myserv2.rs.Next()}">
<c:forEach var="person" items="${myserv2.rs}">
<c:out value="${myserv2.rs.string(1).toString()}"></c:out>
</c:forEach>
</c:if>
</body>
</html>

Я создал бин и сохранил в нем строки. Когда я вызываю их из класса MyServ2 для отладки, они работают нормально, но когда я вызываю их с моей веб-страницы как jstl, они возвращают ноль, как будто бин не заполнен. Все ли сбрасывается, как только я перенаправляю обратно на веб-страницу?

<jsp:useBean id="mybean" class="beans.UserBean"></jsp:useBean>

<c:out value="${mybean.name}"></c:out><br></br>

добавлено в класс MyServ следующее

rs = db.getResultSet(request.getParameter("query"));
    try {
        while(rs.next()){
            mybean.SetName(rs.getString(1).toString());
            mybean.Setsurname( rs.getString(2).toString());
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }

Ответы [ 2 ]

4 голосов
/ 26 ноября 2010

Это не очень хорошая идея. Совсем нет.

Где вы закрываете Resultset? А связь? Вы должны предоставить надежный способ освободить эти ресурсы, которые в противном случае могли бы вызвать серьезные проблемы в вашем приложении.

Более того, установка соединения в качестве значения экземпляра в HttpServlet обычно считается плохой практикой, поскольку вы должны поддерживать его в течение всего живого сервлета. Кроме того, если есть проблемы со связью, вам нужно перезапустить приложение, чтобы ваш сервлет переподключился. Не говорить о сохранении набора результатов на уровне экземпляра serlvet и обо всех проблемах параллелизма, которые это может вызвать.

Отображение ваших строк rs в JavaBean для использования в JSP не будет таким сложным. И попробуйте рефакторизовать ваш код для правильной обработки соединения с базой данных.

РЕДАКТИРОВАТЬ: В вашем последнем фрагменте кода, я вижу, вы все еще сохраняете данные в экземпляре сервлета. Это может привести к проблемам с параллелизмом. Проверьте это:

Resultset rs=null; //declare a local variable
try {
    //wrong code get the query from the request parameter! 
    // rs = db.getResultSet(request.getParameter("query"));
    String query="select col from table where a='b'"; // whatever
    rs = db.getResultSet(query);
    //just one value? no need of while
    if(rs.next()){
        MyBean bean=new MyBean();
        bean.setName(rs.getString(1));
        bean.setSurname(rs.getString(2));
        //here is where you put your bean to the request
        request.setAttribute("myBean", bean);
    }
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    //Don't forget closing your Rs
    if(rs!=null) {rs.close();}
}

И затем, используя JSTL, вы уже можете получить доступ к атрибуту запроса, очень похожему на последний пример JSP, используя имя, заданное в методе setAttribute:

<c:out value="${myBean.name}" /><br></br>
<c:out value="${myBean.surname}" /><br></br>
3 голосов
/ 26 ноября 2010

Мой простой ответ - нет, по разным причинам:

  • ResultSet не соответствует спецификации JavaBeans (у него нет метода getter / setters и он не сериализуем).

Вместо этого заполните ResultSet в bean-компонент и используйте JSTL для извлечения данных из bean-компонента.


Для вашего отредактированного поста я предлагаю собрать все вместе (какКак прокомментировал BalusC, это может привести к SQL-инъекции) и следовать спецификации JavaBeans.

Это пример того, что я имел в виду:

Пользователь JavaBean:

public class UserEntity implements Serializable {

 private String firstName;
 private String middleName = "";
 private String lastName;
 private Gender gender;
 private String emailAddress;
 private Date birthDate;
        private boolean searchable = false;

        //Getters and Setters here...

}

MySQLUserDAO, я отобразил свою сущность (javabean) из ResultSet.

protected UserEntity mapEntity(ResultSet rs) throws SQLException {
  // TODO Auto-generated method stub
  UserEntity user = null;

  if (rs != null) {
   user = new UserEntity();

   user.setId(rs.getLong("USER_ID"));
   user.setFirstName(rs.getString("FIRST_NAME"));
   user.setMiddleName(rs.getString("MIDDLE_NAME"));
   user.setLastName(rs.getString("LAST_NAME"));
   user.setEmailAddress(rs.getString("EMAIL_ADDRESS"));

   String gender = rs.getString("GENDER");
   if ("M".equals(gender)) {
    user.setGender(Gender.MALE);
   } else if ("F".equals(gender)) {
    user.setGender(Gender.FEMALE);
   }

   user.setBirthDate(rs.getDate("DOB"));
   user.setCreationDate(rs.getDate("CREATION_DATE"));
                        user.setSearchable(rs.getBoolean("SEARCHABLE"));
  }

  return user;
 }

И, наконец, метод retrieve() (из MySQLUserDAO).

public UserEntity retrieve(Long id) throws DAOException {
  // TODO Auto-generated method stub
  PreparedStatement ps = null;
  ResultSet rs = null;
  UserEntity user = null;

  try {
   ps = getConnection().prepareStatement(SQL_RETRIEVE);
   ps.setLong(1, id);
   rs = ps.executeQuery();
   if (rs != null && rs.next()) {
    user = mapEntity(rs);
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   throw new DAOException(e);
  } finally {
   try {
    close(rs, ps);
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    logger.error("Error closing statement or resultset.", e);
   }
  }

  return user;
 }

сейчас, чтобы использовать UserEntity для JSP, я делаю ....

UserEntity user = MySQLUserDAO.retrieve(userId); //Pseudocode....
request.setAttribute("user", user);

и, используя JSTL, я могу сделать:

<c:out value="${user.firstName}">

, где user - это имя атрибута иззапрос (который возвращает UserEntity user) и firstName вызывает user.getFirstName() (метод из UserEntity).

Надеюсь, вы последуете примеру BalusC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...