Другой вопрос был назван дубликатом этого:
В C ++ почему результат cout << x
отличается от значения, которое показывает отладчик для x
?
x
в вопросе - это переменная float
.
Одним из примеров может быть
float x = 9.9F;
Отладчик показывает 9.89999962
, вывод работы cout
- 9.9
.
Ответ оказывается, что точность cout
по умолчанию для float
равна 6, поэтому она округляется до шести десятичных цифры
См. здесь для справки
Вы можете использовать тег <c:forEach >
, вы можете найти подробный пример в следующей ссылке example use
В хорошо разработанном подходе MVC файл JSP не должен содержать строку Java-кода, и класс сервлета не должен содержать строку JDBC-кода.
Предполагая, что вы хотите показать список в веб-магазине должен быть создан следующий код.
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.
}
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;
}
}
@WebServlet("/products")
public class ProductsServlet extends HttpServlet {
@Resource(name="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);
}
}
}
/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
MVC в контексте веб-приложения не состоит в использовании класса из JSP. Он состоит в использовании следующей модели:
Поскольку JSP обычно использует JSP-теги (например, JSTL) и язык выражения JSP , и поскольку JSP-теги и EL предназначены для получения информации от JavaBeans, вам лучше иметь ваши данные в форме JavaBeans или коллекций JavaBeans.
Роль контроллера (класса действия) заключается в том, чтобы извлечь данные, создать экземпляры JavaBean, содержащие данные, в подходящем формате для JSP, чтобы поместить их в атрибуты запроса, а затем отправка в JSP. Затем JSP перебирает экземпляры JavaBean и показывает, что они содержат.
Вы не должны сами реализовать структуру MVC. Используйте существующие (Stripes, Struts и т. Д.)
Я не знаю, как мне вернуть ResultSet из файла класса на страницу JSP
Ну, вы этого не сделаете.
Точка MVC заключается в том, чтобы отделить вашу модель (в этом случае от M-информации в БД) от вашего вида (V a jsp, в данном случае) таким образом, вы можете изменить представление без торможения в приложении ,
Для этого вы можете использовать промежуточный объект для представления ваших данных (обычно называемый DTO - после объекта передачи данных - не знаю, как они его называют в наши дни) и другого объекта для его извлечения ( обычно DAO).
Итак, у вас есть свой JSP-файл, получите параметры запроса, а затем вызовите метод из DAO. Дао, внутренне имеет средства для подключения к db и выборки данных и сборки коллекций DTO, которые возвращаются в JSP для рендеринга.
Что-то вроде этого чрезвычайно упрощенного (и небезопасного) кода:
Employee.java
class Employee {
String name;
int emplid;
}
EmployeeDAO.java
class EmployeeDAO {
... method to connect
etc.
List<Employee> getAllNamed( String name ) {
String query = "SELECT name, emplid FROM employee where name like ?";
ResultSet rs = preparedStatement.executeQuery etc etc.
List<Employee> results = ....
while( rs.hasNext() ) {
results.add( new Employee( rs.getString("name"), rs.getInt("emplid")));
}
// close resources etc
return results;
}
}
employee.jsp
<%
request.setAttribute("employees", dao.getAllNamed( request.getParameter("name") );
%>
<table>
<c:forEach items="${employees}" var="employee">
<tr><td>${employee.emplid}</td><td>${employee.name}</td></tr>
</c:forEach>
</table>
Надеюсь, это даст вам лучшую идею.
Я думаю, вам будет лучше содержать данные таблицы в коллекции, такой как список, и вернуть список из класса Java и повторно использовать эту коллекцию в JSP.