Java:how to pass value from class/bean to servlet

17,836

You don't pass something into a servlet. You just let the servlet access something.

You should get rid of that main() method and move the database interaction code into a DAO class. I'd also give the model class (with timezone and location) a more sensitive name starting with an uppercase. So all with all, you should update the code so that it look something like the following:

Model class, the Area (name it whatever you want, as long as it makes sense), it should just represent a single entity:

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; }
}

Basic connection manager class, the Database, here you load the driver just once and provide a getter for the connection:

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 class, the AreaDAO, here you put all DB interaction methods:

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;
    }
}

Finally, in the servlet initialize the DAO once and obtain the list in the HTTP method:

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);
        }
    }
}

Map this servlet on an url-pattern of /areas in web.xml so that you can invoke it by http://example.com/contextname/areas

The /WEB-INF/areas.jsp can look like something this, assuming that you want to display the areas in a table:

<table>
    <c:forEach items="${areas}" var="area">
        <tr>
            <td>${area.location}</td>
            <td>${area.timezone}</td>
        </tr>
    </c:forEach>
</table>

See also:

Share:
17,836
Admin
Author by

Admin

Updated on June 23, 2022

Comments

  • Admin
    Admin almost 2 years

    i am new to java, i'm having problem passing value from a class/bean (which are stored in arraylist) to servlet. any idea how can i achieve that? below is my code.

    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);
            }
    
    }
    }
    

    And this is the Servlet

    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);
    }
    
    }
    

    i dont know if my code is right, pls advise me. thanks lot ^^