Статьи

Учебное пособие по Java EE: JSP 2.2 и сервлетам 3.0 с контейнером сервлетов из смолы: часть третья

Учебник по сервлету Java EE: использование JSP для создания верхнего колонтитула, области нижнего колонтитула, форматирования и базового CSS для книжного магазина

содержание

  • Учебник по сервлету Java EE / JSP: очистка нашего графического интерфейса
  • Добавление шаблона сайта с использованием jsp: include, добавление CSS, использование JSTL fmt: formatDate и fmt: formatNumber
  • Определение простого шаблона с помощью JSP parma.X

    • /WEB-INF/pages/template.jsp
  • Вызов шаблона из book-form.jsp и book-list.jsp

    • /WEB-INF/pages/book-form.jsp
  • template.jsp пройтись

    • /WEB-INF/pages/template.jsp директива страницы и включает ядро ​​JSTL
    • /WEB-INF/pages/template.jsp/li>
    • /resources/style.css
  • Форматирование дат и чисел в book-list.jsp с помощью fmt: formatNumber и fmt: formatDate

    • /WEB-INF/pages/book-list-content.jsp
  • Список книг Использование c: forEach varStatus для чередования цветов строк в таблице

    • /resources/style.css
    • /WEB-INF/pages/book-list-content.jsp c: forEach varStatus
  • Форма книги

    • /WEB-INF/pages/book-form-content.jsp
  • И последнее, но не менее важное: footer.jsp и header.jsp

    • /WEB-INF/pages/footer.jsp
    • /WEB-INF/pages/header.jsp

Учебник по сервлету Java EE / JSP: очистка нашего графического интерфейса

Это руководство является частью Учебника по Java EE, охватывающего JSP_2.2 и Сервлеты 3.0 .

Мы собираемся провести некоторую очистку графического интерфейса (чтобы он выглядел прилично или, возможно, несколько прилично).

Добавление шаблона сайта с использованием jsp: include, добавление CSS, использование JSTL fmt: formatDate и fmt: formatNumber

После последнего шага у нас есть рабочий список книг CRUD, который реализует элементарную архитектуру модели 2. Мы можем добавлять, редактировать / обновлять, перечислять и читать. Прежде чем мы добавим больше функциональности, давайте создадим шаблон сайта с помощью jsp: include.

Это основано на первых двух уроках. Я предлагаю начать с тех, кто хочет согласованности, и, возможно, нет, если вы просто ищете быстрый ответ для использования CSS, jsp: include и т. Д.

Многие люди используют Tiles (каркас расширения JSP) вместо JSP. Когда впервые вышел Tiles, JSP был несколько ограничен в возможностях повторного использования страниц JSP. JSP улучшился и теперь имеет файлы тегов JSP (описанные в более поздней кулинарной книге). Это не означает, что вам следует избегать использования Tiles, а просто заявляет, что если у вас нет очень сложного макета сайта и, возможно, даже если у вас сложный макет сайта, JSP обычно достаточно. Не добавляйте сложность и другую структуру, которую вы должны изучить, если и до тех пор, пока вы не изучите, что на самом деле может делать JSP. 

Позвольте мне выразить это иначе: не включайте инфраструктуру Tiles в новое приложение, пока вы полностью не изучите файлы тегов JSP. Если вы знаете и любите Tiles, то, возможно, было бы неплохо придерживаться его в новом проекте, но если вы не знакомы с Tiles, начните с включений JSP и файлов тегов JSP (будет рассказано позже).

Определение простого шаблона с помощью JSP parma.X

Вот пример шаблона JSP.

/WEB-INF/pages/template.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML>
<html>
<head>
<title>${param.title}</title>
<link rel="stylesheet" type="text/css"
 href="${pageContext.request.contextPath}/resources/style.css" />
</head>
<body>
	<jsp:include page="/WEB-INF/pages/header.jsp"/>




	
	<h1>${param.title}</h1>




	<jsp:include page="/WEB-INF/pages/${param.content}.jsp"/>
	
	<jsp:include page="/WEB-INF/pages/footer.jsp"/>
	
	
