[Jsp] Scope, action tag, Model1과 Model2, El tag, JSTL
jsp에서 데이터 저장시 공유하는 영역 - 언제까지 가지고 있는지
<Scope>
- 페이지 : 해당 page에서만 유지 / page객체 잘 안쓰는 이유 - 변수쓰면 되서, 저장기간이 너무 짧아서 안씀
- request : 클라이언트의 요청이 처리되는 동안 / 두세페이지 정도 유지
- Session : 세션이 유지되는 동안 / 없애지 않는 한 살아있고 로그아웃하거나 브라우저끄거나 브라우저 바꾸거나 하면 저장내용 없어짐
- Application :서버가 꺼질때까지 계속 유지됨. 브라우저를 끄든 브라우저를 바꾸든 유지되고, 서버가 꺼질때까지 계속 저장 - 이런 이유로 사용하기 위험하고, 저장기간이 너무 길어서 안씀 - 서버 꺼질 때 까지 영역에 저장이 유지 되어야하는 경우 씀 / 서버에 저장 되는 객체이기 때문에 session과 사용법 동일
Form method - post방식일 때 한글깨짐 방지(get방식은 톰캣8 부터 한글깨짐을 방지해준다.)
request.setCharacterEncoding("UTF-8");
*Scriptlet 최소한 사용하려고 하는 이유 : JAVA LOGIC 과 HTML 을 분리 시키기 위해서
- 협업에 방해가 됨 (실행했을 때 똑같은 화면이 잘 안보이거나 그런가..)
- 코드가, 페이지가 복잡해짐
- Java 영역과 html 영역 구분 복잡
스크립틀릿을 최소한으로 쓰기 위해 만들어진 - action tag
action tag
1.forward : 특정 페이지로 이동시켜준다. + 데이터를 전달(추가적인 파라메터)
Forward와 sendredirecrt의 차이점
- sendRedirect : 1.페이지만 보내고 값은 보내지 못함 / 2.최종페이지 알려줌 /3. response는 파라메터가 없음 그래서 값을 보내는 것을 사용할 수 없음
- Forward : 1.페이지 보내면서 특정 값을 추가해서 보낼 수 있음 / 2.거쳐간 페이지를 알려줌(:보안성이 좋음) /3. request는 파라메터가 있음 (데이터를 실어서 보낼때는 request객체를 사용함)
- - 파라메터는 request 객체에만 존재한다. 왜나면 request 객체가 요청한 client의 정보를 가지고 있는 객체이기때문이기때문에아닐까!
2.include : 특정 페이지를 불러옴 / <%@ page include%>를 대체
- include 시 param을 줄 수 있다.
- 이럴 때 사용함 : Header 와 footer 등 공통된 부분/ 반드시 자주 들어가는 부분을 넣을 때 일일이 넣어주면 비효율적이니까 만들어놓고 include하기
3. Use bean
action tag의 단점 : scriptlet을 다 대체 하지 못함 그래서 action tag를 많이 사용하지 않음 / forward와 include는 종종 사용됨
Model 1과 Model2
기존에는 클라이언트와 서버가 섞여있음
Scriptlet 을 최소화 시키려 하는 이유 : JAVA LOGIC 과 HTML 을 분리 시키기 위해서
- 모델1 : jsp에서 데이터를 다루는 부분만 java로 빼자 자바빈(java bean)을 사용 ———지금 안 씀
- 모델2 : 클라이언트와 서버가 명확하게 분리되어있음 mvc패턴?
Bean : 여러 jsp 에서 생성되는 데이터의 창고 역할 / data를 공통으로 저장하고 사용 : 자바로 만듦
(모델1에 대한 내용만 기억하고 javabean을 사용하는 방법은 따로 안봐도됨 09_JavaBean)
(Java Rresources - src - 에 패키지랑 클래스를 만들어줬는데 메인메서드(메인스레드) 생성하지 않음 : 그 이유는
클라이언트(브라우저)가 요청을하면 메인스레드가 생긴다구?? 하셨나..)
scriptlet을 없애기 위한 방법들
- Action tag
- Java bean - 모델 1은 없어졌고
> 이 두가지는 스크립틀릿의 사용을 다 대체 하지 못함
———
scriptlet 에서 대부분 쓰이는 자바출력문 <%= %> 을 없애기위한/간단하게 표현하려는 el 태그
ElTag(expression language tag)
- 기존 스크립틀릿의 출력문을 대체하기 위해 나왔다.
- 일반적으로 자바 변수의 값을 출력하는데 사용
- sessionScope, param 등을 이용해 파라메터의 값이나 세션값을 출력하기도 한다.
- Session.getattribute -> ${sessionScope.sessionId}
- Request.getparameter(“userId”) - > ${param.userId}
- 사칙연산,비교연산, 논리연산(true,false), 3항연산자 다 가능
- 이스케이프문자\ : 단순문자열이야 문자열로 인식해!
- 비교연산
: 꺽쇠가 많은곳에서 부등호는 잘 안쓰임 / 부등호를 쓰면 태그 꺽쇠로 인식하기도함 노란줄이나 색이 변함 에러뜨는건 아님
(e는 같다)
객체명 | 설명 |
== | eq | 두 값이 같으면 true, 다르면 false |
!= | ne | 두 값이 다르면 true, 다르면 false |
< | lt(Less Than) | 왼쪽 항이 오른쪽 항보다 작으면 true |
> | gt(Greater Than) | 왼쪽 항이 오른쪽 항 보다 크면 true |
<= | le | 왼쪽 항이 오른쪽 항보다 같거나 작으면 true |
>= | ge | 왼쪽 항이 오른쪽 항보다 같거나 크면 true |
JSTL (jsp standard tag library)
: 자바 로직(If나 for문등) 을 대체하기 위해서 사람들이 custom tag 제작 - 그 중 자주 사용되고 유용한 것을 모아 만든 라이브러리
- 자바영역이랑 jsp영역이랑 구분하지않고 편하게 사용하려고 만든거임
- jsp에서 사용하는 태그의 외부 라이브러리 (모음집)
- 사용하는 방법 jstldownload - jar파일을 다운받아서 lib폴더에 복붙하고, jsp파일 상단에 문구 복붙
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
:태그앞에는 c 가 붙고, 이거에 대한 설명은 여기서봐
라이브러리
남이 만든 소스를 가져다쓴다 : 라이브러리를 가져다쓴다
자바에서 없는 누군가 만든 외부에서 만든 소스 : 라이브러리에서 다운
c태그 : custom의 약자
<Jstl 태그 종류>
- c:set : jsp에서 사용될 변수 선언하고 값을 담기(var 변수명 value 값 scope 저장영역(기본값은 page) )
1. value속성 사용
2. 태그 몸체에 값을 지정
3.속성 삭제도 가능 (변수 선언하고 삭제하는 일은 별로 없음)
++
pom.xml(maven) 에 jstl 라이브러리 추가하기
안녕하세요. spring tools suite(sts3)으로 스프링 프로젝트를 만들때 jstl 라이브러리 에러가 나서 dependency 를 찾아보다가 에러가 나서 정리해 둡니다. 다음과 같은 dependency 의존성을 추가해 주시면 됩
chanki.tistory.com
[jsp8강] JSTL 사용법 (JSTL 라이브러리 추가방법, JSTL 선언)
[jsp8강] JSTL 사용법 (JSTL 라이브러리 추가방법, JSTL 선언) 이번글에서는 JSTL 라이브러리를 다운받고! 적용하고! 선언 하는 방법에대해서 알아보도록하겠습니다.JSTL 에대해서 잘모르시는분은 이전
bvc12.tistory.com
- c: if
- 자바의 if문과 비슷하다.
- c:if test="조건”
- test의 조건이 참이면 태그 몸체의 내용이 실행
- test는 기본적으로 참/거짓만 받을 수 있다.
- Test는 조건문이 들어가려면 el태그가 들어가야함 (el tag의 비교연산 사용하여 true false나오게끔)
- var 속성을 활용하면 결과를 따로 저장 할 수도 있다. (결과 : test(조건)의 값true/false)
단점 : 자바 if문의 else 역할이 없음 / c:if문을 여러개 쓰던가 해야함 (ex) ${myId ne 'admin'} )
- C:choose : 다중조건을 처리
- c:if의 단점을 보완하고자 사용하는
- 자바의 switch문과 비슷하다.
- c:when 태그의 test 값이 true면 태그 몸체를 수행
-switch의 단점도 보완이 됨 case에 조건문이 못들어감 값만 들어감 하지만 c:when은 가능
- foreach
- 일반적인 for문과 비슷하며, 주로 array나 collection,map등의 값을 꺼낼때 사용 한다
- c:foreach var = "변수" items="덩어리" begin="시작값" end="끝값" step="증가 정도" varStatus : 인덱스확인
- items에는 배열이나 컬렉션등의 덩어리가 들어간다.
- var에는 덩어리에서 꺼낸 값을 담는다.(향상된 for와 비슷)
- 실제로 향상된for문용으로 많이 씀
-일반적인 포문 for문 사용 가능 / 이중 for문 사용가능
<html>
1. fieldset 태그, legend 태그 사용
<fieldset>
<legend>Application 영역에 저장된 정보</legend>
<p>ID : <%=application.getAttribute("id") %></p>
<p>NAME : <%=application.getAttribute("name") %></p>
</fieldset>
2. table 태그
tr: 한행
th : 중앙정렬 , 볼드 처리
<에러>
- 서버를 켜서 실행을 했었던 프로젝트 이름을 도중에 바꿨더니 Run as 했을 때 경고창이 뜨며 안됨.
만만한 다른 프로젝트 하나 골라 실행을하고 Removeall 하고 다시 안됐던 프로젝트 실행하니까 됨
: 오른쪽에 있던 프로젝트는 톰캣에 저장된 거라 이름바꾸기 전의 프로젝트 내용이 저장된 상태였고, 이름바꾸면 서버켤 때 문제가 생겼던거임 그래서 removeall을 시켜주고 다시 실행하기!
jsp파일 이름은 바꿔도 되지만 프로젝트 이름은 가급적 수정하지 말자!
오늘 에러가 잘났는데, 오타도 있었고 코드 잘못작성해서 많이 일어났다..