org.apache.jasper.JasperException:
 /WEB-INF/test/memList.jsp(64,0) //에러발생구분
The function size must be used with a prefix when a default namespace is not specified
함수 크기는 접두사와 함께 사용해야하는데, 네임스페이스를 명시하지 않아 이행할수었다.

 

JSTL size비교 처리 하기~..

 

<c:forEach var="mb" items="${list }">
<c:if test="${mb.size() <= 0 }">  //64번째 Line~
<tr>
 <td colspan="7">등록된 값이 없습니다.</td>
</tr>
</c:if>
</c:forEach>

 

<<Controller/Service는 특별히 볼필요는 없는부분이고 참고할분은 보세요~..>>

List호출 Java파일 확인~

 

Controller부분
 @RequestMapping("list.do")
 public ModelAndView memList(@ModelAttribute("mb")MemberModel mb){
  /*List<MemberModel> list = memberService.selectAll(mb);

ArrayList주석처리후 이부분으로 처리해도 결과는 같네요~*/
  List<MemberModel> list = new ArrayList<MemberModel>(memberService.selectAll(mb));
  
  ModelAndView mav = new ModelAndView();
  mav.addObject("list", list);
  mav.setViewName("/memList");
  return mav;
  
 }

Service부분(Dao 인터페이스 오버라이딩해서 구현) 
@Override
 public List<MemberModel> selectAll(MemberModel mb) {
  return sqlMapClientTemplate.queryForList("member.selectAll", mb); 
 }

 

 

>>>>>
<<memList.jsp>>
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>  //추가

<strong>List 목록</strong><p>
<%-- 
리스트길이: <c:out value="${fn:length(list)}" /><br>
리스트: <c:out value="${list}" /><br>
화면에 출력되나 확인~ 리스트는 길이가 3이면 리스트는[111,222,333] 이런식으로 나옴 --%>

<table border="1" style="text-align: center">
<tr bgcolor="yellow">
 <td width="150">아이디</td>
 <td width="150">비밀번호</td>
 <td width="150">이름</td>
 <td width="150">주소</td>
 <td width="150">전화번호</td>
 <td width="150">이메일</td>
 <td width="150">날짜</td>
</tr>

<c:if test="${fn:length(list) == 0 }" >  //변경부분~
<tr>
 <td colspan="7">등록된 값이 없습니다.</td>
</tr> 
</c:if>

<c:if test="${fn:length(list) != 0 }" >  //if으로 List값확인
<c:forEach var="mb" items="${list }">  //조건에 만족하면 forEach정의후 실행가능하도록 해줬습니다~  
<tr>
 <td>${mb.id }</td>
 <td>${mb.pass }</td>
 <td>${mb.name }</td>
 <td>${mb.address }</td>
 <td>${mb.phone }</td>
 <td>${mb.email }</td>
 <td>${mb.regdate }</td>
</tr>
</c:forEach>
</c:if>
</table>
<br><input type="button" value="목록쓰기" onclick="javascript:location.href='write.do'" />


출처 - http://blog.naver.com/PostView.nhn?blogId=lyh5080&logNo=80172160299




Posted by linuxism
,


예외 내용

org.apache.jasper.JasperException: PWC6188: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application 


해결책

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

다음과 같이 jstl을 사용하고 싶은데 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> 

로 하지 않으면 에러가 발생하는 경우가 있습니다.

이경우는 web.xml스키마의 버전과 WAS의 버전차이에 의해서 발생하는 에러입니다.

web.xml 스키마의 버전이 2.3일때 http://java.sun.com/jstl/core"
web.xml 스키마의 버전이 2.4이상일때 http://java.sun.com/jsp/jstl/core 이렇게 사용하시면 됩니다.


예제 >>> 

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd">

두번째 처럼 사용하고 싶으면 
다음과 같이 수정
<web-app id="Web" version="2.4" 
 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/xml/ns/j2ee/web-app_2_4.xsd">

또는 

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.5//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd">

이런식으로 수정하셔도 됩니다


출처 - http://nanstrong.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81%EC%97%90%EC%84%9C-jstl-URL-taglib-prefixc-urihttpjavasuncomjspjstlcore-%EC%97%90%EB%9F%AC






web.xml 에서 지정한 uri 의 값과, jsp 파일에서 호출하는 jstl 의 uri 값이 동일해야 된다는 것이 핵심입니다.

적어놓은 uri로 부터 뭔가를 다운로드받아서 실행한다거나 하진 않으니깐요.

만약 web.xml 의 저 부분을 수정했는데 됐다면 분명히

<%@taglib prefix="c" uri= <- 이 부분도 아마 그렇게 되어 있을 겁니다.


꼬박 이틀을 낭비했다고 생각했는데 결국은 조금 이해가 되는군요.
단순히 jstl를 쓸 수 있어서 좋은 것이 아니라 뭔가를 알았다는 것이 또 이렇게 기쁠 줄이야.. :lol: 
uri는 단순한 identifier일 뿐 그 이상은 아니라는 글을 어디선가 봤는데, 이제서야 그 의미를 알겠군요. 그런데, 굳이 http까지 붙여서 이렇게 헷갈리게 하다니..
WEB-INF/lib 폴더 아래에 있는 standard.jar 파일을 보니 jstl에 관련된 여러 tld파일들이 있습니다. 이것들은 자동으로 참조되니 web.xml 파일에서 굳이 tag-lib 태그를 사용하여 다시 uri를 지정할 필요가 없더군요.
다만 관련 jsp 파일의 uri 값을 jar안에 있는 tld 파일의 uri값과 동일하게만 쓰주면 됩니다. 즉, jar안의 tld 파일의 uri값과 jsp 파일의 uri값만 일치시킨다면 굳이 http://java.sun.com/jstl/core가 아닌 welcome.to.mywebsite.www.www.www의 값도 상관없습니다.
아울러, 굳이 tld 파일들을 jar에서 추출하여 다시 만들거나 카피할 필요도 없구요. 결국 제가 가진 WEB-INF/web.xml 파일에서 jstl 관련 태그는 없애버리고 밖으로 빼놓았던 관련 tld 파일들도 지워버렸습니다. 이미 jar 파일에서 참조되었기 때문이죠.
이렇게 간단한 원리를 이해하는데 이틀이나 걸렸지만( :oops: ) 그래도 기분은 좋습니 :P . 이런식으로 배워나가는거죠.
freesoft님께 감사드립니다.


출처 - http://kldp.org/node/22117






Posted by linuxism
,

jsp 내에 el 이 포함 되어 있을 경우 

jetty에서 아래와 같이 maven dependency 사용

<dependency>

    <groupId>org.mortbay.jetty</groupId>

    <artifactId>jsp-2.1-glassfish</artifactId>

    <version>9.1.02.B04.p0</version>

</dependency>


하지만 아래 dependency를 제거하지 않고 같이 사용하여 classpath에서 중복될 경우

<dependency>

    <groupId>javax.servlet.jsp</groupId>

    <artifactId>jsp-api</artifactId>

    <version>2.1</version>

    <scope>provided</scope>

</dependency>


아래와 같은 에러가 발생한다.

java.lang.NoSuchMethodError: javax.el.ExpressionFactory.newInstance()Ljavax/el/ExpressionFactory




Posted by linuxism
,