</body>
</html>

Этот шаблон будет вызываться book-form.jsp и book-list.jsp. Это позволяет нам удалить весь HTML-код рабочей таблицы из book-form.jsp и book-list.jsp. Когда book-form.jsp и book-list.jsp вызывают template.jsp, они передают два параметра через jsp: param, а именно заголовок и контент. Заголовок — это заголовок страницы, а контент — это краткое имя JSP, которое фактически является содержимым страницы.

Личное примечание: мне нравится, что мои фрагменты JSP хорошо сформированы, т. Е. Мне не нравится начинать тег типа <body> на одной странице JSP и заканчивать его на другой. За эти годы я обнаружил, что это делает шаблоны JSP очень сложными для изменения и поддержки. Это скорее личное предпочтение, чем лучшая практика.

Вызов шаблона из book-form.jsp и book-list.jsp

Вот book-form.jsp и book-list.jsp, вызывающие шаблон с помощью <jsp: include>

/WEB-INF/pages/book-list.jsp

<jsp:include page="/WEB-INF/pages/template.jsp">
	<jsp:param name="content" value="book-list-content"/>
	<jsp:param name="title" value="Book Listing"/>
</jsp:include>

/WEB-INF/pages/book-form.jsp

<jsp:include page="/WEB-INF/pages/template.jsp">
	<jsp:param name="content" value="book-form-content"/>
	<jsp:param name="title" value="Book Form"/>
</jsp:include>

) — энтузиаст Java EE / Servlet и энтузиаст Open Source, который любит работать с контейнерным сервлетом Caucho Servlet, контейнером сервлетов Java EE Web Profile.

Смола Контейнер сервлетов с открытым исходным кодом Caucho Контейнер сервлетов веб-профиля Java EE
template.jsp

Сам шаблон позволяет нам обрабатывать все распространенные задачи для макета сайта в одном месте. Логика этого шаблона довольно проста, но, поскольку он может и использует ключевые теги JSTL, логика может быть намного более сложной.

Давайте пройдемся по этому шаблону шаг за шагом:

/WEB-INF/pages/template.jsp директива страницы и включает ядро ​​JSTL

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>




Выше мы просто делаем нашу стандартную директиву страницы JSP и импортируем библиотеку тегов ядра JSTL для логики отображения.

/WEB-INF/pages/template.jsp

<!DOCTYPE HTML>
<html>
<head>
<title>${param.title}</title>
<link rel="stylesheet" type="text/css"
 href="${pageContext.request.contextPath}/resources/style.css" />
</head>
<body>

Выше определено, что базовая структура HTML замечает, что мы импортируем файл CSS с именем /resources/style.css. Это определяет внешний вид нашего сайта.

Обратите внимание, что style.css — это код CSS, скопированный из различных руководств и примеров шаблонов CSS, с небольшими изменениями. Подлинное освещение CSS выходит за рамки данного руководства и кулинарной книги. Но общая стратегия, которую я использовал для создания CSS, заключается в следующем: 

  1. Спросите клиента, как он может выглядеть на сайте, попросите его отправить вам ссылки на похожие сайты.
  2. посмотрите, хватит ли бюджета, чтобы нанять кого-то, кто артистичен, обладает стилем и любит заниматься дизайном сайта, если затем нанять его, и пусть он делает все, что нужно для пиксельного толчка
  3. Если нет бюджета, чтобы нанять кого-то, кто хорошо разбирается в веб-дизайне, поищите в Интернете примеры проектов CSS и / или посмотрите сайты, которые понравились клиентам, стиль копирования и макет CSS.

