728x90
디자인 패턴: 클래스를 설계하는 기술
MVC2 컴포넌트 설계 / MVC2 패턴
1. 화면의 자바코드 없애기
2. 컨트롤러 만들기
1. 자바코드 없애기 / 제어문 없애기
EL (Expression Language)
- JSP에서 저장객체를 출력할때 스크립팅<%= %>을 전혀 쓰지 않을 수 있는 기술
- 표현식을 대체
표현식 <%= value %> ▶ EL ${ value }
내장 객체 | 의미 | |
pageScope | JSP의 page 객체를 참조하는 객체 | |
requestScope | 생략가능/ ${ 객체명.이름 } | JSP의 request 객체를 참조하는 객체 |
sessionScope | 생략가능/ ${ 객체명.이름 } | JSP의 session 객체를 참조하는 객체 |
applicationScope | 생략가능 | JSP의 application 객체를 참조하는 객체 |
param | ${ 객체명.이름 } | 요청 파라미터를 참조하는 객체 |
paramValues | 요청 파라미터(배열)를 참조하는 객체 | |
initParam | 서블릿컨텍스트 초기화 파라미터를 참조하는 객체 | |
cookie | 쿠키 객체를 참조하는 객체 |
1. EL 기본
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>EL태그는 표현식을 대체합니다</h2>
${ 1 + 2 }
<br> ${ 1 > 2 }
<br /> ${ 1 == 2 }
<br /> ${ 1 == 2 ? '같음' : '다름' }
<br />
<!-- ||, or 둘 다 써도 됨 -->
${ 1 < 2 || 1 > 2 }
<br /> ${ 1 < 2 or 1 > 2 }
<br /> ${ 1 < 2 && 1 > 2 }
<br /> ${ 1 < 2 and 1 > 2 }
<br /> ${ '홍길동' == '홍길동' }
<br /> ${ '홍길동' eq '홍길동' }
<br /> ${ ! false }
<br /> ${ not false }
<br />
<!-- 대체 가능
< , lt (little then)
<=, le (little or equals)
> , gt
>= , ge (greater or equals)
-->
</body>
</html>
2. param.태그이름으로 파라미터 값 가져오기
(request.Parameter 사용x)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="el_form_ok.jsp" method="post">
이름:<input type="text" name="name"><br /> 아이디:<input
type="text" name="id"><br /> 비밀번호:<input type="password"
name="pw"><br /> <input type="submit" value="확인">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 원래는 request.Parameter 사용했었음 -->
<!-- param.태그이름 으로 한번씩 받아서 사용합니다. -->
${ param.name }
<br> ${ param.id }
<br> ${ param.pw }
</body>
</html>
3. User 객체를 생성 후 vo라는 변수에 담고, session, application에 저장 - 사용
<%@page import="com.example.bean.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
User vo = new User();
vo.setId("aaa123");
//세션 저장
//1
session.setAttribute("vo", vo);
//2
session.setAttribute("auth", "y");
//어플리케이션 저장
application.setAttribute("menu", "햄버거");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- vo는 값까지 사용 -->
<!-- 어딘꺼를 사용하는지 알 수 있도록 session, application 불여줌 -->
${ sessionScope.vo.id }
<br> ${ sessionScope.auth }
<br> ${ applicationScope.menu }
<br>
</body>
</html>
4. request에 저장된 vo의 id를 꺼내줘 혹은 setAttribute의 "vo" 이름. id,name,email
<%@page import="com.example.bean.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
User vo = new User();
vo.setId("hhh123");
vo.setName("홍길숙");
vo.setEmail("hhh@naver.com");
request.setAttribute("vo", vo); //리퀘스트에 강제 저장
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- request에 저장된 vo의 id를 꺼내줘 -->
아이디: ${ requestScope.vo.id }
<br /> 이름: ${ requestScope.vo.name }
<br /> 이메일: ${ requestScope.vo.email }
<br />
<!--
requestScope는 생략을 하고 많이 사용
사용되는 순서 = request → session → application (사용주기가 짧은 것부터)
setAttribute의 "vo" 이름. id,name,email
-->
${ vo.id }
<br> ${ vo.name }
<br> ${ vo.email }
<br>
</body>
</html>
JSTL (제어문 없애기)
- JSP Standard Tag Library
- 자바의 제어문을 HTML 태그화
- JSTL의 경우 우리가 사용하는 Tomcat 기본 컨테이너에 포함되어 있지 않으므로,
별도의 라이브러리를 설치하고 사용
더보기
JSTL 태그
- Core 라이브러리는 기본적인 라이브러리로 출력, 제어문, 반복문 같은 기능이 포함
- 코어 라이브러리를 사용하기 위해서 반드시 JSP 파일 내의 지시자 태그 사용
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
1. 출력 태그
<c:out value="출력값">
2. 변수 선언 태그
<c:set var="변수명" value="설정값" scope="범위">
- JSTL이 지원하는 태그에서 사용할 수 있는 변수를 설정하기 위해 사용, EL변수 생성
- var: 값을 저장할 EL 변수의 이름을 지정함.
value: 변수의 값을 지정함. 표현식, EL, 텍스트를 사용하여 지정가능.
scope: 변수를 저장할 영역을 지정함. page, request, session, application 중 하나를 지정해야 하며 지정하지 않을 경우 page를 기본 값으로 사용.
3. 변수 제거 태그
<c:remove var="변수명" scope="범위">
- remove 태그를 사용시 삭제할 변수의 scope을 지정하지 않으면 동일한 이름으로 저장된 모든 영역의 변수를 삭제
- but, 굳이 지우지 않아도 됨
4. 조건문(if) 태그
<c:if test="조건식" >
- 자바 언어의 if 블록과 비슷한 기능을 제공합니다. 중첩된 if~else 문과 같은 효과를 낼 수는 없지만 단순한
if 블록을 쉽게 대체할 수 있기 때문에 많이 사용
5. 조건문(choose) 태그
<c:choose>
<c:when test="조건식"> 처리 내용 </c:when>
<c:when test="조건식"> 처리 내용 </c:when>
<c:otherwise> 처리 내용 </c:otherwise>
</c:choose>
- 자바의 switch 구문과 if~else 구문을 혼합한 형태로 다수의 조건문을 하나의 블록에서 수행할 때 사용
- otherwise = else
6. 반복문 태그 [암기]
<c:forEach items="객체명" begin="시작값" end="끝 값" step="증감식" var="변수명">
- 배열, 컬렉션 또는 맵에 저장되어 있는 값들을 순차적으로 처리할 때 사용
- 배열의 경우는 객체의 배열뿐만 아니라 기본 데이터 타입의 배열도 알맞게 처리를 하며 기본 데이터 타입은 래퍼 클래스를 통해 처리
- step = 몇번씩 증감 할꺼냐
실습
더보기

