Вы находитесь на странице: 1из 23

JSP

Определение
• JSP (JavaServer Pages) — технология, позволяющая
веб-разработчикам создавать содержимое,
которое имеет как статические, так и
динамические компоненты. Страница JSP
содержит текст двух типов: статические исходные
данные, которые могут быть оформлены в одном
из текстовых форматов HTML, SVG, WML, или XML,
и JSP-элементы, которые конструируют
динамическое содержимое. Кроме этого могут
использоваться библиотеки JSP-тегов, а также EL
(Expression Language), для внедрения Java-кода в
статичное содержимое JSP-страниц.
Преимущества JSP: Что удобнее?
Схема работы JSP
JSP пример
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Order form</title>
</head>
<body>
<form action="/order" method="post">
<input type="hidden" name="id_customer" value="<%=request.getParameter("idCustomer") %>">
Product name: <input name="product"><br>
Product count:<input name="count" type="number"><br>
<input type="submit" value="Make order">
</form>
</body>
</html>
JSP: скомпилированный сервлет
/* Generated by the Jasper component of Apache Tomcat */
package org.apache.jsp;

public final class form2_jsp extends org.apache.jasper.runtime.HttpJspBase {


public void _jspInit() { }
public void _jspDestroy() { }
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException {
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true);
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
out.write("\r\n");
out.write("<html>\r\n");
out.write("\t<head>\r\n");
out.write("\t\t<meta charset=\"utf-8\">\r\n");
out.write("\t\t<meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\r\n");
out.write("\t\t<title>Order form</title>\r\n");
out.write("\t</head>\r\n");
out.write("\t<body>\r\n");
out.write("\t\t<form action=\"/order\" method=\"post\">\r\n");
out.write("\t\t\t<input type=\"hidden\" name=\"id_customer\" value=\"");
out.print(request.getParameter("idCustomer") );
out.write("\"> \r\n");
out.write("\t\t\tProduct name: <input name=\"product\"><br> \r\n");
out.write("\t\t\tProduct count:<input name=\"count\" type=\"number\"><br> \r\n");
out.write("\t\t\t<input type=\"submit\" value=\"Make order\">\r\n");
out.write("\t\t</form>\r\n");
out.write("\t</body>\r\n");
out.write("</html>\r\n");
}
Вставка кода в JSP страницы
• Объявления (declarations);
<%! private int count1 = 1; %>
<jsp:declaration> private int count2 = 2; </jsp:declaration>

• Выражения (expressions);
<%=count1 %>
<jsp:expression> count2 </jsp:expression>

• Скриптлеты (scriptlets);
<% System.out.println(“Hello1”); %>
<jsp:scriptlet> System.out.println(“Hello2”); </jsp:scriptlet>

• Комментарии (comments);
<%-- This text will not appear in the response --%>
Вставка кода в JSP страницы
demo.jsp
<%@ page pageEncoding="UTF-8" contentType="text/html;
charset=UTF-8"%>

<%! private int count1=1; %>


<jsp:declaration>private int count2=2;</jsp:declaration>
count1: <%=count1%> <br/>
count2: <jsp:expression>count2</jsp:expression> <br/>
<% System.out.println("Hello1"); %>
<jsp:scriptlet> System.out.println("Hello2"); </jsp:scriptlet>

<%-- JSP Comment --%>


<!-- HTML Comment -->
Предопределенные переменные
• request – переменная класса HttpServletRequest
предоставляющая доступ к текущего объекту запроса;
• response - переменная класса HttpServletResponse
предоставляющая доступ к текущего объекту ответа;
• application - переменная класса ServletContext,
предоставляющая доступ к данным всего приложения;
• session - переменная класса HttpSession,
предоставляющая доступ к объекту сеанса данного
пользователя;
• out - переменная класса JspWriter (буферизированная
версия PrintWriter), может использоваться для отправки
сформированного выходного документа;
• config - переменная класса ServletConfig для доступа к
настройкам данного web компонента.
Директивы JSP
JSP страница может послать сообщение соответствующему
контейнеру с указаниями действий, которые необходимо
провести. Эти сообщения называются директивами. Все
директивы начинаются с <%@, затем следует название
директивы и один или несколько атрибутов со значениями, и
заканчиваются %>.

Пример: <%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>


Директивы page, include
<%@ page pageEncoding="UTF-8"
import="java.util.Locale"
session="true"
trimDirectiveWhitespaces="true"
contentType="text/html; charset=UTF-8"%>

<%@ include file="/navbar.html" %>

Также существуют директивы: taglib и tag, используемые при


разработки библиотеки тэгов
Подключение файлов
Существует 2 основных способа включения файлов в тело основной страницы:

• На этапе трансляции страницы. В этом случае код включаемой страницы


будет помещен в код сервлета основной страницы:
<%@ include file="hello.jsp" %>

• На этапе выполнения запроса. В этом случае страница будет включаться


каждый раз динамически:
<jsp:include page=“hello.jsp” />
Передача управления и данных
<jsp:include page="form2.jsp" />

<jsp:forward page="form2.jsp" />

<jsp:include page="/servlet1" />

<jsp:forward page="/servlet1" />

<% response.sendRedirect("/servlet1"); %>

<% request.setAttribute("attr1", "servlet1"); %>

<%=request.getAttribute("attr1") %>

${attr1 }
Сервлеты vs. JSP
• сервлеты в основном используются для вывода бинарных данных, а также в
качестве контроллера для перенаправления запросов

• JSP предназначены для отображения HTML кода и должны быть максимально


удобны для работы дизайнера

МИНИМУМ
Java-кода на
JSP страницах!!!
Усложняя себе жизнь:

