Java 向Web应用程序添加服务层以在jsp上显示DB内容

Java 向Web应用程序添加服务层以在jsp上显示DB内容,java,mysql,jsp,spring-mvc,servlets,Java,Mysql,Jsp,Spring Mvc,Servlets,A产品DAO: A Product class representing a real world entity of a product, it should be just a Javabean. public class Product { private Long id; private String name; private String description; private BigDecimal price;

A产品DAO:

A Product class representing a real world entity of a product, it should be just a Javabean.

public class Product {
        private Long id; 
        private String name;
        private String description;
        private BigDecimal price;

        // Add/generate getters/setters/c'tors/equals/hashcode boilerplate.
    }
公共类ProductDAO{
public List()引发SQLException{
连接=空;
PreparedStatement=null;
ResultSet ResultSet=null;
列表产品=新的ArrayList();
试一试{
connection=database.getConnection();
语句=connection.prepareStatement(“从产品中选择id、名称、描述、价格”);
resultSet=statement.executeQuery();
while(resultSet.next()){
产品=新产品();
product.setId(resultSet.getLong(“id”);
product.setName(resultSet.getString(“name”);
product.setDescription(resultSet.getString(“description”);
product.setPrice(resultSet.getBigDecimal(“价格”));
产品。添加(产品);
}
}最后{
如果(resultSet!=null),请尝试{resultSet.close();}catch(SQLException ignore){}
如果(statement!=null),请尝试{statement.close();}catch(SQLException ignore){}
如果(connection!=null),请尝试{connection.close();}catch(SQLException ignore){}
}
退货产品;
}
}
要获取列表,请执行以下操作:

public class ProductDAO {

    public List<Product> list() throws SQLException {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        List<Product> products = new ArrayList<Product>();

        try {
            connection = database.getConnection();
            statement = connection.prepareStatement("SELECT id, name, description, price FROM product");
            resultSet = statement.executeQuery();

            while (resultSet.next()) {
                Product product = new Product();
                product.setId(resultSet.getLong("id"));
                product.setName(resultSet.getString("name"));
                product.setDescription(resultSet.getString("description"));
                product.setPrice(resultSet.getBigDecimal("price"));
                products.add(product);
            }
        } finally {
            if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
            if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
            if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
        }

        return products;
    }

}
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
试一试{
List products=productDAO.List();
request.setAttribute(“products”,products);//将作为${products}在JSP中提供
request.getRequestDispatcher(“/WEB-INF/products.jsp”).forward(请求,响应);
}捕获(SQLE异常){
抛出新的ServletException(“无法从DB获得产品”,e);
}
}
最后是jsp:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        List<Product> products = productDAO.list();
        request.setAttribute("products", products); // Will be available as ${products} in JSP
        request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);
    } catch (SQLException e) {
        throw new ServletException("Cannot obtain products from DB", e);
    }
}

...
${product.name}
${product.description}
${product.price}

伙计们,我从Stackoverflow自己那里得到了这个代码。。。。这和我正在做的项目很相似。。。我只是想知道,如果我想添加服务层到这个应用程序我必须做什么改变。。。我尝试将列表放入另一个方法中,但它出现了一些错误。。。所以请有人在这方面指导我。。。。从servlet到服务,最后从服务到DAO,应该有一个方法。请指导我….

您必须创建一个新的服务类,如下所示:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<table>
    <c:forEach items="${products}" var="product">
        <tr>
            <td>${product.name}</td>
            <td>${product.description}</td>
            <td>${product.price}</td>
        </tr>
    </c:forEach>
</table>
public class ProductService {
    ProductDAO productDAO = new ProductDAO();

    public List<Product> list() throws SQLException{
       return productDAO.list();
    }
}
然后修改doGet以使用服务而不是DAO:

ProductService productService = new ProductService();
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
试一试{
List products=productService.List();
request.setAttribute(“products”,products);//将作为${products}在JSP中提供
request.getRequestDispatcher(“/WEB-INF/products.jsp”).forward(请求,响应);
}捕获(SQLE异常){
抛出新的ServletException(“无法从DB获得产品”,e);
}
}

这是一个让您开始学习的示例。您应该将SQLException处理移到服务类而不是servlet。

非常感谢您的回答。。。。。我就是这样做的,而且成功了。。。。谢谢你的指导。。。。。
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            List<Product> products = productService.list();
            request.setAttribute("products", products); // Will be available as ${products} in JSP
            request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);

        } catch (SQLException e) {
            throw new ServletException("Cannot obtain products from DB", e);
        }
}