Ответ 1
В хорошо спроектированном MVC-подходе файл JSP не должен содержать строку Java-кода, и класс сервлета не должен содержать строку JDBC-кода.
Предполагая, что вы хотите показать список продуктов в интернет-магазине, необходимо создать следующий код.
-
A
Product
класс, представляющий объект реального мира продукта, он должен быть просто 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. }
-
A DAO класс, который делает всю неприятную работу JDBC и возвращает приятный
List<Product>
.public class ProductDAO { private DataSource dataSource; public ProductDAO(DataSource dataSource) { this.dataSource = dataSource; } public List<Product> list() throws SQLException { List<Product> products = new ArrayList<Product>(); try ( Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT id, name, description, price FROM product"); ResultSet 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); } } return products; } }
-
A servlet класс, который получает список и помещает его в область запроса.
@WebServlet("/products") public class ProductsServlet extends HttpServlet { @Resource("jdbc/YourDB") // For Tomcat, define as <Resource> in context.xml and declare as <resource-ref> in web.xml. private DataSource dataSource; private ProductDAO productDAO; @Override public void init() { productDAO = new ProductDAO(dataSource); } @Override 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); } } }
-
Наконец, JSP файл в
/WEB-INF/products.jsp
, который использует JSTL<c:forEach>
, чтобы выполнить итерацию поList<Product>
, которая сделана в EL${products}
, и использует JSTL<c:out>
для удаления свойств строки, чтобы избежать XSS, когда речь идет о пользовательском входе.<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/format" prefix="fmt" %> ... <table> <c:forEach items="${products}" var="product"> <tr> <td>${product.id}</td> <td><c:out value="${product.name}" /></td> <td><c:out value="${product.description}" /></td> <td><fmt:formatNumber value="${product.price}" type="currency" currencyCode="USD" /></td> </tr> </c:forEach> </table>
Чтобы заставить его работать, просто вызовите сервлет по его URL-адресу. При условии, что сервлет аннотируется @WebServlet("/products")
или отображается в web.xml
с помощью <url-pattern>/products</url-pattern>
, вы можете называть его http://example.com/contextname/products
См. также:
- Как избежать Java-кода в JSP файлах?
- doGet и doPost в сервлетах
- Как подключиться к базе данных JDBC/источнику данных в приложении на основе сервлета?
- Веб-приложения с шаблонами проектирования
- RequestDispatcher.forward() vs HttpServletResponse.sendRedirect()
- Как сопоставить ResultSet с неизвестным количеством столбцов в списке и отобразить его в таблице HTML?
- Как передать текущий элемент методу Java, нажав гиперссылку или кнопку на странице JSP?