2016. 1. 5. 15:22ㆍlanguage/jsp
7. JSP 예제
이후 실습하는 모든 예제는 C:/www/myapp 아래에, 이클립스가 아닌 에디트 플러스와 같은 일반 에디터를 사용하여 만들고 테스트한다.
7.1 JSP 에러 핸들링 예전 방식
JSP는 오로지 에러만을 다룰 수 있는 JSP 페이지를 제공하므로써 에러를 다룰 수 있는 방법을 제공한다.
에러는 주로 런타임 에러가 대부분인데 이것은 JSP 내에서나 JSP 에서 호출한 객체에서 발생한다.
JSP 내에서 핸들링 할 수 없는 익셉션이 발생한다면 서블릿 컨테이너는 JSP 에러 페이지로 요청을 전달한다. 이때 발생한 익셉션 객체도 함께 전달된다.
JSP 에러 페이지를 만드는 것은 간단하다.
JSP 페이지를 만들고 컨테이너에게 이 페이지가 에러 페이지임을 알리면 된다.
이를 수행하기 위해서 page 지시어의 isErrorPage 속성값을 true 로 설정한다.
다음 errorPage.jsp 파일을 C:/www/myapp 에 만든다. /errorPage.jsp
<%@ page isErrorPage="true" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<body>
<p>
다음과 같은 에러가 발생했습니다.<br />
<%=exception.getMessage() %>
</p>
</body>
</html>
isErrorPage="true" 는 이 페이지가 에러를 전문적으로 다루는 페이지라는 것을 컨테이너에게 알려주는 역할을 한다. <%=exception.getMessage() %>
에러 페이지로 전달되어 온 익셉션의 에러 메시지를 출력한다.
이때 exception 내재 객체를 사용한다.
exception 내재 객체는 page 지시어에서 isErrorPage 속성이 true 인 JSP 페이지에서만 사용할 수 있다.
에러 페이지가 어떻게 작동하는지 알아보기 위해 잡히지 않는 익셉션을 발생시키는 간단한 JSP 페이지를 아래처럼 작성한다.
/errorMaker.jsp
<%@ page errorPage="errorPage.jsp" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
if (true) {
throw new Exception("고의적으로 발생시킨 Exception");
}
%>
7.2 JSP 에러 핸들링 현재 방식
web.xml 파일에 HTTP 상태코드3와 발생한 익셉션 유형별로 각각의 에러 페이지를 지정해 줄 수 있다.
이 방식은 서블릿 2.3에서 추가되었다.
아래 설정은 익셉션 유형을 java.lang.Throwable 로 하여 모든 익셉션를 다루로록 예제를 단순하게 했다.
/WEB-INF/web.xml
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/403.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
JSP 에러 핸들링 첫번째 방법과 달리 /error.jsp 페이지에서 예외 객체 exception 은 직접 접근하지 못한다.
대신 새로이 추가된 속성값으로 예외 객체를 불러올 수 있다.4
Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
다음은 에러와 관련된 request속성 목록이다.
모두 위와 같은 방법으로 접근할 수 있다.
javax.servlet.error.status_code: 에러 상태 코드로 java.lang.Integer 타입으로 저장
javax.servlet.error.exception_type: 예외타입으로 java.lang.Class 타입으로 저장
javax.servlet.error.message: 오류 메시지를 String 으로 저장
javax.servlet.error.exception: 발생한 예외를 java.lang.Throwable 타입으로 저장
javax.servlet.error.request_uri: 문제를 일으킨 리소스의 URI를 String 으로 저장
javax.servlet.error.servlet_name: 문제을 일으킨 서블릿의 이름을 String 으로 저장
/error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Error</title>
</head>
<body>
<%
//Analyze the servlet exception
Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
String servletName = (String) request.getAttribute("javax.servlet.error.servlet_name");
if (servletName == null) {
servletName = "Unknown";
}
String requestUri = (String) request.getAttribute("javax.servlet.error.request_uri");
if (requestUri == null) {
requestUri = "Unknown";
}
if(statusCode != 500){
out.write("<h3>Error Details</h3>");
out.write("<strong>Status Code</strong>:" + statusCode + "<br>");
out.write("<strong>Requested URI</strong>:"+requestUri);
}else{
out.write("<h3>Exception Details</h3>");
out.write("<ul><li>Servlet Name:" + servletName + "</li>");
out.write("<li>Exception Name:" + throwable.getClass().getName() + "</li>");
out.write("<li>Requested URI:" + requestUri + "</li>");
out.write("<li>Exception Message:" + throwable.getMessage() + "</li>");
out.write("</ul>");
}
%>
</body>
</html>
http://localhost:8989/honggildong.jsp 를 방문한다.
honggildong.jsp 란 자원이 없으므로 404 에러가 발생하면서 error.jsp 파일이 응답할 것이다.
이 예제는 에러 핸들링의 힌트를 준다.
하지만 개발 단계에서는 에러 페이지 설정을 하지 않는게 좋다. 에러 핸들링 설정을 취소하려면 web.xml 에서 error 설정만 주석처리하면 된다.
참고로 이 예제는 인터넷 익스플로러에서는 테스트되지 않는다.
익스플로러에서 에러 페이지가 일정 바이트 이하면 에러페이지가 작동하지 않는다.
그 결과 404에러 메시지만을 보게 된다.3 중요한 것은 아니다. 따라서 이 예제를 테스트할 때는 인터넷 익스플로러외의 브라우저로 테스트한다.
7.3 쿠키
쿠키는 웹 브라우저에 저장되어 요청을 보낼때 함께 전송되는 간단한 데이터를 말한다.쿠키는 자바스크립트나 JSP에서 설정될 수 있다.
여기서는 JSP에서 쿠키를 설정하는 예만 살펴볼 것이다.
JSP에서 쿠키가 설정되면 응답데이터에 포함된다.
쿠키의 유효기간을 setMaxAge() 메소드를 사용하여 구체적인 시간을 명시한다면 응답 데이터를 받은 웹브라우저는 응답데이터에서 쿠키를 꺼내 쿠키저장소에 보관한다.
setMaxAge()를 사용하지 않은 쿠키데이터는 웹브라우저가 종료되면 사라진다.
쿠키 동작 과정
- 웹브라우저가 쿠키를 굽는 코드가 있는 웹 자원 요청
- 웹 자원은 HTTP 응답 헤더에 쿠키 값을 설정
- 웹 브라우저는 응답 헤더에 담겨져 전달된 쿠키 데이터를 저장
- 웹브라우저는 쿠키를 구어준 웹 사이트의 자원을 요청할 때마다 쿠키 데이터도 함께 전송
Set-Cookie: name=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure
위에서 강조된 문자열을 필수 데이터이며, 이탤릭체는 실제 값으로 변경되어야 하는 부분이다.
4번 과정에서 요청 헤더에 포함된 쿠키 정보는 아래와 같은 문자열이다.
Cookie: name1=VALUE1; name2=VALUE2;...
쿠키의 구성
- name : 이름
- value : 값
- expires :유효기간
- domain : 도메인
- path : 경로
- secure : 시큐어 웹 여부(https)
- javax.servlet.http.Cookie 클래스
- Cookie(String name, String value)
- getName()
- setValue(String)
- getValue()
- setDomain(String)
- getDomain()
- setPath(String)
- getPath()
- setMaxAge(int)
- getMaxAge()
- setSecure(boolean)
- getSecure()
다음 코드조각은 Cookie 클래스의 사용법을 보여주고 있다.
/*
* 쿠키 생성
*/
Cookie cookie = new Cookie("user", "gildong");
/*
* . 으로 시작되는 경우 모든 관련도메인에 전송되는 쿠키
* www.java-school.net, user.java-school.net, blog.java-school.net 등등
*/
cookie.setDomain(".java-school.net");
/*
* 경로를 '/'로 설정하면 웹사이트의 모든 경로에 전송되는 쿠키
* 만일 '/user' 와 같이 특정 경로를 설정하면 '/user' 경로만 전송되는 쿠키
*/
cookie.setPath("/");
/*
* 초단위의 쿠키 유효기간 설정
* 음수값이 설정되면 쿠키는 웹 브라우저가 종료할 때 삭제된다.
*/
cookie.setMaxAge(60*60*24*30); //30일동안 유효한 쿠키
쿠키에 대한 간단한 예제를 만들어 보자.
/cookie 디렉토리를 만들고 그 안에 아래 파일을 작성한다.
/cookie/index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>쿠키 테스트</title>
</head>
<body>
<h1>쿠키 테스트</h1>
<ul>
<li><a href="setCookie.jsp">쿠키 굽기</a></li>
<li><a href="viewCookie.jsp">쿠키 확인</a></li>
<li><a href="editCookie.jsp">쿠키 변경</a></li>
<li><a href="delCookie.jsp">쿠키 삭제</a></li>
</ul>
</body>
</html>
/cookie/setCookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<%
Cookie cookie = new Cookie("name", URLEncoder.encode("홍길동", "UTF-8"));
/*
* setPath()로 사용하지 않으면 setCookie.jsp 가 있는 디렉토리로 경로가 설정된다.
* path=/cookie
*/
response.addCookie(cookie);
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>쿠키를 굽는 페이지</title>
</head>
<body>
Set-Cookie: <%=cookie.getName() %>=<%=cookie.getValue() %> 문자열을 응답 헤더에 추가<br />
<a href="viewCookie.jsp">쿠키확인</a>
</body>
</html>
/cookie/viewCookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>요청과 함께 쿠키가 전송되는지 확인</title>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 1) {
int length = cookies.length;
for (int i = 0; i < length; i++) {
%>
<%=cookies[i].getName() %>=<%=URLDecoder.decode(cookies[i].getValue(), "UTF-8") %><br />
<%
}
}
%>
<a href="./">처음으로</a>
</body>
</html>
/cookie/editCookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<%
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 1) {
int length = cookies.length;
for (int i = 0; i < length; i++) {
if (cookies[i].getName().equals("name")) {
Cookie cookie = new Cookie("name", URLEncoder.encode("임꺽정" ,"UTF-8"));
response.addCookie(cookie);
}
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>쿠키 값 변경</title>
</head>
<body>
쿠키 값을 변경했습니다.<br />
<a href="viewCookie.jsp">쿠키확인</a>
</body>
</html>
/cookie/delCookie.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 1) {
int length = cookies.length;
for (int i = 0; i < length; i++) {
if (cookies[i].getName().equals("name")) {
Cookie cookie = new Cookie("name", "");
cookie.setMaxAge(0);
response.addCookie(cookie);
break;
}
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>쿠키 삭제</title>
</head>
<body>
name 쿠키를 삭제했습니다.<br />
<a href="viewCookie.jsp">쿠키확인</a>
</body>
</html>
7.4 include 지시어를 이용하는 페이지 분리
첨부 파일, example.zip 을 다운로드한 후 ROOT 애플리케이션의 최상위 디렉토리에 압축을 푼다.
http://localhost:8989/example/ex1/index.jsp를 방문한다.
/example/ex1/index.jsp 소스에서 include 지시어를 사용하여 subMenu.jsp (왼쪽 서브메뉴)을 인클루드하는 부분을 확인한다.
<%@ include file="../inc/subMenu.jsp" %>
index.jsp 소스에서 subMenu.jsp 페이지를 인클루드하고 있다.
페이지를 구성하는 부분을 분리한 다음 include 지시어를 사용하여 통합하면 유지 보수가 편리해 진다.
인클루드할 때 주의해야 할 사항은 상대 경로 문제이다.
인클루드 되는 파일인 subMenu.jsp 에서 링크 경로는 인클루드하는 index.jsp 를 기준으로 해서 작성해야 한다.
결국 index.jsp 를 기준으로 하나의 서블릿으로 만들어지기 때문이다.
참고로 css 파일에서의 이미지 링크의 경우는 이와는 달리 css 파일의 위치가 기준이 된다.
다시 말해css 파일을 임포트하는 JSP파일이 기준이 아니다.
7.5 자바 빈즈를 이용한 로그인 처리(세션 이용)
세션은 쿠키 기반 기술이다.
세션은 쿠키와 달리 쿠키값으로 세션ID 만 전송한다.
서블릿 컨테이너는 전송되어 온 세션ID로 판단하여 웹브라우저에 매핑되는 세션이 동작하는 것을 보장한다.
이번 예제의 소스 위치는 /example/ex2/ 이다.
http://localhost:8989/example/ex2/index.jsp를 방문한다.
이 화면에서 로그인을 테스트하려 하는데 아직 구현이 덜 되어 있다.
login_proc.jsp 페이지가 로그인을 처리하는 페이지인데, login_proc.jsp 소스를 열어 보면 net.java_school.user.User.java 자바 빈즈를 이용하고 있다.
예제를 실행하기 위해서는 net.java_school.user.User.java 를 아래와 같이 작성하고 WEB-INF/classes 에 바이트코드가 생성되도록 컴파일한다.
User.java
package net.java_school.user;
public class User {
private String id;
private String passwd;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
User.java 작성과 컴파일을 마쳤다면,
http://localhost:8989/example/ex2/index.jsp를 다시 방문하여 로그인을 테스트 한다.
/example/ex2/index.jsp 파일을 열고 파라미터를 전달하고 파라미터 값을 획득하는 코드를 확인한다.
<input type="text" name="id" />
id 파라미터가 login_proc.jsp 로 전송된다.
/example/ex2/login_proc.jsp 파일을 열어 아래 코드를 확인한다.
String id = request.getParameter("id");
id 파라미터의 값은 login_proc.jsp 에서 내재 객체 request 의 getParameter() 메소드를 사용해서 구할 수 있다.
login_proc.jsp 는 User 객체를 생성한 다음, 전달된 파라미터 id, passwd 를 이용해서 생성된 User 의 멤버를 셋팅한다.
사용자의 정보로 셋팅된 이 User 객체를 세션에 담는 것으로 로그인 처리를 완료한다.
예제를 간단하게 하기 위해 데이터베이스 조회와 관련된 코드를 생략했다.
따라서 어떤 아이디와 패스워드에 대해서도 로그인이 성공한다. login_proc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="net.java_school.user.User" %>
<%
String id = request.getParameter("id");
String passwd = request.getParameter("passwd");
/*
* 데이터베이스에 id, passwd 를 가진 회원정보가 있는지 조회하고 로직이 필요.
*/
User user = new User();
user.setId(id);
// 세션 객체 생성 후 User 객체를 user 란 이름으로 저장
session.setAttribute("user", user);
%>
<jsp:forward page="index.jsp" />
7.6 login_proc.jsp 에 표준 액션 적용
이번 예제의 소스 위치는 /example/ex3/ 이다.바로 전 예제와 기능은 같다.
다른 점이 있다면 코드를 표준 액션을 사용하도록 변경했다는 것이다.
login_proc.jsp 소스를 열어보면 코드가 아래처럼 간단하게 줄어든 것을 확인 할 수 있다.
login_proc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="net.java_school.user.User" %>
<jsp:useBean id="user" scope="session" class="net.java_school.user.User" />
<jsp:setProperty name="user" property="*"/>
<jsp:forward page="index.jsp" />
jsp:useBean 표준 액션은 다음과 같이 실행한다.
먼저 세션에서 id가 user 인 객체를 찾는다.
다시 말하면, 세션에서 키값이 "user" 로 저장된 객체를 찾는다.
만약 그런 객체가 없으면 net.java_school.user.User 클래스로부터 User 객체를 생성하고 이 객체를 jsp:userBean 표준 액션 엘리먼트의 id 속성값을 키값으로 해서 세션에 저장한다.
이제 두번째 표준액션이 실행된다.
jsp:setProperty 표준 액션은 전달된 파라미터 값으로 JSP 빈즈의 setter 메소드를 호출하여 값을 저장한다.
전달받은 파라미터 id, passwd 를 이용해서 User 객체의 멤버를 셋팅을 수행하는 것이다.
<jsp:setProperty name="user" property="*"/>
위 액션 태그는 User 빈의 setId() 메소드와 setPasswd() 메소드를 호출한다.
setter 메소드의 인자값은 메소드의 이름과 매칭되는 파라미터의 값이 전달된다.
좀더 정확한 이해를 위해 다음 표를 확인한다.
JSP/JSP 빈즈 | 코드 |
---|---|
index.jsp | <input type="text" name="id" /> |
login_proc.jsp | <jsp:setProperty name="login" property="id" /> |
User.java | set Id (String id) |
이는 자바에서 권고하는 네이밍 룰이다.
(이에 대해서는 "자바"과정에서 이미 공부했다.)
jsp:setProperty 표준액션을 사용할 때 JSP 빈즈가 자바 네이밍 룰을 따르지 않는다면 작동하지 않는다.
즉, 표준액션과 관련해서는 네이밍 룰이 권고사항이 아니라 문법이 된다.
7.7 업로드 파일 확인
서블릿에서 파일 업로드 예제를 다루었다.
다음 JSP는 upload 폴더에 업로드한 파일의 리스트를 보여준다.
/fileList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.io.*" %>
<%@ page import="java.net.*" %>
<%
String upload = application.getRealPath("/upload");
File dir = new File(upload);
File[] files = dir.listFiles();
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>저장된 파일 리스트</title>
<script type="text/javascript">
function goDownload(filename) {
var form = document.getElementById("downForm");
form.filename.value = filename;
form.submit();
}
</script>
</head>
<body>
<%
int len = files.length;
for (int i = 0; i < len; i++) {
File file = files[i];
String filename = file.getName();
%>
<a href="javascript:goDownload('<%=filename %>')"><%=file.getName() %></a><br />
<%
}
%>
<form id="downForm" action="download.jsp" method="post">
<input type="hidden" name="filename" />
</form>
</body>
</html>
7.8 파일 다운로드
다음은 위의 파일 목록 페이지에서 해당 파일을 클릭하면 다운로드를 하도록 하는 JSP페이지아다.
/download.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page import="java.io.File" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.io.FileInputStream" %>
<%@ page import="java.io.IOException" %>
<%@ page import="org.apache.commons.io.FileUtils" %>
<%
request.setCharacterEncoding("UTF-8");
String filename = request.getParameter("filename");
String path = application.getRealPath("/upload");
File file = new File(path + "/" + filename);
response.setContentLength((int) file.length());
String filetype = filename.substring(filename.indexOf(".") + 1, filename.length());
if (filetype.trim().equalsIgnoreCase("txt")) {
response.setContentType("text/plain");
} else {
response.setContentType("application/octet-stream");
}
String userAgent = request.getHeader("user-agent");
boolean ie = userAgent.indexOf("MSIE") != -1;
if (ie) {
filename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", " ");
} else {
filename = new String(filename.getBytes("UTF-8"), "8859_1");
}
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\";");
/* response.setHeader("Content-Transfer-Encoding", "binary"); */
OutputStream outputStream = response.getOutputStream();
try {
FileUtils.copyFile(file, outputStream);
} finally {
outputStream.flush();
}
%>
7.9 JSP 파일 업로드
다음은 서블릿 예제에서 다루었던 파일을 업로드하는 서블릿을 JSP로 바꾼 코드이다.fileupload_proc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="
java.util.Iterator,
java.io.File,java.util.List,
javax.servlet.http.HttpServletRequest,
org.apache.commons.fileupload.FileItem,
org.apache.commons.fileupload.FileItemFactory,
org.apache.commons.fileupload.FileUploadException,
org.apache.commons.fileupload.disk.DiskFileItemFactory,
org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%
//Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
//Configure a repository (to ensure a secure temp location is used)
File repository = (File) application.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
//Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");//한글파일명 처리위해 추가
//Parse the request
List<FileItem> items = upload.parseRequest(request);
//Process a file upload
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
String fileName = null;
if (!item.isFormField()) {
String fieldName = item.getFieldName();
out.println("fieldName : " + fieldName);out.println(",");
fileName = item.getName();
out.println("fileName : " + fileName);out.println(",");
String contentType = item.getContentType();
out.println("contentType : " + contentType);out.println(",");
boolean isInMemory = item.isInMemory();
out.println("isInMemory : " + isInMemory);out.println(",");
long sizeInBytes = item.getSize();
out.println("sizeInBytes : " + sizeInBytes);
}
// Process a file upload
String dir = application.getRealPath("/upload");
File uploadedFile = new File(dir + "/" + fileName);
item.write(uploadedFile);
}
response.sendRedirect("upload.html");
%>
출처 : http://www.java-school.net/jsp/JSP
도움이 되셨다면 공감을 부탁드립니다. ^^
'language > jsp' 카테고리의 다른 글
jsp 홈페이지 주소 가져오기 / 서버주소 가져오기 (0) | 2017.02.06 |
---|---|
jstl 문자열 배열 처리하기 / split forEach / forTokens (0) | 2016.11.23 |
jstl fn 정리 / jstl functions 정리 (0) | 2016.11.23 |
jstl 날짜 차이 계산하기 / parseDate / parseNumber (0) | 2016.11.23 |
Jsp 커스텀 태그라이브러리(Custom Tag Library Descriptor) 생성 및 사용 (2) | 2016.11.11 |
[필독][기초] / JSP [part 3] (0) | 2016.01.05 |
[필독][기초] / JSP [part 2] (0) | 2016.01.05 |
[필독][기초] / JSP [part 1] (0) | 2016.01.05 |
[필독][기초] / JSP 목차 (0) | 2016.01.05 |
[필독][기초] / 서블릿 / servlet [part 9] (0) | 2016.01.05 |