Создание компонента JSP - PullRequest
3 голосов
/ 16 июня 2010

При создании страниц JSP одна вещь, которая мне часто нравится, это возможность делать что-то вроде этого:

<jsp:include page="fancystoryrenderer.jsp" value="${aStoryObjectInMyModel}/>

...

fancystoryrenderer.jsp

<div id="fancymainbody">
    ...
    ${theStory.title}
    ...
</div>

Основными важными характеристиками этого является то, что я могу повторно использовать один и тот же компонент на одной и той же странице JSP в разных местах без необходимости копировать, вставлять компонент и давать переменным истории разные имена, обратите внимание, что история называется "theStory" JSP, а не "aStoryObjectInMyModel", связь между нашей моделью была нарушена представлением, что является хорошей вещью в этом случае. Кроме того, я знаю, что вы можете передать параметр в представление JSP, но я НЕ ХОЧУ вообще получать атрибуты из объекта запроса, я хочу иметь возможность использовать параметры из языка выражений.

Как ты это делаешь?

Я использую Spring-MVC и JSP, пожалуйста, не добавляйте фреймворки, я заинтересован в том, чтобы заставить это работать, используя только тот веб-стек, который у меня сейчас есть.

Ответы [ 2 ]

4 голосов
/ 16 июня 2010

Это может быть архив, использующий так называемые "файлы тегов". Файлы тегов - это в основном jsps, которые помещаются в теги WEB-INF / и которые затем можно использовать как taglib. Я использую синтаксис xml в этом примере, но он также должен работать со старым синтаксисом.

/ WEB-INF / теги / mytag.jspx

<?xml version='1.0' encoding='utf-8'?>
<jsp:root version="2.1" xmlns:jsp="http://java.sun.com/JSP/Page">
    <jsp:directive.attribute name="mybean" required="true" rtexprvalue="true" type="mypackage.MyBean"/>
    <div>
       ${mybean.myproperty}
    </div>
</jsp:root>

test.jspx

<?xml version='1.0' encoding='utf-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" xmlns:tags="urn:jsptagdir:/WEB-INF/tags/">
    <jsp:directive.page contentType="text/html; charset=utf-8"/>
    <div>
      <tags:mytag mybean="${mymodel.mybean}"/>
    </div>
</jsp:root>

Вам также может понадобиться файл implicit.tld в WEB-INF / tags для установки версии taglib:

<?xml version='1.0' encoding='utf-8'?>
<taglib xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1" xmlns="http://java.sun.com/xml/ns/javaee">
    <tlib-version>2.1</tlib-version>
</taglib>
4 голосов
/ 16 июня 2010

Поместите желаемую модель в область запроса (или более широкую), и она будет просто работать без ее "прохождения".

Если реальное движение за этой потребностью связано с тем, что вы включаете страницу, например, в цикл JSTL c:forEach (который помещает текущий итеративный элемент в локальную область, которая действительно недоступна для включенной страницы JSP), можно использовать c:set, чтобы установить его.

<c:forEach items="${items}" var="item">
    <c:set var="currentitem" value="${item}" scope="request" />
    <jsp:include page="include.jsp" />
</c:forEach>

С в include.jsp:

<p>Current item: ${currentitem}</p>

Это будет просто работать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...