Проблема с вышесказанным заключается в том, что клиенты не всегда сообщают вам, чего они хотят, но очень четко понимают, чего они не хотят. Я сделал все три. Я предпочитаю, чтобы другие присылали мне внешний вид, макеты (предпочли макеты, выполненные в CSS и HTML), а затем я взламывал их, пока они не выглядели достаточно близко. Вы должны изучить CSS достаточно хорошо, чтобы использовать CSS, который вы найдете в Интернете. Начните с изучения этого учебного руководства по CSS для школ W3 . Бывают случаи, когда вы просто не можете найти пример CSS, который вам нужен, в таких случаях вам может быть полезно ознакомиться с фактической спецификацией CSS .

Вот полнота style.css (пожалуйста, только просмотрите его), обратите внимание, что это набор материалов, которые я мог бы найти за пять минут, чтобы сайт выглядел несколько прилично, не тратя много времени. (Цветовой образец для образца действительно отвратителен в настоящее время, H1 мультипликационно большой, а логотип слишком большой, и я не собираюсь ничего менять, никогда.)

/resources/style.css

/* The CSS for the table was based of an example at wc3 schools. 
http://www.w3schools.com/css/tryit.asp?filename=trycss_table_fancy
*/
table.listing 
{
font-family: Arial, Helvetica, sans-serif;
width:80%;
border-collapse:collapse;
}








.listing td, th 
{
font-size:1em;
border:1px solid #98bf21;
padding:3px 7px 2px 7px;
}




.listing th
{
font-size:1.1em;
text-align:left;
padding-top:5px;
padding-bottom:4px;
background-color:#A7C942;
color:#ffffff;
}




.listing tr.alt td 
{
color:#000000;
background-color:#EAF2D3;
}








/* unvisited link */
a:link 
{
	text-decoration:none;
	color:#000000; 
}




/* visited link */
a:visited 
{
	text-decoration:none; 
	color: #707070 ;
}




a:hover {text-decoration:underline;}   /* mouse over link */
a:active {text-decoration:underline;}  /* selected link */




/* The CSS for the form was taken from this project. 
https://github.com/pmcelhaney/semantic-form.css/blob/master/index.html
*/




form.semantic {
	width:70%;
}




form.semantic fieldset
{
	clear: both;
	margin: 1em 0 0 0;
	padding: 10px;
	overflow: auto;
	background-color: #f8f8f8;
	border: 1px solid #888;
}




form.semantic legend
{
	font-weight: bold;
}




form.semantic div
{
	clear: both;
	margin: 0;
	padding: 0.5em 0 0 0;
	overflow: visible;
}








form.semantic label 
{
	display: block;
	float: left;
	width: 120px;
	text-align: right;
	padding: 2px 1ex 6px 0;
	vertical-align: baseline;
}
          
form.semantic label.after 
{
	width: auto;
	text-align: left; 
	display: inline; 
	float: none;
}




form.semantic label.long 
{
	clear: both;
	width: auto;
	text-align: left;
	float: none;
}




form.semantic input
, form.semantic select
, form.semantic textarea
{
	float: left;
}




form.semantic input.date {
	width : 100px;
}








form.semantic input.money {
	width : 100px;
}




form.semantic input[type=radio]
, form.semantic input[type=checkbox]
{
	vertical-align: text-bottom;
}




form.semantic ul {
	list-style-type: none; 
	float: left;
	padding: 0;
	margin: 0;
}




form.semantic li {
	clear: both;
	padding: 0.2em 0;
}




form.semantic li label {
	width: auto;
	text-align: left;
	padding: 0;
}   




form.semantic div.field-row 
{
	clear: none;
	float: left;
	margin: 0;
	padding: 0;
	overflow: visible;
}




form.semantic div.field-row *
{
	float: none;
	display: inline;
}




form.semantic .button-row
{
	text-align: right;
}




form.semantic .button-row input
{
	float: none;
}




form.semantic div.long label 
{
	width: auto;
	text-align: left;  
	float: none;
}




form.semantic div.long textarea 
{
	width: 100%;
}




/* Errors -- for use with JQuery Validate, etc. */




form.semantic input.error
, form.semantic select.error
, form.semantic textarea.error
{
	background-color: #77002a;
	color: white;
}                                                




