2010-02-07 3 views
1

Мой клиент дал мне HTML-шаблон для выставления счетов, и мне нужно включить в мой текущий проект JSP/Servlet. Это необработанный HTML-файл, и вывод должен быть точно таким же, как и разрывы страниц и т. Д. Он имеет одну таблицу заголовков и одну таблицу подробностей, такую ​​как наш обычный счет-фактура. Любая идея, как отображать детали в отчете от Servlet/JSP?html report in jsp

+0

была ли ваша проблема решена предоставленными вами ответами? обеспечить обратную связь. – Bozho

+0

извините за задержку ответа! да, мне удалось кое-что получить, чтобы запустить мой html-шаблон на основе инструкций, данных mr.balusc. еще раз мои извинения, все же я чувствую, что нужно многому научиться, попробует их в автономном режиме и вернется сюда в случае каких-либо проблем, как обычно. – sansknwoledge

ответ

3

Просто поместите его в файл JSP и заменить все, что нужно, чтобы динамически генерироваться библиотеки тегов и EL. Вы можете использовать JSP как шаблон для отображения HTML (и CSS/JS) обычным способом. Вы можете использовать EL для доступа к «задним» данным (все, что было помещено как атрибут в области page, request, session или application), и вы можете использовать taglib для динамического управления потоком страниц.

Как указано Bozho, вы можете использовать JSTL (только падение jstl-1.2.jar в WebApp-х /WEB-INF/lib) c:forEach перебрать коллекцию JavaBeans. Вы можете использовать EL для доступа к свойствам Javabean. Вы можете создать бина, который представляет собой Order (а также Customer и Item):

public class Order { 
    private Long id; 
    private Date timestamp; 
    private Customer customer; 
    private List<Item> items; 
    // Add/generate public getters and setters. 
} 

Вы можете использовать Servlet, чтобы получить Order из базы данных и направить запрос в файл JSP для отображения. Например.

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    Long orderId = Long.valueOf(request.getParameter("orderId")); 
    Order order = orderDAO.find(orderId); 
    request.setAttribute("order", order); 
    request.getRequestDispatcher("/WEB-INF/report.jsp").forward(request, response); 
} 

Карта этого Servletweb.xml в ПРОИЗВОДИМОМ url-pattern, так что вы можете назвать его по POST форме или, может быть, просто с помощью GET ссылки (замените doPost() на doGet() тогда). Вы видите, что Servlet помещает найденный order в область запроса (чтобы он был доступен в EL на ${order}) и пересылает запрос на JSP для отображения. Вы также видите, что JSP помещается в /WEB-INF, чтобы предотвратить прямой доступ к странице (например, введя URL JSP в адресную строку браузера).

В отчете вы можете получить доступ к Order так:

<h1>Order header</h1> 
<table> 
    <tr><th>Order ID:</th><td>${order.id}</td></tr> 
    <tr><th>Order timestamp:</th><td><fmt:formatDate value="${order.timestamp}" dateStyle="long" /></td></tr> 
    <tr><th>Customer name:</th><td>${order.customer.name}</td></tr> 
    <tr><th>Customer address:</th><td>${order.customer.address}</td></tr> 
</table> 

<h2>Order details</h2> 
<table> 
    <tr> 
     <th>Name</th> 
     <th>Description</th> 
     <th>Quantity</th> 
     <th>Price</th> 
    </tr> 
    <c:forEach items="${order.items}" var="item"> 
     <tr> 
      <td>${item.name}</td> 
      <td>${item.description}</td> 
      <td>${item.quantity}</td> 
      <td><fmt:formatNumber value="${item.price}" type="currency" currencySymbol="&euro;" /></td> 
     </tr> 
    </c:forEach> 
</table> 

Обратите внимание, что выше только простой пример. Конечно, вам нужно использовать свой HTML-шаблон.

+0

Извините за то, что вы настолько наивны, в чем разница btwn $ и # в EL @Bozho, так как голосование уже добавлено к вашему котенку, я отброшу свое продвижение на Mr.BalusC :-) завтра, когда я закончу это – sansknwoledge

+0

'# {}' нотация - это новый/унифицированный EL, обычно используемый только в JSF/Facelets, а не в простом ванильном JSP. Bozho сидит слишком долго/много в мире JSF :) – BalusC

+0

еще один вопрос, связанный с этим кодом, получил бит, содержащий данные заголовка dc, а также содержит список (dc itmes), теперь я поражен заполнением компонента в сервлете, мой код в сервлет Строка dcno = request.getParameter ("dcno"); CallableStatement cb = con.prepareCall ("{вызов spPrintDC (?)}"); cb.setString (1, dcno); ResultSet rs = cb.executeQuery(); ArrayList datalist = new ArrayList (); если (! Rs.wasNull()) { в то время как (rs.next()) {// datalist.add()}} trnprintdc фасоль имеет еще listof dcdetails в нем, список инструкций для dcdtls номер . :-( – sansknwoledge

1

Скопируйте в нее большую часть. Затем отредактируйте его, так что каждая строка (<tr>) таблицы должны содержать одну строку из данных, так что используйте:

<table> 
    <c:forEach items="#{yourData} var="#{row}"> 
     <tr> 
     <td>#{row.datum1}</td> 
     <td>#{row.datum2}</td> 
     </tr> 
    </c:forEach> 
</table>