Fauxjsp는 개발 중에 사용하기위한 JSP (Java Server Pages) 구현입니다. JSP는 응용 프로그램 및 페이지 시작 시간을 줄이고 JSPS가 변경되고 JSPS가 변경되고 서버 재시작을 필요로하지 않으면 페이지 재 장전 속도를 높이고 속도를 높입니다. 개발시 가장 잘 사용되며 사양 준수가 중요하지 않은 경우에도 생산에 사용할 수 있습니다.
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:set0.0.9
0.0.5-snapshot
0.0.4-snapshot
예. 요컨대 :
대부분의 사람들에게 멋진 친구들 JSP는 유행이 끔찍하지만 프로토 타이핑 및 태그 필레에 사용하는 것을 좋아합니다. 슬프게도 놀랍게도, 재사용 가능한 웹 UI 구성 요소를 만들기위한 잘지지되고 성숙한 기술 임에도 불구하고 태그 필드에 대해 많은 사람들이 아는 사람이 많지 않습니다.
다른 JSP 구현은 먼저 JSP 및 태그 파일을 Java 소스 코드로 컴파일 한 다음 바이트 코드로 컴파일 한 다음 기계 코드로 컴파일되므로 JSP-Heavy 애플리케이션을 시작합니다. 또한 JSP 파일을 변경할 때 전체 프로세스를 반복하여 개발 속도를 늦추어야합니다. 언젠가는 설명 할 수없는 컴파일 오류, 클래스로드 오류, 메모리가 부족한 것 및 좋아요를 얻을 수 있습니다.
Fauxjsp는 JSP 인터프리터와 JSP 파일을 읽고 즉시 해석하여 편집을 건너 뛸 수있는 JSP 서브를 구현합니다. 이로 인해 인스턴트 페이지 재 장전, 빠른 응용 프로그램 시작 시간 및 견고성 (클래스 로더 피킹 없음!)의 이점은 분명히 생성 된 JSP 페이지가 제작에 문제가 될 수있는 표준 구현보다로드에서 느리게 느려집니다.
현재 구현 된 기능 :
제약 및 누락 된 기능 :
c:out 과 같은 Core Taglib가 작동하지만 DisplayTag와 같은 타사 Taglib는 FAUXJSP에 대해 다시 구현하지 않는 한 그렇지 않음을 의미합니다.classpath: Prefix를 사용합니다. 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 > Servlet API, JSTL, EL은 서블릿 컨테이너 또는 웹 응용 프로그램이 이러한 종속성에 기여하기 때문에 provided 스코핑됩니다.
log4j, 콩나무는 선택 사항이므로 provided 스코핑됩니다.
커먼즈 라인은 필수이기 때문에 compile 로 스코핑됩니다
최신 정보는 POM을 참조하십시오.
버그를 찾거나 구현 된 기능이 필요한 경우 버그 보고서를 제출하십시오. 이제 실제 (프로젝트) 생활에서, 당신은 아마도 일정이 빡빡하고 공식적인 수정을 기다리고 싶지 않을 것입니다. fauxjsp는 모듈 식이며 쉽게 확장 가능합니다. 따라서 FAUXJSP의 아키텍처에 대한 다음 장을 살펴보십시오. 이는 다양한 간단한 구성 요소를 이해하고 새로운 기능을 구현하는 방법을 이해하는 데 도움이됩니다.
JspServlet HTTP 요청을 수락하고 요청 된 JSP를 렌더링합니다. 전체 시퀀스는 다음과 같습니다.
ServletRequest 에서 요청 된 JSP 파일의 이름을 가져옵니다jspbase ( JspServlet 의 경우 Javadocs 참조)를 살펴 봅니다.JspParser 에 대해 JspParserFactory 에 묻습니다JspParser 에게 제공하고 의존성을 재귀 적으로 해결하고 JspPage 반환합니다.RenderSession 만듭니다JspRenderer 에게 JspRendererFactory 에게 묻습니다JspPage 와 RenderSession 제공하는 JspRenderer 에게 렌더링을 제공합니다. JspServlet 에는 앞에서 언급 한 다양한 공장을 구성하는 다양한 보호 방법이 있습니다. 특수 설정이 필요한 경우 이러한 생성자 메소드를 재정의하면 수정되거나 완전히 새로운 파서 및 렌더러 구현을 반환 할 수있는 자체 공장을 지정할 수 있습니다.
JspParser , 특히 구현 JspParserImpl JSP 파일 위치가 제공되고 렌더링하고 구문 분석 결과를 반환합니다. 상세히:
JspParser.parse(path) 는 렌더링 할 JSP 파일의 경로가 제공됩니다.ResourceResolver 인스턴스 ( JspParserFactory 세트)로가는 경로를 제공합니다.JspNode s의 트리를 만드는 JSP 파일을 읽습니다.TagLibDefinitionCache 에 넣어 각 요청 동안 Taglib가 한 번만 읽히도록합니다.JspParserFactory 묻습니다. 불행히도 현재 태그 가외의 Taglib를로드 할 수 없습니다. 그러나 fauxjsp 직접 특별 구현을 제공하여 누락 된 Taglibs를 사용할 수 있습니다. Taglib에 따라 노동 집약적 인 작업이 될 수도 있고 아닐 수도 있습니다. 몇 가지 예를 들어 JstlCoreTaglib* 클래스를 살펴보십시오. DefaultJspParserFactoryImpl Factory는 각 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 기능 구현을 위임하므로 모든 것이 상자에서 작동해야합니다.
더 많은 기능 taglibs가 필요한 경우 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 >Taglib-location은 서버 또는 클래스 경로 리소스 경로 일 수 있습니다.
이전에 작성된 것처럼 Fauxjsp는 Taglibs를 사용할 수 없으며 대신 에뮬레이션해야합니다. 즉, 누군가가 해당 에뮬레이션을 프로그래밍해야합니다.
1 단계 : Taglib 구현을 만듭니다. jstlcoretaglibout와 같은 이미 시뮬레이션 된 taglib 중 하나를 찾아 복사하여 붙여 넣으십시오.
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 classpath에있는 경우 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
Scriptlets는 Beanshell을 사용하여 구현되므로 표준 스크립트 항목 동작과의 편차가 예상됩니다. Beanshell 통역사가 클래스 경로에서 발견되지 않으면 Scriptlets가 활성화되지 않습니다. 현재 제한 사항은 다음과 같습니다.
이상적으로는 Production JSP 환경과 FauxJSP에서 작동하는 방법을 찾을 수 있습니다. 예를 들어 우리가 앞서 이야기 한 스크립트에 사용 된 바라크의 경우가 있습니다. Fauxjsp 파서는 <,>, {,} 등과 같은 구분 제로 다른 곳에 사용되는 el 표현식 및 스크립트에 나타나는 문자열에 의해 혼란 스러울 수 있습니다.
유스 케이스는 태그 파일 또는 JSP가 클래스 경로 (예 : JAR 파일)에있는 다른 태그 파일 또는 JSP를 참조한다는 것입니다. tagdir 사용하지 말고 자원을 포함시킬 때 대신 uri 사용하십시오.
<%@ taglib prefix = " cp " uri = " classpath:/tagfiles " %> JstlView 와 InternalViewResolver 작동하지 않으며 Spring이 JSP를 찾지 못한다는 것을 알았습니다. 후드 아래에서 스프링은 모델 (MVC의 M)을 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 > Servlet Init Parameter trimDirectiveWhiteSpaces 지정하십시오
< 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 > 앞으로의 기능 가까운 곳에 언젠가 미래 :
공상 과학 소설 (내가 거친 아이디어가있는 것들을 구현하는 방법이지만 아직 운동해야 할 필요가 없지만 절대 올 수 없음) :
많은 훌륭한 단위 테스트에 영감을 준 JSP 튜토리얼 용 Ross Studtman.
fauxjsp는 GPL에서 사용할 수 있습니다. fauxjsp는 개발 도구이므로 일반적으로 응용 프로그램 바이너리와 함께 생산에 배치하지 않으므로 GPL의 "비상업적"측면은 응용 프로그램에 영향을 미치지 않습니다.