Fauxjsp - это реализация Java -серверов (JSP) для использования во время разработки: JSPs интерпретируются лениво (вместо составленной), которая уменьшает время приложения и запуска страницы, ускоряет перезагрузку страницы при изменении JSP и не требует перезагрузки сервера. Лучше всего использовать при разработке, может использоваться в производстве также, если соответствие спецификации не является критическим.
web.xml:
< servlet >
< servlet-name >FauxJsp</ servlet-name >
< servlet-class >fauxjsp.servlet.JspServlet</ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name >FauxJsp</ servlet-name >
< url-pattern >*.jsp</ url-pattern >
</ servlet-mapping >Версии ниже (включая) 1.2.3 находятся в Maven Central:
pom.xml:
< dependency >
< groupId >com.github.ggeorgovassilis</ groupId >
< artifactId >fauxjsp</ artifactId >
< version >1.2.3</ version >
</ dependency >Версии после 1.2.3 требуют репозитория:
< repositories >
< repository >
< id >fauxjsp-repo</ id >
< url >https://github.com/ggeorgovassilis/fauxjsp/raw/gh-pages/</ url >
< snapshots >
< enabled >true</ enabled >
< updatePolicy >always</ updatePolicy >
</ snapshots >
</ repository >
</ repositories >1.2.7-Snapshot (не выпущен на Maven Central)
1.2.3
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
trimDirectiveWhiteSpaces , c:set CONTED CONTED реализовано0,0,9
0,0,5-снапшот
0,0,4-Snapshot
Да. Суммируя:
Для большинства из вас Cool Dudes JSP ужасно не в моде, но мне нравится использовать его для прототипирования и Tagfiles. К сожалению, и удивительно, что не многие люди знают о Tagfiles, несмотря на то, что они являются хорошо поддерживаемой и зрелой техникой для создания многоразовых компонентов веб-пользовательского интерфейса.
Запуск приложения JSP-Heavy является медленным, потому что другие реализации JSP сначала будут компилировать JSP и Tagfiles с исходным кодом Java, а затем к байтовому коду, а затем в машинный код. Кроме того, при внесении изменений в файлы JSP весь процесс должен повторяться, что замедляет разработку. В какой -то момент вы даже получите необъяснимые ошибки компиляции, ошибки загрузки класса, заканчивая память и тому подобное, вы будете знать, что у вас достаточно, и вы перезагрузите контейнер сервлета.
Fauxjsp реализует интерпретатор JSP и сервлет JSP, который считывает файлы JSP и интерпретирует их на лету, вообще пропуская компиляцию. Это приносит пользу мгновенному перезагрузке страниц, быстрым временем запуска приложения и надежности (без загрузки класса!) Но, очевидно, сгенерированные страницы JSP находятся медленнее под нагрузкой, чем стандартная реализация, которая может быть проблемой в производстве.
В настоящее время реализованные функции:
Ограничения и отсутствующие функции:
c:out будут работать, но сторонние таганы, такие как DisplayTag, не будут переиздать их для Fauxjsp.classpath: префикс для разрешения Tagfiles и JSP в классе. Не поддерживает стандартный способ разрешения ресурсов пути Classpath.Потому что:
Бонус:
< dependency >
< groupId >com.github.ggeorgovassilis</ groupId >
< artifactId >fauxjsp</ artifactId >
< version >1.1.0</ version >
</ dependency >ИЛИ
Скачать источники и компиляция
git clone https://github.com/ggeorgovassilis/fauxjsp.git
cd fauxjsp
mvn install< servlet >
< servlet-name >FauxJsp</ servlet-name >
< servlet-class >fauxjsp.servlet.JspServlet</ servlet-class >
<!-- optionally specify a root for resource lookup, defaults to "/"
<init-param>
<param-name>base-path</param-name>
<param-value>/WEB-INF/jsp/</param-value>
</init-param>
-->
</ servlet >
< servlet-mapping >
< servlet-name >FauxJsp</ servlet-name >
< url-pattern >*.jsp</ url-pattern >
</ servlet-mapping > API Servlet API, JSTL, EL, как это provided , потому что контейнер сервлета или веб -приложение вносят эти зависимости
log4j, Beanshell подсказываются как provided , потому что они необязательны
Commons-Lang снимается как compile , потому что это обязательно
Для получения актуальных деталей см. POM.
Пожалуйста, отправьте отчет об ошибке, когда вы найдете ошибку или требуйте реализованной функции. Теперь, в реальной (проектной) жизни, вы, вероятно, находитесь в жестком графике и не хотите ждать официального исправления. Fauxjsp модульный и легко расширяется. Так что посмотрите на следующую главу об архитектуре FauxJSP, которая поможет вам понять различные, довольно простые компоненты, как их модифицировать и реализовать новые функции.
JspServlet принимает HTTP -запрос и делает запрошенную JSP. Вся последовательность выглядит так:
ServletRequestjspbase (см. Javadocs для JspServlet ) для файла JSPJspParserFactory для нового JspParserJspParser , который анализирует его, рекурсивно разрешает зависимости и возвращает JspPageRenderSessionJspRendererFactory для нового JspRendererJspPage и RenderSession JspRenderer , который выполняет его У JspServlet есть куча защищенных методов, которые построены различные фабрики, упомянутые ранее. Если вам нужны специальные настройки, то переопределение этих методов конструктора позволяет указать свои собственные фабрики, которые могут вернуть модифицированные или совершенно новые реализации анализаторов и визуализаторов.
JspParser и, более конкретно, его единственная реализация JspParserImpl дается местоположение файла JSP, отдает его и возвращает анализированные результаты. Подробно:
JspParser.parse(path) дается путь файла JSP для рендерингаResourceResolver ( JspParserFactory устанавливает один из них), который возвращает файл JSP в качестве строки.JspNode S.TagLibDefinitionCache , что гарантирует, что Taglibs читаются только один раз во время каждого запроса.JspParserFactory для нового анализатора, который рекурсивно анализирует TagFile. К сожалению, в настоящее время невозможно загружать таганы, кроме Tagfiles. Однако можно использовать недостающие таганы, предоставив специальную реализацию для Fauxjsp самостоятельно. В зависимости от Taglib вы пытаетесь имитировать это, может или не может быть трудоемкой задачей. Для некоторых примеров взгляните на классы JstlCoreTaglib* . Фабрика DefaultJspParserFactoryImpl устанавливает их под специальным пространством имен, по одному для каждого метода TAGLIB.
<%@ taglib prefix uri tagdir %>
<@ include file %>
<%@ attribute name required rtexprvalue type %>
< jsp : attribute name = " ... " >...</ jsp : attribute >
< jsp : body >...</ jsp : body >
< jsp : doBody />< c : out value = " ... " />
< c : choose test = " ... " >...</ c : choose >
< c : when test = " ... " >...</ c : when >
< c : otherwise >...</ c : otherwise >
< c : forEach var = " ... " items = " ... " varStatus = " ... " begin = " ... " end = " ... " >...</ c : forEach >
< c : if test = " ... " >...</ c : if >
< c : set var = " ... " value = " ... " />
< fmt : message key = " ... " />
< fmt : setBundle basename = " ... " />
< fmt : formatNumber value = " ... " .../>
< fmt : formatDate value = " ... " .../>
< fmt : setLocale value = " ... " />
Fauxjsp делегаты в стандартную реализацию функции JSTL, используемая сервером приложений, поэтому все должно работать из коробки.
Если вам нужно больше таганов функции, не забудьте объявить их в web.xml:
< jsp-config >
< taglib >
< taglib-uri >http://java.sun.com/jstl/core-rt</ taglib-uri >
< taglib-location >META-INF/c-1_0-rt.tld</ taglib-location >
</ taglib >
</ jsp-config >Распространение таглиб может быть пути ресурса сервера или класса.
Как написано ранее, Fauxjsp не может использовать Taglibs и вместо этого должен их подражать, что означает, что кто -то должен запрограммировать это эмуляцию.
Шаг 1 : Создайте реализацию Taglib. Просто найдите один из уже смоделированных тагальков, таких как jstlcoretaglibout и копировать и вставить его
public class TaglibAdd extends TaglibDefinition {
protected void runAdd ( RenderSession session , JspTaglibInvocation invocation ) {
String xExpression = invocation . getArguments (). get ( "x" );
if ( xExpression == null )
throw new RuntimeException ( "Missing x argument" );
Object x = session . elEvaluation . evaluate ( xExpression , session );
String yExpression = invocation . getArguments (). get ( "y" );
if ( yExpression == null )
throw new RuntimeException ( "Missing y argument" );
Object y = session . elEvaluation . evaluate ( yExpression , session );
try {
int ix = ( Number ) x ;
int iy = ( Number ) y ;
String s = "" +( ix + iy );
session . response . getOutputStream (). write (( s ). getBytes ( session . response . getCharacterEncoding ()));
} catch ( Exception e ) {
throw new JspRenderException ( invocation , e );
}
}
@ Override
public void render ( RenderSession session , JspTaglibInvocation invocation ) {
runAdd ( session , invocation );
}
public TaglibAdd () {
this . name = "add" ;
this . attributes . put ( "x" , new AttributeDefinition ( "x" , Integer . class . getName (), true , true ));
this . attributes . put ( "y" , new AttributeDefinition ( "y" , Integer . class . getName (), true , true ));
}
}
Шаг 2 : расширить DefaultJSPPARSerFactoryImpl и переопределить метод setup . Здесь вы можете зарегистрировать новый Taglib, который вы написали
public class MyJspParserFactory extends DefaultJspParserFactoryImpl {
protected void setup ( JspParserImpl parser ) {
super . setup ( parser );
parser . registerTaglibDefinition (
"http://mytaglibs/add" ,
new TaglibAdd ());
}
} Шаг 3 : Расширить JSPServlet и переопределить getJspParserFactory , чтобы он возвращал вашу новую фабрику
public class MyJspServlet extends JspServlet {
protected JspParserFactory getJspParserFactory ( ServletConfig config ){
ResourceResolver location = new ServletResourceResolver ( jspBase , getServletContext ());
DefaultJspParserFactoryImpl factory = new MyJspParserFactory ( location );
return factory ;
}
}Шаг 4 : Используйте новую реализацию JSPServlet в web.xml вместо старого JSPServlet
< servlet >
< servlet-name >FauxJsp</ servlet-name >
< servlet-class >MyJspServlet</ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name >FauxJsp</ servlet-name >
< url-pattern >*.jsp</ url-pattern >
</ servlet-mapping > JspServlet входит через log4j, если он найден на классе, в противном случае через стандартный механизм ведения журнала JDK. Возможная настройка журнала в log4j.properties может выглядеть так:
log4j.rootLogger=INFO, stdout
log4j.logger.fauxjsp=INFO, stdout
log4j.additivity.fauxjsp.impl.parser.JspParserImpl=false
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Скриптлеты реализованы с использованием Beanshell, поэтому следует ожидать некоторых отклонений от стандартного поведения сценария. Scriptlets не будут включены, если интерпретатор Beanshell не найден на классе. Текущие ограничения:
В идеале вы найдете способ, который работает как в производственной среде JSP, так и в Fauxjsp. Примером может быть случай, когда Вараргс использовался в сценариях, о которых мы говорили ранее. Переводка Fauxjsp, вероятно, будет смущен строками, которые появляются в EL Expressions и Scriptlets, которые используются в других местах как разделители, такие как <,>, {,} и т. Д. В этом случае попытаться использовать побеги, такие как u007b для {.
В случае использования состоит в том, что ваши Tagfiles или JSPS ссылаются на другие TAGFILES или JSP, которые находятся в классе (например, файл JAR). Не используйте tagdir но используйте uri вместо этого при включении ресурса, например:
<%@ taglib prefix = " cp " uri = " classpath:/tagfiles " %> Вы, вероятно, заметили, что JstlView и InternalViewResolver не работают, а весна не находит ваши JSP. Под капотом пружина должна заполнить модель (M в MVC) в атрибуты HttpServletRequest и перенаправить запрос на Fauxjsp, но это не так. Мы можем реализовать простой механизм пересылки, как SO:
import java . util . Locale ;
import org . springframework . stereotype . Component ;
import org . springframework . web . servlet . View ;
import org . springframework . web . servlet . ViewResolver ;
@ Component
public class ForwardingViewResolver implements ViewResolver {
@ Override
public View resolveViewName ( String viewName , Locale locale ) throws Exception {
ForwardingView view = new ForwardingView ();
view . setUrl ( "classpath:/jsp/" + viewName + ".jsp" );
return view ;
}
} import java . util . Map ;
import javax . servlet . RequestDispatcher ;
import javax . servlet . http . HttpServletRequest ;
import javax . servlet . http . HttpServletRequestWrapper ;
import javax . servlet . http . HttpServletResponse ;
import org . springframework . web . servlet . view . InternalResourceView ;
public class ForwardingView extends InternalResourceView {
@ SuppressWarnings ( "unchecked" )
@ Override
public void render ( Map < String , ?> model , HttpServletRequest request , HttpServletResponse response )
throws Exception {
HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper ( request ) {
@ Override
public String getServletPath () {
return getUrl ();
}
};
exposeModelAsRequestAttributes (( Map < String , Object >) model , wrapper );
exposeHelpers ( wrapper );
RequestDispatcher rd = request . getServletContext (). getNamedDispatcher ( "FauxJsp" );
rd . forward ( wrapper , response );
}
}Простого присутствия этих двух компонентов в контексте веб -приложения должно быть достаточно, чтобы их подхватили и активировали.
JspServlet может быть настроен на JSP, проанализированный кэш. Это незначительное улучшение производительности, так как обычно рендеринг медленнее, чем анализ.
< servlet >
< servlet-name >FauxJsp</ servlet-name >
< servlet-class >fauxjsp.servlet.JspServlet</ servlet-class >
< init-param >
< param-name >cachePages</ param-name >
< param-value >true</ param-value >
</ init-param >
</ servlet > Укажите параметр init trimDirectiveWhiteSpaces servlet
< servlet >
< servlet-name >FauxJsp</ servlet-name >
< servlet-class >fauxjsp.servlet.JspServlet</ servlet-class >
< init-param >
< param-name >trimDirectiveWhiteSpaces</ param-name >
< param-value >true</ param-value >
</ init-param >
</ servlet > Функции, которые будут представлены в ближайшем Когда -нибудь в будущем:
Научная фантастика (вещи, которые у меня есть грубое представление о том, как реализовать, но мне нужно тренироваться и, возможно, никогда не придет):
Ross Studtman для учебных пособий JSP, которые вдохновили на многие отличные модульные тесты.
Fauxjsp доступен под GPL. Поскольку Fauxjsp является инструментом разработки, вы обычно не развернете его с вашим приложением в производство, поэтому «некоммерческий» аспект GPL не влияет на ваше приложение.