JSP

부트캠프48일(core태그 , fmt태그 , fn태그 , model2시작)

동곤일상 2025. 4. 10. 17:51
반응형

1) core태그 - forEach

1-1) List객체 요소조회가능

1-2) map ,배열도 가능

 

2) JSTL형식화 태그 fmt

2-1) fmt태그 - formt

2-2) fmt태그 - parse

2-3) fmt태그 - 인코딩

 

3)functions 태그 fn

 

4) model2의 이해

 

5) model2 사용해보기

5-1)controller생성 , joinForm생성(회원가입) 

5-2)  jsp파일과 인코딩을위한filter

 

 


 

1) core태그  forEach

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

앞에 글에서부터 이어지는 forEach 예시임

 

1-1) List객체의 요소조회해보기

<h3>forEach태그를 이용해  List객체의 요소 출력해보기</h3>
<%
	List<Integer> list = new ArrayList<>();
	for(int i=1;i<=10;i++){
		list.add(i*10);
	}
	pageContext.setAttribute("list", list);
%>
<!-- varStatus : 인덱스번호를 반환해줌 -->
<!-- items : 해당변수의 요소출력 (자바의 향상된for문과 동일 -->
<c:forEach var="i" items="${list}" varStatus="s">
	[${s.index}]:${i} &nbsp;,&nbsp;
</c:forEach><br>

<!-- list를 2줄로 출력 -->
<c:forEach var="i" items="${list}" varStatus="s">
<c:if test="${s.index == 5}"><br></c:if>
[${s.index}]:${i} &nbsp;,&nbsp;
</c:forEach>

 

 

1-2)map , 배열 등도 조회가능

<%@page import="java.util.Arrays"%>
<%@page import="java.time.LocalDateTime"%>
<%@page import="java.time.LocalDate"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>forEach를 이용해 Collection 객체 조회</title>
</head>
<body>
<h3>forEach태그를 이용해 Map객체 출력하기</h3>
<%
	Map<String,Object> map = new HashMap<>();
	map.put("name","홍길동");
	map.put("today", LocalDateTime.now());
	map.put("age",20);
	pageContext.setAttribute("map", map);
%>
<c:forEach var="m" items="${map}" varStatus="s">
	${s.count}:${m.key}=${m.value}<br>
	<!-- HashMap이므로 순서는알수없다 키값쌍만 잘 나오면 됨! -->
</c:forEach>

<h3>map객체를 EL을 이용해 출력</h3>
이름(\${map.name}):${map.name}<br>
나이(\${map.age}):${map.age}<br>
날짜(\${map.today}):${map.today}<br>

<h3>forEach를 이용해 배열객체출력</h3>
<c:set var="arr" value="<%=new int[]{10,20,30,40,50}%>"/>
<c:forEach var="a" items="${arr}" varStatus="s">
	arr[${s.index}] = ${a} <br>
</c:forEach>

<h3>배열객체를 EL을 이용해 출력하기</h3>
arr[0]=${arr[0]}<br>
arr[1]=${arr[1]}<br>
arr[2]=${arr[2]}<br>
arr[3]=${arr[3]}<br>
arr[4]=${arr[4]}<br>

<h3>List객체를 EL을 이용해 출력</h3>
<c:set var="list" value="<%= Arrays.asList(10,20,30,40,50,60)%>" />
list[0]=${list[0]}<br>
list[2]=${list[2]}<br>
list[4]=${list[4]}<br>

<h3>forEach태그를 이용해 배열객체의 두번쨰 요소(1번인덱스)부터 세번쨰요소만(2번인덱스) 출력하기</h3>
<c:forEach var="a" items="${arr}" varStatus="s" begin="1" end="2">
<!-- 여기서 begin end 는 인덱스를 의미하게됨 -->
arr[${s.index}] = ${a}
</c:forEach>

<h3>forEach태그를 이용해 배열객체의 짝수인덱스요소만</h3>
<c:forEach var="a" items="${arr}" varStatus="s" step="2">
arr[${s.index}] = ${a}
</c:forEach>

<h3>forEach태그를 이용해 배열객체의 홀수인덱스요소만</h3>
<c:forEach var="a" items="${arr}" varStatus="s" begin="1" step="2" > 
arr[${s.index}] = ${a}
</c:forEach>