form.semantic label.error
{
	width: auto;
	color: #77002a;
	text-align: left;
}       




/* from caucho.com */
#footer hr
{
  width: 100%;
}
#footer
{
  font-size: 80%;
  text-align: right;
}




/* bottom nav */




.bottom {
  font-family: Verdana, Helvetica, Arial, sans-serif;
  font-size : 90%;
  color : #999;
}




ul.bottom {
  list-style-type : none;
  padding : 0em;
  margin : 0;
  margin-top : 3em;
  text-align : center;
}




.bottom li {
  display : inline;
  margin : 0.1em 0.1em;
  padding : 0.0em;
}




.bottom a {
  color : #999;
}




.bottom a:hover {
  color : #ffcc33;
}




/* bottom */




.about {
  color : #999;
  font-family : Helvetica, Arial, sans-serif;
  text-align : center;
  font-size : 90%;
}




div.about {
  margin-top : 1em;
}




) — энтузиаст Java EE / Servlet и энтузиаст Open Source, который любит работать с контейнерным сервлетом Caucho Servlet, контейнером сервлетов Java EE Web Profile.

Смола Контейнер сервлетов с открытым исходным кодом Caucho Контейнер сервлетов
веб-профиля Java EE

Вы можете заметить, что я сейчас использую эти стили в book-form-content.jsp и book-list-content.jsp.

Форматирование дат и чисел в book-list.jsp с помощью fmt: formatNumber и fmt: formatDate

На последнем шаге урока список книг не очень хорошо отформатировал даты или число. JSTL включает библиотеку тегов формата для форматирования чисел и дат, которую мы можем использовать в book-list.jsp следующим образом:

/WEB-INF/pages/book-list-content.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix ="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix ="fmt" %>




<a href="${pageContext.request.contextPath}/book">Add Book</a>




<table class="listing">
	<tr>
		<th>Title</th>
		<th>Description</th>
		<th>Price</th>
		<th>Publication Date</th>
	</tr>
	
	<c:forEach var="book" items="${books}" varStatus="status">
		<tr class="${status.index%2==0 ? 'alt' : ''}">
			<td><a href="${pageContext.request.contextPath}/book?id=${book.id}">${book.title}</a></td>
			<td>${book.description}</td>
			<td>
			<fmt:formatNumber value="${book.price}" type="currency"/>
			</td>
			<td>
			<fmt:formatDate value="${book.pubDate}" type="both" dateStyle ="short" timeStyle ="short"/>
			</td>
		</tr>
	</c:forEach>
</table>












Notice the use of <code>fmt:formatNumber</code> and <code>fmt:formatDate</code> as follows:




==== /WEB-INF/pages/book-list-content.jsp fmt:formatNumber and fmt:formatDate====
<pre>
<a href="${pageContext.request.contextPath}/book">Add Book</a>
...




			<fmt:formatNumber value="${book.price}" type="currency"/>
...
			<fmt:formatDate value="${book.pubDate}" type="both" dateStyle ="short" timeStyle ="short"/>
</table>




Fmt: formatNumber форматирует цену как валюту, а fmt: formatDate форматирует дату публикации, используя краткую форму. Мы более подробно рассмотрим теги этого формата, когда рассмотрим интернационализацию (i18n), поскольку и эти теги, и другие теги из библиотеки JSTL fmt поддерживают i18n. Чтобы узнать больше об этих тегах, смотрите документацию как в  документации JSTL fmt .

Список книг Использование c: forEach varStatus для чередования цветов строк в таблице

Вы можете использовать c: forEach varStatus, чтобы чередовать цвета строк с CSS.

В файле CSS (/resources/style.css) мы определили это правило CSS:

/resources/style.css

...
.listing tr.alt td 
{
color:#000000;
background-color:#EAF2D3;
}
...

Выше в основном говорится, что если вы находитесь в таблице, которая использует класс листинга, и это тег строки (<tr>), который использует класс alt, то установите цвет # 000000 и цвет фона столбца (td ) к # EAF2D3. 

