Что такое 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".
<jsp:include page="Header.jsp" >
<jsp:param name="subTitle" value="This is a subtitle" />
</jsp:include>
Функция тега
английский язык
Язык 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")}
%@>