</body>
</html>

 


2) JSTL형식화 태그 fmt

 

다음과같은 taglib를 불러와서 사용해야함!

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL형식화 태그</title>
</head>
<body>
<h3>숫자관련 형식 지정</h3>
<!-- ₩(ㄹ + 한자버튼)  -->
<!-- formatNumber : 숫자를 타입에맞게 설정해줌 currency(money) percent(%) pattern(커스텀가능) -->
<fmt:formatNumber value="500000" type="currency" currencySymbol="₩" />원<br>
<fmt:formatNumber value="0.15" type="percent" /><br>
<fmt:formatNumber value="50000.345"  pattern="###,###.00" /><br>
<!--  pattern="###,###.00" 3자리마다 , 를 찍고  반올림 후 소수점 두자리까지만표시 -->

<!-- setLocal value="지역" : 지역설정 -->
<h3>지역설정하기</h3>
<fmt:setLocale value="en_US"/>
<fmt:formatNumber value="500000" type="currency"/><br>
<fmt:setLocale value="ko_KR"/>
<fmt:formatNumber value="500000" type="currency"/><br>

</body>
</html>


2-1) fmt태그의  format을 이용한 날짜관련태그 

formatDate

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jstl 형식화태그 fmt</title>
</head>
<body>
<h3>날짜관련태그</h3>
<c:set var="today" value="<%= new java.util.Date() %>"/>
년월일 : <fmt:formatDate value="${today}" type="date"/><br>
시분초 : <fmt:formatDate value="${today}" type="time"/><br>
년월일시분초 : <fmt:formatDate value="${today}" type="both"/><br>

년월일시분초-short : <fmt:formatDate value="${today}" type="both"
				timeStyle="short" dateStyle="short"/><br>
				
년월일시분초-long : <fmt:formatDate value="${today}" type="both"
				timeStyle="long" dateStyle="long"/><br>
				
년월일시분초-full : <fmt:formatDate value="${today}" type="both"
				timeStyle="full" dateStyle="full"/><br> 
				
년월일시분초-GMT : <fmt:formatDate value="${today}" type="both"
				timeStyle="full" dateStyle="full" timeZone="GMT"/><br>
				
형식지정 : <fmt:formatDate value="${today}" pattern="yyyy년 MM월 dd일 a HH:mm:ss  E요일"/><br>
<p>pattern속성은 SimpleDateFormat에서 사용하는 형식화문자와 같다고보면 됨</p>
<!--  
	~~Format클래스
	format() : 객체 => 형식화된 문자열
	parse() : 형식화된문자열 => 객체
 -->
</body>
</html>

 


 

2-2) pmt태그의 parse(형식화된문자열=>객체)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jstl 형식화태그 parse관련</title>
</head>
<body>
<h3>Format된 숫자를 숫자로 변경</h3>
<%-- var="num1"속성값으로 등록됨(화면출력X)--%>
<fmt:parseNumber value="20,000" var="num1" pattern="##,###"/>
<!-- pattern과 맞는 값이 들어오면 number로변경시켜줌 -->
<fmt:parseNumber value="10,000" var="num2" pattern="##,###"/>
${num1}+${num2}=${num1+num2}<br>

<%--var속성이없으면 화면출력됨--%> 
<fmt:parseNumber value="20,000" pattern="##,###"/><br>
<fmt:parseNumber value="10,000" pattern="##,###"/><br>

<h2>문제 : 20,000 + 10,000 = 30,000 출력해보기
num1변수와num2 이용</h2>
<fmt:formatNumber var="fNum1" value="${num1}" pattern="##,###"/>
<fmt:formatNumber var= "fNum2" value="${num2}" pattern="##,###"/>
<fmt:formatNumber var= "result" value="${num1+num2}" pattern="##,###"/>
답 : ${fNum1}+${fNum2} = ${result}<br>

<h3>Format된 날짜(문자형)를 날짜형으로 변경하기</h3>
<fmt:parseDate value="2025-12-25 16:00:00" pattern="yyyy-MM-dd HH:mm:ss" var="day"/>
${day}<br>