Теперь с точки зрения JSP / JSTL нам нужно определить четные строки и вывести атрибут класса строки как alt. Вы можете сделать это с помощью varStatus следующим образом:

/WEB-INF/pages/book-list-content.jsp c: forEach varStatus

...
	<c:forEach var="book" items="${books}" varStatus="status">
		<tr class="${status.index%2==0 ? 'alt' : ''}">
...

С: Foreach в varStatus = «статус» захватывает статусный объект в качестве переменных мы можем использовать. Объект состояния имеет текущий индекс, а также другие свойства о текущем состоянии цикла .

Выражение $ {status.index% 2 == 0? ‘alt’: } говорит, что выводит alt, если эта строка даже не выводит пустую строку. Это связывает каждую четную строку с классом alt CSS.

Форма книги

С самой формой книги ничего не изменилось, кроме как мы переместили ее в book-form-content.jsp, чтобы воспользоваться новым шаблоном.

/WEB-INF/pages/book-form-content.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>




<form class="semantic" method="post"
	action="${pageContext.request.contextPath}/book">
	<fieldset>
		<legend>
			<c:choose>
				<c:when test="${not empty book.id }">
						Updating Book
					</c:when>
				<c:otherwise>
						Adding Book
					</c:otherwise>
			</c:choose>
		</legend>




		<div>
			<label for="title">Title</label> <input type="text" name="title"
				id="title" value="${book.title}" />
		</div>




		<div>
			<label for="description">Description</label>
			<textarea name="description" id="description" rows="2" cols="60">${book.description}</textarea>
		</div>




		<div>
			<label for="price">Price prebuffer_9lt;/label> <input name="price" id="price"
				class="money" value="${book.price}" />
		</div>




		<div>
			<label for="pubDate">Publication Date</label> <input name="pubDate"
				id="pubDate" class="date" value="${bookPubDate}" /> <label
				class="after">(MM/DD/YYYY)</label>
		</div>




		<c:if test="${not empty book.id}">
			<input type="hidden" name="id" value="${book.id}" />
		</c:if>




	</fieldset>




	<div class="button-row">
		<a href="${pageContext.request.contextPath}/book/">Cancel</a>  or <input type="submit" value="Submit" />
	</div>
</form>

И последнее, но не менее важное: footer.jsp и header.jsp

Мы добавили две JSP, которые реализуют области верхнего и нижнего колонтитула нашего шаблона следующим образом:

/WEB-INF/pages/footer.jsp

<div id="footer">
  <ul class="bottom">
  <li><a href="http://www.caucho.com/">HOME</a> |
  <li><a href="http://www.caucho.com/about/contact/">CONTACT US</a> |
  <li><a href="http://www.caucho.com/resin-4.0/">DOCUMENTATION</a> |
  <li><a href="http://blog.caucho.com/">BLOG</a> |
  <li><a href="http://wiki.caucho.com/">WIKI</a>




  </ul>
  
  <div class="about">
Copyright (c) 1998-2012 Caucho Technology, Inc. All rights reserved.<br><span class="caucho">caucho<sub>�</sub></span> ,
<span class="resin">resin<sub>�</sub></span> and
<span class="quercus">quercus<sub>�</sub></span>




are registered trademarks of Caucho Technology, Inc.
  </div>




  <div class="about">
     resin<sub>�</sub> is a cloud optimized, java<sub>�</sub> application server that supports the java ee webprofile <sub>�</sub>
  </div>
</div>

/WEB-INF/pages/header.jsp

<div>
<a href="${pageContext.request.contextPath}">
<img src="${pageContext.request.contextPath}/resources/logo.png"/>
</a>
</div>

) — энтузиаст Java EE / Servlet и энтузиаст Open Source, который любит работать с контейнерным сервлетом Caucho Servlet, контейнером сервлетов Java EE Web Profile.

Смола Контейнер сервлетов с открытым исходным кодом Caucho Контейнер сервлетов
веб-профиля Java EE