회전하는 법 암기



1. if절, choose절
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>if절 확인하기</h3>
<form action="jstl_if.jsp">
이름:<input type="text" name="name"><br> 나이:<input
type="text" name="age"><br> <input type="submit"
value="확인"><br>
</form>
<h3>choose절 확인하기</h3>
<form action="jstl_choose.jsp">
이름:<input type="text" name="name"><br> 나이:<input
type="text" name="age"><br> <input type="submit"
value="확인"><br>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- 출력문 --%>
<c:out value="${ param.name }" />
<%-- 변수로 선언 --%>
<c:set var="num" value="${param.age}" />
<c:out value="${num}" />
<hr />
<%-- if문 --%>
<% if(request.getParameter("name").equals("홍")) { %>
<h3>홍 입니다ㅣ</h3>
<% } %>
<c:if test="${ param.name eq '홍' }">
<h3>홍 입니다.</h3>
</c:if>
<c:if test="${ param.age >= 20 }">
<h3>성인입니다.</h3>
</c:if>
<c:if test="${ param.age < 20 }">
<h3>미성년자입니다.</h3>
</c:if>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:choose>
<c:when test="${ param.name eq '홍길동' }">
<h3>홍길동</h3>
</c:when>
<c:when test="${param.name eq '이순신' }">
<h3>이순신</h3>
</c:when>
<c:otherwise>
<h3>둘다 아님</h3>
</c:otherwise>
</c:choose>
<hr>
<c:choose>
<c:when test="${ param.age >= 20 }">
성인입니다.
</c:when>
<c:otherwise>
미성년자입니다.
</c:otherwise>
</c:choose>
</body>
</html>
2. forEach