<h3>문제 : 2025-12-25일의 요일출력하기</h3>
<fmt:formatDate value="${day}" pattern="yyyy-MM-dd E요일"/>


</body>
</html>

 


2-3)fmt태그 - 인코딩 (Encoding)

 

<%-- request.setCharacterEncoding("UTF-8"); --%>
<fmt:requestEncoding value="UTF-8"/>

두개는 같은의미로 UTF-8 로 인코딩해주는것임 ( 인코딩을 안하면 한글 등이 깨질수있음)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>fmt태그 : 인코딩</title>
</head>
<body>
<%-- request.setCharacterEncoding("UTF-8"); --%>
<fmt:requestEncoding value="UTF-8"/>
<form name="f" method="post">
이름 : <input type="text" name="name" value="${param.name}"><br>
입사일 : <input type="text" name="hiredate" value="${param.hiredate}">
yyyy-MM-dd형태로 입력<br>

급여 : <input type="text" name="salary" value="${param.salary}"><br>
담당업무 : <input type="checkbox" name="job" value="서무">서무&nbsp;
		<input type="checkbox" name="job" value="개발">개발&nbsp;
		<input type="checkbox" name="job" value="비서">비서&nbsp;
		<input type="checkbox" name="job" value="인사">인사&nbsp;<br>
<button>전송</button>
</form>
<h3>입사일을 yyyy년MM월 dd일 E요일의 형태로출력 , 급여,연봉을 세자리마다,로출력해주기</h3>

이름:${param.name}<br>

<%--먼저 입력받은문자를 날짜로 만들어 준 후 다시 포맷팅을 해줘야함 
예외처리를 통해 잘못입력되면 다른 출력을 해주자
--%>
<c:catch var="formatexception">
<fmt:parseDate  var="pDate" value="${param.hiredate}" pattern="yyyy-MM-dd"/>
</c:catch>

입사일:
<c:if test="${formatexception != null}"> <!-- 예외발생 시 exception은 null이 아니다 -->
입사일은 yyyy-MM-dd 형태입력바랍니다<br>
</c:if>
<c:if test="${formatexception == null}">
<fmt:formatDate value="${pDate}" pattern="yyyy년MM월dd일 E요일"/><br>
</c:if>

급여 : <fmt:formatNumber value="${param.salary}" pattern="#,###"/><br>
<!-- pattern ="#,### (3자리마다 ,를 찍어준다) #:숫자가없으면출력안함 -->
연봉: <fmt:formatNumber value="${param.salary*12}" pattern="#,###"/><br>
<%--paramValues.job ㅣ 배열객체 --%>
담당업무 : 
<c:forEach var="i" items="${paramValues.job}">
${i}&nbsp;&nbsp;
</c:forEach>

</body>
</html>

 

 

 

 


3) function태그 

 

taglib는 다음과같이 사용된다

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

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="str1" value="Functions <태그>를 사용합니다.           " />
<c:set var="str2" value="사용" />
<c:set var="tokens" value="2,3,4,5,6,7,8,9,10" />
length(str1)=${fn:length(str1)}:str1문자열의 길이 <br>
toUpperCase(str1)=${fn:toUpperCase(str1)}:str1문자열을 대문자로 변경<br>
toLowerCase(str1)=${fn:toLowerCase(str1)}:str1문자열을 소문자로 변경<br>
substring(str1,3,6)=${fn:substring(str1,3,6)}:str1의 3~5인덱스 부분문자열<br>
substringAfter(str1,str2)=${fn:substringAfter(str1,str2)}:
                                  str1에서 str2 부분 이후의 부분문자열<br>
substringBefore(str1,str2)=${fn:substringBefore(str1,str2)}:
                                  str1에서 str2 부분 이전의 부분문자열<br>
contains(str1,str2)=${fn:contains(str1,str2)}:str1내에 str2 문자열 존재?<br>
trim(str1) = ${fn:trim(str1)}:공백제거 <br>
replace(str1," ","-")=${fn:replace(str1," ","-")} : 공백을 -으로 치환<br>

