Основы JSP, которые вы должны знать

задняя часть

Что такое JSP

Итак, что такое JSP? В модели MVC, состоящей из сервлетов, JSP представляет представление, а JSP управляет отображением представления. После того, как вся логика решена в сервлете (контроллере) и модели, она перенаправляется в JSP для создания файлов представления (HTML), все мы знаем, что написание HTML-кода на Java очень проблематично, потому что есть много escape-символов, которые нужно экранировать, поэтому люди думают, что Java лучше писать на HTML, поэтому JSP родился. JSP, написанные людьми, преобразуются в файлы .java, затем компилируются в .classes и, наконец, загружаются и инициализируются как сервлет.

scriplet

Скрипт — самый простой элемент JSP, для него нужно всего лишь вставить тег <% %> в HTML, а в тег можно ввести любой Java-код.

инструкция

Всего в JSP есть три инструкции, а именно page, taglib, include.

1.страница команда

Команда page имеет в общей сложности 13 атрибутов, но обычно используются лишь некоторые из них. атрибут импорта: этот атрибут используется для импорта пакетов для использования в скриптлетах. Свойство contentType: Если вы не установите для этого свойства значение UTF-8, возникнут проблемы с отображением китайского языка.

Код может быть таким: <%@ page import="foo.,java.util." contenttype="UTF-8" %>>

2.taglib директива

В настоящее время инструкция taglib, которую я изучил, имеет только одну функцию: она используется для импорта функций EL. Когда мы хотим вызвать другие классы Java в EL, мы будем использовать эту инструкцию, шаги следующие.

А. Создайте класс, который вы хотите вызвать:

package foo;

public class DiceRoller
{
    public static int rollDice()
    {
        return (int) ((Math.random()*6)+1);
    }
}

б) Создайте файл описания библиотеки ДВУ:

<?xml version="1.0" encoding="UTF-8"?>  
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/j2ee/dtds/web-jsptaglibrary_2_0.xsd"  
        version="2.0">
<tlib-version>1.2</tlib-version>
<uri>DiceFunctions</uri>
    <function>
        <name>rollIt</name>
        <function-class>foo.DiceRoller</function-class>
        <function-signature>
            int rollDice()
        </function-signature>
    </function>
</taglib>

c.JSP:

<%@ taglib prefix="mine" uri="DiceFunctions" %>
<html>
<body>
Hello world
${mine:rollIt()}
</body>
</html>

Цель создания TLD — позволить языку EL найти функцию, которую он ищет в TLD, и эта функция должна быть статической.Инструкция taglib: <%@ taglib prefix="mine" uri="DiceFunctions" %> , вы можете видеть, что атрибут uri соответствует тегу uri в TLD и вызывает функцию rollIt() от имени пространства имен шахты.

3.include директива

Что, если у нас есть много JSP с повторяющимися местами, такими как верхние и нижние колонтитулы, мы можем извлечь эти места как общие части и использовать директиву include для повторного использования этих страниц.

<%@ include file="Header.jsp" %>

выражение

Выражение представляет собой строку кода в виде <% out.println world %>, а код Java помещается в тег, но стоит отметить, что этот код Java должен иметь возвращаемое значение и не может быть недействительным. И не может быть точки с запятой в конце.

утверждение

Мы сказали, что JSP все равно будет преобразован в код Java в конце, а переменная, определенная описанным выше скриптлетом, является локальной переменной, так что, если я хочу определить глобальную переменную, для которой требуется объявление, такое как <% int i="0;%"> Обратите внимание, что в этом коде должна быть точка с запятой. Класс тега может определять не только переменные, но и функцию.

неявный объект

В первый раз, когда я увидел неявный объект, я не понял, что это такое, но я понял это позже, Грубо говоря, когда мы создаем сервлет, мы можем получить запрос, ответ, ServletContext, ServletConfig, Session и т.д. , тогда JSP в конечном итоге станет сервлетом, как мы можем использовать эти неявные объекты в JSP. Оригинальный JSP уже давно создан для нас. Для доказательства взгляните на исходный код контейнера, конвертирующего JSP в Servlet:

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;