<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>1~100까지 홀수 합</h3>
<%
int sum = 0;
for(int i = 1; i <= 100; i+=2) {
sum = sum + i;
}
%>
결과:<%=sum %>
<hr />
<c:set var="sum" value="0" />
<!-- 변수값, 변수이름은 sum, sum값은 0 -->
<!-- 지역변수의 개념으로 같은 sum이 있으면 덮어버림 -->
<c:forEach var="i" begin="1" end="100" step="2">
<c:set var="sum" value="${ sum + i }" />
</c:forEach>
결과:${ sum }
<hr>
<h3>2~9단 까지 구구단 세로 출력</h3>
<!-- step은 생략하면 자동으로 1 -->
<c:forEach var="i" begin="2" end="9" step="1">
<c:forEach var="j" begin="1" end="9" step="1">
${i} * ${j} = ${i*j}<br>
</c:forEach>
<br>
</c:forEach>
<hr>
<h3>향상된 포문</h3>
<%
int[] arr = new int[] {1, 2, 3, 4, 5};
for(int a : arr) {
out.println(a);
}
%>
<br>
<!-- 배열은 생성구문이 없어서 아래와 같이 적어줌 -->
<c:set var="arr" value="<%= new int[] {1, 2, 3, 4, 5} %>" />
<!-- 회전하는 방법 꼭 알아두기 -->
<c:forEach var="a" items="${ arr }" varStatus="s">
<!-- for(int a : arr) 이것과 같음 -->
인덱스번호: ${ s.index }
순서: ${ s.count }
값: ${ a }
<br>
</c:forEach>
</body>
</html>
3.