split(tokens,",")=${fn:split(tokens,",")}<br>
<c:set var="arr" value="${fn:split(tokens,',')}" />
<c:forEach var="i" items="${arr}">${i}&nbsp;&nbsp;</c:forEach><br>
join(arr,"-")=${fn:join(arr,"-")} : 배열을 '-'으로 하나의 문자열로 연결<br>
=============<br>
<c:forEach var="i" items="${arr}">
  <c:if test='${i == 1}'> true <br> </c:if>
  <c:if test='${i != 1}'> false <br> </c:if>
</c:forEach><br>
=============<br>
=============<br>

</body>
</html>

 

 

functions 태그 응용

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<pre><code>
<!--
	paramValues.job : job 파라미터의 값들을 배열로리턴
	${fn:join(배열,',')} : 배열의요소를 ,로 연결해 문자열로리턴
 -->
 <c:set var="jobs" value="${fn:join(paramValues.job, ',')}"/>
급여 : <input type="text" name="salary" value="${param.salary}"><br>
담당업무 : <input type="checkbox" name="job" value="서무"
<c:if test="${fn:contains(jobs,'서무')}">checked</c:if>>서무&nbsp;
	
		<input type="checkbox" name="job" value="개발"
		<c:if test="${fn:contains(jobs,'개발')}">checked</c:if>>개발 &nbsp;
		
		<input type="checkbox" name="job" value="비서"
		<c:if test="${fn:contains(jobs,'비서')}">checked</c:if>>비서&nbsp;
	
		<input type="checkbox" name="job" value="인사"
		<c:if test="${fn:contains(jobs,'인사')}">checked</c:if>>인사&nbsp;<br>
<button>전송</button>
</form>
</pre></code>


4) model2 의 이해

 

/webapp/ex15_model2/hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Model2 이해</title>
</head>
<body>
${hello} 
<!--hello :  request영역의 속성명 -->
</body>
</html>

 

\webapp\WEB-INF\url.properties

(프로젝트명 /xxxx.do 를 호출 시 오른쪽이름을 가진 jsp가 호출?)

/hello.do=hello
/loginForm.do = loginForm

 

java\ex15_model2\Controller.java

package ex15_model2;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Properties;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//http://localhost:8080/jspStudy/hello.do 요청
//hello.do 라는 파일은 존재하지않음
// *.do => a.do .....adadakk/gg.do ..요청시 Controller 서블릿호출
@WebServlet(urlPatterns = {"*.do"},
initParams = {@WebInitParam(name="properties",value="url.properties")})
public class Controller extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private Properties pr = new Properties();
	private Action action = new Action();
	private Class[] paramType = new Class[] 
			{HttpServletRequest.class,HttpServletResponse.class};


	@Override
	public void init(ServletConfig config) throws ServletException{
		//config : properties = url.properties 값이 저장
		FileInputStream f = null;
		String props = config.getInitParameter("properties");
		//props : url.properties 가 저장
		try {
			//config.getServletContext().getRealPath("/") : 웹어플리케이션폴더
			//f = WEB-INF/ url.properties 파일 읽기
			f=new FileInputStream
					(config.getServletContext().getRealPath("/")+"WEB-INF/"+props);
			pr.load(f); //  url.properties에 작성한 /hello.do=hello를 가지고있게됨 
			f.close();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}

	public Controller() {
		super();
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		Object[] paramObjs = new Object[] {request,response};
		ActionForward forward = null;
		String command = null;
		try { 
			// request.getRequestURI() : jspStudy/hello.do
			// request.getContextPath().length() : /jspStudy의 길이 
			//command = /hello.do
			//methodName = hello
			
			command = request.getRequestURI().substring(request.getContextPath().length());
			String methodName = pr.getProperty(command);
			//action.getClass() : Action클래스의정보를 가져옴
			//getMethod(메서드명,파라미터타입) : 클래스정보에서 method정보
			Method method = action.getClass().getMethod(methodName, paramType);
			//invoke(호출대상객체,매개변수값(인자)) : 지정된 매개변수사용해 메서드호출
			forward = (ActionForward)method.invoke(action, paramObjs);
			//forward = return new ActionForward(false,"ex15_model2/hello.jsp");
		}
		catch (NullPointerException e) {
			forward = new ActionForward();
		}
		catch (Exception e) {
			throw new ServletException(e);
		}
		if(forward!= null) {
			if(forward.isRedirect()) {
				response.sendRedirect(forward.getView());
			}
			else {
				//forward.getView() : "ex15_model2/hello.jsp"
				//disp : 다음호출할 페이지
				RequestDispatcher disp = request.getRequestDispatcher(forward.getView());
				disp.forward(request, response);
				//ex15_model2/hello.jsp페이지를 호출
			}
		}
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

 

/java/ex15_model2/ActionForward.java

package ex15_model2;

public class ActionForward {
	private boolean redirect;
	private String view;
	public ActionForward() {}

	public ActionForward(boolean redirect, String view) {
		this.redirect = redirect;
		this.view = view;
	}

	//getter setter
	public boolean isRedirect() {
		return redirect;
	}

	public void setRedirect(boolean redirect) {
		this.redirect = redirect;
	}

	public String getView() {
		return view;
	}

	public void setView(String view) {
		this.view = view;
	}
	

}

 

/java/ex15_model2/Action.java

package ex15_model2;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Action {

	public ActionForward hello(HttpServletRequest request,
			HttpServletResponse response) {
		request.setAttribute("hello", "helloWorld");
		return new ActionForward(false,"ex15_model2/hello.jsp");
	}
	
	public ActionForward loginForm(HttpServletRequest request,
			HttpServletResponse response) {
		request.setAttribute("id", "admin");
		return new ActionForward(false,"ex15_model2/loginForm.jsp");
        //여기서 return한 ActionForward의 view부분으로이동하게될것임
	}
}

 

http://localhost:8080/jspStudy/hello.do 로 접근 하면

request의 속성이 출력될것임 ${hello}

 

 

다만들었다면 (추가변경시)Action클래스와 url.properties만 건드려주면된다 

 

 


5)model2 사용 ( 새로운프로젝트 model2study)

5-1) joinForm 생성(회원가입)

 