Видно, что мы можем напрямую использовать неявные объекты, такие как session, application, config, out, pageContext, не объявляя их сами, а также генерируются запрос и ответ — параметры функции jspService(), мы также можем использовать их напрямую , потому что здесь передается параметр requestDispatcher.forward(request,response) в сервлете.

 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)

Стандартное действие JSP

Стандартные действия JSP можно делать без скриптов, то есть без использования Java-кода для выполнения какой-либо работы по программированию.Например, у нас в запросе есть атрибут "person", который соответствует объекту foo.Person.Если мы хотим получить этот объект в JSP, мы можем использовать скриптлет, чтобы написать кусок кода Java, чтобы получить его. Но как быть с фронтенд-дизайнерами, которые не понимают Java? Затем мы можем использовать стандартные действия:

<jsp:useBean id="person" class="foo.Person" scope="request">
  <jsp:setProperty name="person" property="name" value="Fred" />
</jsp:useBean>
Person is <jsp:getProperty name="person" property="name" />

Приведенный выше код делает следующее:

объявляет использование класса foo.Person, который существует в запросе и имеет ключ "person".

Если в запросе нет этого объекта, создайте его с именем человека и установите для его свойства name значение Fred по умолчанию.

выводит свойство name объекта person.

<jsp:include page="Header.jsp" >
  <jsp:param name="subTitle" value="This is a subtitle" />
</jsp:include>

Функция тега очень похожа на функцию директивы include, упомянутой выше, и все они повторно используют повторяющиеся страницы jsp. Тег может передавать параметр включенному jsp, который можно получить с помощью языка EL ${param.subtTtle} во включенном теге. В отличие от директивы include, директива include применима только к статическим страницам, поскольку использование директивы include эквивалентно прямому перемещению кода включенной страницы в целевой код JSP, а тег можно использовать с динамическим элементом. , поскольку он является динамическим, помещает страницу, на которую отвечает включенный код, в целевое расположение.

английский язык

Язык EL очень мощный, он может делать почти все, что могут делать стандартные действия, и даже проще, например, в запросе есть объект человек, у объекта человек есть объект собака, а у объекта собака есть объект свойство name Мы хотим напечатать эту собаку Что делать с именем. Использование EL очень просто. ${perosn.dog.name} завершает эту задачу. В выражении EL мы используем ключ атрибута запроса как объект EL напрямую. Например, в сервлете request.setAttribute("person",xiaohong) мы напрямую используем person для замены объекта Person xiaohong в EL. Аналогично, если request.setAttribute("map",aHashMap) принимает Map в качестве параметра , то мы напрямую ${map["key"]} или ${map.key}, разница между ними в том, что ${map.key} должен соответствовать правилам именования java после точки.

Неявные объекты для EL

Язык EL настолько мощный, что, конечно же, у него есть свои неявные объекты:

неявный объект EL эффект
pageScope страница ограниченаАтрибуты
requestScope область запросаАтрибуты
sessionScope область сеансаАтрибуты
applicationScope область приложенияАтрибуты
param {param.id} эквивалентно request.getParameter("id")
paramValues Если значение параметра является коллекцией, следует использовать этот объект
header Эквивалентно request.getHeader("...");
headerValues Применимо к случаю, когда определенное значение заголовка является коллекцией
initParam вызвать начальный параметр контекста в web.xml
cookie получить печенье
pageContext Все вышеперечисленные объекты можно получить через pageContext

Еще раз надо обратить внимание на разницу между requestScope и param, то есть на разницу между атрибутами и параметрами, параметры — это параметры формы, отправленной пользователем, а атрибуты — это атрибуты, установленные самими программистами.

Несколько способов получить параметры контекста

1. Скрипт

<%= application.getInitParameter("mainEmail")%>

2.EL использует initParam

${initParam.mainEmail}

###3.EL использует pageContext

${pageContext.request.getServletContext().getInitParameter("mainEmail")}

Несколько способов получить параметры формы

1. Скрипт

 <%= request.getParameter("foo")%>

2.EL использует параметр

${param['foo']}

3.EL использует pageContext

${pageContext.request.getParameter("foo")}