<%@page import="java.util.HashMap"%>
<%@page import="java.util.HashSet"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String now = sdf.format(date);
ArrayList<String> list = new ArrayList<>();
HashSet<Integer> set = new HashSet<>();
HashMap<Integer, String> map = new HashMap<>();
list.add("hong");
list.add("kim");
set.add(1);
set.add(1); // X 안들어감
set.add(10);
map.put(1, "lee");
map.put(2, "jang");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
지금:
<%=now %><br> 리스트:
<%=list.toString() %><br> 맵:
<%=map.toString() %><br> 셋:
<%=set.toString() %><br>
</body>
</html>
4. 로또번호 생성
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.HashSet"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
/*
1. Set을 이용해서 처리
2. 1~45까지 로또번호를 생성하고 리스트에 추가
3. 중복되지 않은 숫자의 6개의 로또번호를 저장하면 됩니다.
4. 화면에 출력
*/
HashSet<Integer> set = new HashSet<>();
while(true) {
int ran = (int)(Math.random() * 45 ) + 1;
set.add(ran);
if(set.size() == 6) {
break;
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
로또번호:
<%= set.toString() %>
</body>
</html>
5.

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//자바코드
int a = 10;
if(a >= 10) {
out.println("10보다 큼"); //화면 출력
} else {
out.println("10보다 작음");
}
%>
<hr>
<%
for(int i = 1; i <= 10; i++) {
out.println("<br>" + i); //"" 넣으면 태그로 인식
}
%>
<hr>
<%
int num = 0;
if(num >= 0) {
out.println("<h6>num은 0보다 큽니다.</6>");
}
%>
<hr>
<!-- 위의 변수 num 그대로 사용가능, 화면이 하나로 연결되어 있음 -->
<% if(num >= 10) { %>
<h6>num은 10보다 큼</h6>
<% } else { %>
<h6>num은 10보다 작음</h6>
<% } %>
<hr>
1. 구구단 3단 out.perintln과, br태그를 사용해서 브라우저 화면에 출력
<% int j = 3; %>
<% for(int k = 1; k <= 9; k++) { %>
<% out.println("<br>" + j + " * " + k + " = " + j*k); %>
<% } %>
<hr>
2. 동일한 name을 가진 체크박스 20개를 브라우저에 생성
<br>
<% for(int i = 1; i <= 20; i++) { %>
<input type="checkbox" name="test"> HTML
<br>
<% } %>
</body>
</html>
6.

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//상단부 선언
int a = 10;
String str = "hello world";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- ctrl + shift + / 단축키
<%
out.println(a + "<br>");
out.println(str + "<br>");
%>
--%>
<!--
html 주석은 보임
-->
<%=a %><br>
<%=str %><br>
<h2>구구단 3단을 표현식을 통해서 출력</h2>
<% for(int i = 1; i <= 9; i++) { %>
<%-- 이 부분은 html 코드가 들어가는 부분이기 때문에 그냥 적으면 출력, 변수만 <%= %>에 담아줌 --%>
ah....
<%= "3 * " + i + " = " + 3*i %><br>
<%-- 3 * <%= i %> = <%=3*i %><br> --%>
<% } %>
<h2>반복문으로 체크박스에 1~20까지 이름을 붙여서 가로 출력</h2>
<% for(int i = 1; i <= 20; i++) { %>
<%= i %>
<input type="checkbox" name="test">
<% } %>
</body>
</html>
형변환 태그
1.
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>formatNumber, formatDate, parseDate, parseNumber</h2>
<%--
format → 형식변환(보여지는 숫자, 날짜의 형식 변환)
parse → 형변환(데이터타입 변환)
--%>
<hr>
<h3>formatDate → 날짜를 날짜의 형태로 변경</h3>
<c:set var="day" value="<%=new Date() %>" />
${ day }
<br>
<!-- Fri Dec 02 16:27:37 KST 2022 이렇게 나옴 -->
<fmt:formatDate var="r_day" value="${ day }"
pattern="yyyy년 MM월 dd일 hh:mm:ss" />
<fmt:formatDate var="r_day2" value="${ day }" pattern="yy-MM-dd" />
${ r_day }
<br> ${ r_day2 }
<br>
<hr>
<h3>parseDate → 문자를 날짜의 형태로 변경</h3>
<fmt:parseDate var="r_day3" value="2022-12-02" pattern="yyyy-MM-dd" />
<!-- 패턴은 동일한 형태로 들어가야 함 -->
<fmt:parseDate var="r_day4" value="2022-12-02 23:45:12"
pattern="yyyy-MM-dd HH:mm:ss" />
<!-- 24시간 기준 HH -->
${ r_day3 } ${ r_day4 }
<hr>
<h3>formatNumber → 숫자형식을 숫자의 형태로 변경</h3>
<fmt:formatNumber var="r_num" value="2000" pattern="0,000.000" />
<!-- 0이 자릿수, 원은 문자열로 붙여 ㅎㅎ -->
${ r_num }
<br>
<hr>
<h3>parserNumber → 문자를 숫자의 형태로 변경</h3>
<!-- 문자가 있을 때 그 숫자만 뽑고 싶다하면 사용 -->
<fmt:parseNumber var="r_num2" value="1,000원" pattern="0,000원" />
${ r_num2 }
<br>
<hr>
<h2>실습</h2>
<h3>아래 값들을 2020년 05월 03일 형식으로 변경해서 출력</h3>
<c:set var="TIME_A" value="2020-05-03" />
<!-- 문자 -->
<fmt:parseDate var="TIME_A1" value="${ TIME_A }" pattern="yyyy-MM-dd" />
<fmt:formatDate var="TIME_A2" value="${ TIME_A1 }"
pattern="yyyy년 MM월 dd일" />
${ TIME_A2 }
<br>
<!-- var값은 생략하면 나감 -->
<c:set var="TIME_B" value="<%=new Date() %>" />
<!-- 날짜 -->
<fmt:formatDate var="TIME_B1" value="${ TIME_B }"
pattern="yyyy년 MM월 dd일" />
${ TIME_B1 }
<br>
</body>
</html>
2.
<%@page import="java.util.ArrayList"%>
<%@page import="com.example.bean.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
ArrayList<User> list = new ArrayList<>();
for(int i = 1; i <= 10; i++) {
User user = new User();
user.setId(i+""); //다 문자열
user.setName("홍길동" + i);
user.setEmail(i + "@naver.com");
list.add(user);
}
//리퀘스트에 담는다
request.setAttribute("list", list);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>list안에 값을 행별로 번호를 붙여서 반복문으로 출력</h3>
${ list }
<br>
<!-- list객체 주소가 나옴 -->
<c:set var="sum" value="0" />
<c:forEach var="a" items="${ list }" varStatus="s">
<!-- 향상된 for문과 같음 -->
${ a.id }
${ a.name }
${ a.email } <!-- get 안써도 나옴 -->
${ s.count }번: ${ a.getId() } / ${ a.getName() } / ${ a.getEmail() }
<c:set var="sum" value="${ sum + s.count }" />
<br>
</c:forEach>
번호합:${ sum }
</body>
</html>
header - section - footer
<%@ include file="include_header.jsp"%>
header
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<header>
<h3>header파일</h3>
<nav>
<ul>
<li>목록</li>
<li>목록</li>
</ul>
</nav>
</header>
section - 실행
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="include_header.jsp"%>
<section>
<h3>본문입니다.</h3>
</section>
<%@ include file="include_footer.jsp"%>
footer
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<footer>
<h3>Copyright 2022.11.29</h3>
</footer>
</body>
</html>
2. 컨트롤러 만들기
URL - Pattern
package com.example.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("*.test") //1. URL주소를 확장자패턴으로 변경
public class TestController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// System.out.println("실행");
doAction(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
//2. get, post 요청을 하나로 모음
protected void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//3. 한글처리
request.setCharacterEncoding("utf-8");
//4. 요청분기
System.out.println( request.getRequestURI() );
//이렇게만 하면 basic파일의 href 부분의 이름이 바뀌어도 들어감
//경로를 일관성있게 통일해주는게 좋음
//System.out.println( request.getContextPath() ); //ContextPath()하면 JSPBasic 출력
String path = request.getContextPath();
//문자열 자르기
String command = request.getRequestURI().substring( path.length() );
System.out.println(command); //JSPBasic 잘리고, controller/join.test 출력
switch (command) {
case "/controller/join.test":
System.out.println("가입 처리");
break;
case "/controller/login.test":
System.out.println("로그인 처리");
break;
case "/controller/logout.test":
System.out.println("로그아웃 처리");
break;
case "/controller/delete.test":
System.out.println("탈퇴 처리");
break;
case "/controller/update.test":
System.out.println("수정 처리");
break;
default:
break;
}
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="join.test">가입</a>
<a href="login.test">로그인</a>
<a href="logout.test">로그아웃</a>
<a href="/JSPBasic/controller/delete.test">탈퇴</a>
<a href="/JSPBasic/controller/update.test">수정</a>
</body>
</html>
오늘 하루
더보기
기억에 남는 부분
-
-
어려운 부분
-
-
문제 해결 부분
-
-
728x90
'Server > JSP' 카테고리의 다른 글
[JSP] MVC2 패턴 - 게시판 만들기 (0) | 2022.12.06 |
---|---|
[JSP] MVC2 패턴 - 회원가입, 로그인, 회원정보 수정, 탈퇴 (0) | 2022.12.06 |
[JSP] 예외처리 - 예외페이지, forward, JAVA Bean (0) | 2022.12.01 |
[JSP] 내장 객체(request, response, out, application), cookie, session, path (0) | 2022.11.30 |
[JSP] JSP(태그), Servlet(서블릿) (0) | 2022.11.30 |