DynamicProject(model2Study2생성)

 

cos.jar 

mariaddb-java-client-3.5.1.jar

sitemesh-3.-.1.jar은 

model1study프로젝트에서 복붙한 후

WEB-INF / lib 에 붙여넣자

 

mskimrequest.jar 파일(Servlet)

mskimrequest.jar
0.00MB

 

 

/model2Study/src/main/java/controller/MemberController.java

package controller;

import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;

import gdu.mskim.MskimRequestMapping;
import model.member.MemberDto;

//http://localhost:8080/model2Study/member/joinForm로 접속해봐
//   /member/로 접근할수있다!
// /member/에 없는 정보를 접근하려고한다면 view에서찾는다 
@WebServlet(urlPatterns = { "/member/*" }, initParams = { @WebInitParam(name = "view", value = "/view/") })
public class MemberController extends MskimRequestMapping {
	private MemberDto dto = new MemberDto();

}

 

 

/model2Study/src/main/webapp/view/member/joinForm.jsp

(model1프로젝트에 있을거임)

action 부분(join.jsp-->join) 변경하자

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>
<link rel="stylesheet" href="../css/main.css">
</head>
<body>
<%--onsubmit :  나의 form 내부에 submit버튼 클릭되면 
			form 태그에 이벤트 발생(target == form)
return input_check(this) : input_check()함수 호출 , 매개변수this : form객체를 의미 --%>  		
			
<form action="join" name="f" method="post" onsubmit="return input_check(this)">
	<input type="hidden" name="picture" value=""><!-- 업로드된 이미지의 이름이 들어갈태그 -->
	<table>
	<caption>회원가입</caption>
		<tr>
		<td rowspan="4" valign="bottom">
		<img src="" width="100" height="120"  id="pic"><br>
		<%--
			href = "javascript:win_upload()" : 자바스크립트의 win_upload()호출
		 --%>
		<font size="1"><a href="javascript:win_upload()">사진등록</a></font>
		</td><th>아이디</th>
		<td><input type="text" name="id">
		<button type="button" onclick="idchk()">중복검색</button>
		</td></tr>
		<tr><th>비밀번호</th><td><input type="password" name="pass"></td></tr>
		<tr><th>이름</th><td><input type="text" name="name"></td></tr>
		<tr><th>성별</th>
		<td>
		<label for="gender1">남</label>
		<input type="radio" name="gender" id="gender1" value="1">
		<label for="gender2">여</label>
		<input type="radio" name="gender" id="gender2" value="2">
		</td></tr>
		<tr><th>전화번호</th><td colspan="2"><input type="text" name="tel"></td></tr>
		<tr><th>이메일</th><td colspan="2"><input type="text" name="email"></td></tr>
		<!-- button태그의 기본type : submit임 -->
		<tr><td colspan="3"><button>회원가입</button></td></tr>
	</table><!-- -zzz -->