https://ru.wikipedia.org/wiki/JSP
Пример передачи управления и
данных
@WebServlet("/controller")
public class ControllerServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setAttribute("message", "Hello world");
req.getRequestDispatcher("/WEB-INF/view.jsp").forward(req, resp);
}
}

View.jsp:

<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>


Message = <%= request.getAttribute(“message”)%>
Message = ${message}
Expression language (EL) & scopes
Атрибуты можно устанавливать на уровне:
page, request, session, application.

Именно в таком порядке идет поиск по выражению:

${message}

${pageScope.message}
${requestScope.message}
${sessionScope.message}
${applicationScope.message}
EL базовые операции
Оператор Описание Пример
. Access a bean property or Map entry ${account.name}
[] Access an array or list or map element ${array[0]}, ${map[idVar]}
() Group a subexpression to change the evaluation order ${ (2 + balance) * k - 32}
+ Addition ${2 + 2}, ${a + b}
- Subtraction or negation of a value ${2 - 2}, ${a - b}
* Multiplication ${2 * 2}, ${a * b}
/ or div Division ${2 / 2}, ${a / b}
% or mod Modulo (remainder) ${2 % 2}, ${a % b}
== or eq Test for equality ${url == ‘/login’}, ${url eq ‘/login’}, ${var == 2}
!= or ne Test for inequality ${url != ‘/login’}, ${url ne ‘/login’}, ${var ne 2}
< or lt Test for less than ${var < 2}, ${a lt b}
> or gt Test for greater than ${var > 2}, ${a gt b}
<= or le Test for less than or equal ${var <= 2}, ${a le b}
>= or ge Test for greater than or equal ${var >= 2}, ${a ge b}
&& or and Test for logical AND ${condition1 && a > 2 and url == ‘/login’}
|| or or Test for logical OR ${condition1 || a > 2 or url == ‘/login’}
! or not Unary Boolean complement ${!condition and not (a > 2)}
empty Test for empty variable values ${empty var1}, ${empty collection}, ${empty array}
?: Ternary expression $ { condition ? expression1 : expression2}
EL зарезервированные объекты
Название Описание Пример
pageScope Scoped variables from page scope ${pageScope.variable1}

requestScope Scoped variables from request scope ${requestScope.variable1}

sessionScope Scoped variables from session scope ${sessionScope.variable1}

applicationScope Scoped variables from application scope ${applicationScope.variable1}

param Request parameters as strings ${param.idOrder} , ${param["idOrder"]}

paramValues Request parameters as collections of strings ${paramValues['myparam'][0]}, ${paramValues.myparam[0]}

header HTTP request headers as strings ${header.user-agent}, ${header["user-agent"]}.

headerValues HTTP request headers as collections of strings ${paramValues[‘header1'][0]}, ${paramValues.header1[0]}

initParam Context-initialization parameters ${initParam.AppID}


<context-param>
<param-name>AppID</param-name>
<param-value>123</param-value>
</context-param>
cookie Cookie values ${cookie.JSESSIONID} , ${cookie[“JSESSIONID"]}

pageContext The JSP PageContext object for the current page ${pageContext.request.queryString}
Примеры использования
<div class="panel panel-info small-center-block">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-sign-in"></i> ${message}</h3>
</div>
<div class="panel-body">
<form action="/sign-in-handler" method="post">
<div class="help-block">Вы можете использовать Ваши UID в качестве логина</div>
<div class="form-group">
<label for="uid">Логин</label>
<input id="uid" name="uid" class="form-control" placeholder="UID" required autofocus>
</div>
<div class="form-group">
<label for="password">Пароль</label>
<input id="password" type="password" name="password" class="form-control" placeholder="Password">
</div>
<div class="form-group">
<label><input type="checkbox" name="remember-me" value="true"> Запомнить меня</label>
</div>
<hr/>
<div class="form-group">
<button type="submit" class="btn btn-success">Войти</button>
<a href="/fbLogin" class="btn btn-primary pull-right"><i class="fa fa-facebook"></i>
Sign in with Facebook
</a>
</div>
<hr/>
<div class="text-center">
<a href="/restore" >Восстановить доступ</a>
</div>
</form>
</div>
</div>
Примеры использования
public class Model implements Serializable{
private List<String> list = Arrays.asList(new String[]{"first", "second", "third"});
public List<String> getList() {
return list;
}
}
@WebServlet("/serv1")
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("model", new Model());
req.getRequestDispatcher("/WEB-INF/model.jsp").forward(req, resp);
}
}

<%@ page import="net.devstudy.ishop.test.Model"%>


<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" trimDirectiveWhitespaces="true"%>
model=${model}<br>
model.list=${model.list}<br>
foreach1=
<% Model model = (Model) request.getAttribute("model");
for(String item : model.getList()) { %>
<%=item %> ||
<%} %> <br>

foreach2=
<% model = (Model) request.getAttribute("model");
for(String item : model.getList()) {
pageContext.setAttribute("item", item);
%>
${item } ||
<%} %> <br>
Примеры использования
public class Model implements Serializable{
private List<String> list = Arrays.asList(new String[]{"first", "second", "third"});
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public String getData(){
StringBuilder sb = new StringBuilder();
for(String item : list) {
sb.append(item).append(" || ");
}
return sb.toString();
}
}

<%@page import="net.devstudy.ishop.test.Model"%>
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" trimDirectiveWhitespaces="true"%>
model=${model}<br>
model.list=${model.list}<br>
foreach1=${model.data}<br>
foreach2=${model.data}<br>
Домашнее задание
Создать ShowCurrentShoppingCartServlet ("/current-cart" ) и shopping-cart.jsp которые отобразят текущее состоянии корзины: