Java: как передать значение из класса / компонента в сервлет - PullRequest
3 голосов
/ 27 июля 2010

Я новичок в Java, у меня проблемы с передачей значения из класса / bean (которые хранятся в arraylist) в сервлет Любая идея, как я могу этого достичь? ниже мой код.

package myarraylist;

public class fypjdbClass {

String timezone;
String location;

public String getTimezone() {
    return timezone;
}
public void setTimezone(String timezone) {
    this.timezone = timezone;
}
public String getLocation() {
    return location;
}


public void setLocation(String location) {
    this.location = location;
}

public fypjdbClass() {
    super();
    ArrayList<fypjdbClass> fypjdbList = new ArrayList<fypjdbClass>();
    this.timezone = timezone;
    this.location = location;
}

public static void main(String[] args) {


    //Establish connection to MySQL database
    String connectionURL = "jdbc:mysql://localhost/fypjdb";
    Connection connection=null;
    ResultSet rs;

    try {
         // Load the database driver
        Class.forName("com.mysql.jdbc.Driver");

        // Get a Connection to the database
        connection = DriverManager.getConnection(connectionURL, "root", ""); 
        ArrayList<fypjdbClass> fypjdbList = new ArrayList<fypjdbClass>();
        //Select the data from the database
           String sql = "SELECT location,timezone FROM userclient";
        Statement s = connection.createStatement();
        //Create a PreparedStatement
        PreparedStatement stm = connection.prepareStatement(sql);
        rs = stm.executeQuery();
        //rs = s.getResultSet();
        while(rs.next()){

            fypjdbClass f = new fypjdbClass(); 

            f.setTimezone(rs.getString("timezone"));
            f.setLocation(rs.getString("location"));

            fypjdbList.add( f);

        }



        for (int j = 0; j < fypjdbList.size(); j++) {
            System.out.println(fypjdbList.get(j));

          }
        //To display the number of record in arraylist
        System.out.println("ArrayList contains " + fypjdbList.size() + " key value pair.");


        rs.close ();
        s.close ();
        }catch(Exception e){
        System.out.println("Exception is ;"+e);
        }

}
}

А это сервлет

package myarraylist;

public class arraylistforfypjServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

/**
 * @see HttpServlet#HttpServlet()
 */
public arraylistforfypjServlet() {
    super();
}

public static ArrayList<fypjdbClass> fypjdbList = new ArrayList<fypjdbClass>();

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
    //processRequest(request, response); 

    RequestDispatcher rd = request.getRequestDispatcher("/DataPage.jsp"); //You could give a relative URL, I'm just using absolute for a clear example.
    ArrayList<fypjdbClass> fypjdbList = new ArrayList<fypjdbClass>();// You can use any type of object you like here, Strings, Custom objects, in fact any object.
    request.setAttribute("fypjdbList", fypjdbList);
    rd.forward(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
    //processRequest(request, response);
    doGet(request,response);
}

}

Я не знаю, правильный ли мой код, пожалуйста, сообщите мне. спасибо большое ^^

Ответы [ 3 ]

6 голосов
/ 27 июля 2010

Вы не передаете что-то в сервлет. Вы просто позволяете сервлету получить доступ к чему-либо.

Вам следует избавиться от этого 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>

Смотри также:

1 голос
/ 27 июля 2010

Зачем путать новичка с разными узорами! @OP - Измените метод main (), чтобы он возвращал данные вместо void, и создайте экземпляр для этого класса в сервлете.

0 голосов
/ 27 июля 2010

Похоже, вы пытаетесь загрузить данные из базы данных в fypjdbList ArrayList в вашем сервлете.

Это не работает, потому что ваш сервлет не вызывает код базы данных.Код вашей базы данных находится в main методе fypjdbClass;метод main обычно используется консольными или настольными приложениями Java, но не в приложении Java-сервлетов.

Лучший способ извлечь данные из базы данных - создать объект доступа к данным (DAO).Это класс Java, который содержит только код для доступа к базе данных.DAO извлекает данные для вас, но не хранит сами данные (они не будут содержать timezone или location).Концепция DAO объяснена в http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

Google найдет для вас несколько учебных пособий по DAO (я не могу опубликовать ссылки здесь, потому что, как новый участник переполнения стека, я могу опубликовать только одну ссылку!)

Написание сервлетов полезно при изучении Java, но если вы хотите создать полноценный веб-сайт, вам, вероятно, будет проще использовать такую ​​среду, как Spring MVC (часть Spring Framework).Spring MVC предлагает подробное пошаговое руководство, которое очень полезно, если вы новичок в веб-разработке на Java.

...