</form>
<script>
function input_check(f){
	//f : <form...>
	//f.id : <input name="id">name이 id인태그
	if(f.id.value.trim() == ""){ 
		alert("아이디입력")
		f.id.focus(); //name이id인 곳에 포커스를 둠
		return false; //기본이벤트 취소
	}
	if(f.pass.value.trim() == ""){ 
		alert("비밀번호입력")
		f.pass.focus();
		return false; 
	}
	if(f.name.value.trim() == ""){ 
		alert("이름입력")
		f.name.focus();
		return false; 
	}
	return true;//아이디비번이름이 입력됐다면 true
}

function win_upload(){
	let op = "width=500,height=500 ,top=50 ,left=150";
	open("pictureForm.jsp","",op);
	//pictureForm.jsp를 연다
	
}
</script>
</body>
</html>

다음과같이 model1Study에서 model패키지를 가져옴

 

이렇게 나올거임


5-2)  jsp파일과 인코딩을위한filter , Membercontroller

/model2Study/src/main/webapp/view/alert.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<script>
	alert("${msg}");
	location.href = "${url}";
</script>

 

/java/filter/CharEndodingFilter.java

(인코딩을 위한 Filter)

package filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

//다음Filter로인해 우리는 인코딩을 request받을때마다 쓰지않아도됨
@WebFilter("/*")
public class CharEndodingFilter implements Filter {
	private String encoding;

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		encoding = filterConfig.getInitParameter("encoding");
		if (encoding == null) {
			encoding = "UTF-8"; // 인코딩방식이없다면 UTF-8 로설정
		}
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		request.setCharacterEncoding("UTF-8");
		chain.doFilter(request, response);
		// chain : 다음으로넘기기위한메서드
	}

	@Override
	public void destroy() {
	}

}

 

MemberController 에 내용추가(중요함)

package controller;

import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import gdu.mskim.MskimRequestMapping;
import gdu.mskim.RequestMapping;
import model.member.Member;
import model.member.MemberDto;

//http://localhost:8080/model2Study/member/joinForm로 접속해봐
@WebServlet(urlPatterns = { "/member/*" }, 
initParams = { @WebInitParam(name = "view", value = "/view/") })
//서블릿(MskimRequestMapping)에 존재하지않는다면 view폴더 하위의 member폴더 하위에서찾는다

public class MemberController extends MskimRequestMapping {
	private MemberDto dto = new MemberDto();

	/*
	 * 1.파라미터정보를 Member객체에 저장 (인코딩필요) (Filter이용) 
	 * 2.Member객체를 이용해 db에insert(member테이블저장) 
	 * 3.가입성공 : 성공메시지 출력 후 loginForm 이동 
	 * 가입실패 : 실패메시지출력 후 joinForm 이동
	 */
	
	
	@RequestMapping("join") // http://localhost:8080/model2Study/member/join 시 호출
	public String join(HttpServletRequest request, HttpServletResponse rsponse) {
		Member mem = new Member();
		mem.setId(request.getParameter("id"));
		mem.setPass(request.getParameter("pass"));
		mem.setName(request.getParameter("name"));
		mem.setGender(Integer.parseInt(request.getParameter("gender")));
		mem.setTel(request.getParameter("tel"));
		mem.setEmail(request.getParameter("email"));
		mem.setPicture(request.getParameter("picture"));
		if (dto.insert(mem)) {// 삽입
			request.setAttribute("msg", mem.getName()+"님 회원가입완료");
			request.setAttribute("url", "loginForm");
		}
		else {
			request.setAttribute("msg", mem.getName()+"님 회원가입시 오류발생");
			request.setAttribute("url", "loginForm");
		}
		return "alert"; //view하위의 alert페이지로 이동해라(alert페이지 출력과 페이지이동을 위한페이지)

	}

}