Импорт пользовательской библиотеки тегов без использования директив, таких как ‹%@

Я отключил скриптлет во всех своих JSP в web.xml:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <scripting-invalid>true</scripting-invalid>
    </jsp-property-group>
</jsp-config>

Но мне нужно импортировать некоторые пользовательские библиотеки тегов, которые используются следующим образом:

<%@ taglib prefix="utils" uri="/tags-utils" %>

Как мне импортировать это без использования скриптлета? Кроме того, как мне избежать использования следующего?

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

Решение об удалении скриптлетов состоит в том, чтобы избежать беспорядка со скриптлетами в проекте, написанном более чем одним разработчиком.

Если невозможно изменить импорт без использования скриптлета, то как я могу отключить его для любого использования, кроме <%@ taglib или <%@ page?

Пытался перейти от

<%@ taglib prefix="s" uri="/struts-tags" %>

to

<jsp:directive.tagLib prefix="s" uri="struts-tags" />

но Servlet выдает мне ошибку:

[org.apache.catalina.core.ContainerBase.[jboss.web].[host-host].[/portal].[jsp]] (http-localhost-127.0.0.1-80-3) Servlet.service() для сервлета jsp выдал исключение: org.apache.jasper.JasperException: /index.jsp(2,18) ‹jsp:directive.tag директива может использоваться только в файле тегов

Есть ли что-нибудь еще, что я должен сделать?


person Fagner Brack    schedule 08.12.2012    source источник


Ответы (2)


Спецификация JSP 2.2

JSP 1.3.10.1 Грамматика EBNF для синтаксиса JSP

ScriptlessBody ::= ( ( ‘<%--’ JSPCommentBody )
                   | ( ‘<%@’ DirectiveBody )
                   | ( ‘<jsp:directive.’ XMLDirectiveBody )
                   | ( ‘<%!’ <TRANSLATION_ERROR> )
                   | ( ‘<jsp:declaration’ <TRANSLATION_ERROR> )
                   | ( ‘<%=’ <TRANSLATION_ERROR> )
                   | ( ‘<jsp:expression’ <TRANSLATION_ERROR> )
                   | ( ‘<%’ <TRANSLATION_ERROR> )
                   | ( ‘<jsp:scriptlet’ <TRANSLATION_ERROR> )
                   | ( ‘${‘ ELExpressionBody )
                   | ( ‘#{‘ ELExpressionBody )
                   | ( ‘<jsp:text’ XMLTemplateText )
                   | ( ‘<jsp:’ StandardAction )
                   ( ( ‘</’ ExtraClosingTag )
                   | ( ‘<‘ CustomAction CustomActionBody )
                   | TemplateText
                   )*

Итак, когда scripting-invalid=true:

Незаконно

<%
<%!
<%=
<jsp:scriptlet
<jsp:declaration
<jsp:expression

Юридическая информация

<%@
<jsp:directive.
<jsp:

Следующее является законным:

 <%@ taglib prefix="utils" uri="/tags-utils" %>

При условии, что "URI контекста приложения" + "/tags-utils" (относительный контекст библиотеки тегов) сопоставляется с "абсолютным URI" библиотеки тегов.

В качестве альтернативы вы можете попробовать:

 <%@ taglib prefix="utils" uri="http://www.mycorp/utiltags" %>  // use your absolute taglib URI

OR

 <%@ taglib prefix="utils" uri="uri_path_relative_to_jsp_uri" %>  // no leading "/"

OR

 <%@ taglib prefix="utils" tagdir="/WEB-INF/tags" %> // include subdir if approp

Придумано следующее. Тег jsp:directive.tagLib не определен. Не используйте.

 <jsp:directive.tagLib prefix="s" uri="struts-tags" />

Вместо:

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

Попробуйте:

 <%@ page contentType="text/html; charset=UTF-8" %>  // language is for scriptlets
person Glen Best    schedule 08.05.2013

<%@taglib и <%@page — это директивы, а не скриптлеты.

Скриптлеты будут иметь <%.

В качестве альтернативы вы можете написать так

<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />
person Pradeep Simha    schedule 08.12.2012
comment
‹Директива jsp:directive.tag может использоваться только в файле тегов. Даже использование ‹%@ считается сценарием по ‹scripting-invalid›true‹/scripting-invalid› - person Fagner Brack; 08.12.2012
comment
@FagnerBrack, нет, ты не прав. Есть два способа объявить любые элементы jsp: один — это старый стиль ‹%..., а другой — ‹jsp: префикс нового стиля. - person Pradeep Simha; 08.12.2012
comment
Когда я использую эту директиву с помощью тега, она не выполняет автозаполнение при затмении и выдает ошибку: (http-localhost-127.0.0.1-80-5) Servlet.service() для сервлета jsp выдал исключение: org.apache.jasper.JasperException : /index.jsp(2,18) ‹Директива jsp:directive.tag может использоваться только в файле тегов - person Fagner Brack; 08.12.2012
comment
Я обновил в вопросе точное изменение, которое я сделал. Я использую eclipse, и он не выполняет автозаполнение тега ‹jsp:directive. Есть ли какие-либо настройки, которые мне нужно выполнить, чтобы это заработало? - person Fagner Brack; 08.12.2012