a
태그로 페이지 이동하는 방법
form
태그로 넘기는 방법
action 속성 안에 서블릿과 매핑할 주소를 적어줌
= form 데이터를 처리할 프로그램의 URI를 지정
onsubmit 속성은 form 태그 내부에서 input type="submit" 이벤트를 처리할 수 있다.
= onsubmit 안에는 이벤트(사용자 함수)를 호출시켜 (true이거나 false가 반환되도록) 리턴한다
= action 안의 경로로 이동을 원치 않으면 onsubmit 안의 이벤트를 false로 반환!
= false로 반환되면 이벤트 처리를 강제 종료시키므로, action이 처리되는 일은 없다!
<form id="loginfrm" action="<%=request.getContextPath()%>/login.do"
method="post" onsubmit="return fn_validation()">
<!-- 아이디와 비밀번호 보안이므로 post로 보냄 -->
location
태그로 넘기는 방법
href와 assign은 동일하게 작동하지만, assign이 좀 더 느리지만, 더 안전하다
replace는 다른것들과 다르게 히스토리에 저장이 안되기 때문에 전 페이지로 갈 수 없다
<input type="button" value="회원가입"
onclick="location.assign('<%=request.getContextPath()%>/member/enrollmember.do')">
getRequestDispatcher
메소드의 forward
메소드 사용하기
request.getRequestDispatcher("/views/member/enrollmember.jsp")
.forward(request, response);
sendRedirect
response.sendRedirect("join.jsp");
open
메소드 사용하기
open("<%=request.getContextPath()%>/member/idDuplicate.do?userId="+userId,
"_blank","width=300 height=200");
// 첫번째 인수 -> url + 뒤에는 쿼리스트링으로 url 주소에 데이터를 파라미터를 통해 넘겼음(userId)
// 쿼리스트링은 ? 부터 시작임
// 두번째 인수 -> _blank : 새 창으로 연다. (기본값)
// 세번째 인수 -> 새로 열리는 창의 속성을 정해줌
getParameter
메소드 : String 타입 리턴
<form id="loginfrm" action="<%=request.getContextPath()%>/login.do"
method="post" onsubmit="return fn_validation()">
<h2>로그인</h2>
<ul>
<li><input type="text" name="userId" placeholder="아이디" title="아이디입력"></li>
<li><input type="password" name="password" placeholder="비밀번호" title="비밀번호입력"></li>
<li><input type="checkbox" id="saveId" <%=saveId!=null?"checked":""%>>
<label for="saveId">아이디 저장</label></li>
<!-- <li><input type="submit" value="로그인"></li> -->
<li><button>로그인</button></li>
</ul>
</form>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userId = request.getParameter("userId");
String password = request.getParameter("password");
System.out.println(userId);
System.out.println(password);
}
getParameterValues
메소드 : String 배열 타입 리턴
getAttribute
메소드 : Object 타입 리턴
Member m = (Member)request.getAttribute("result");
위 두가지 차이점!
-> getParameter()은 값이 입력되지 않으면 공백으로 들어오지만
-> getAttribute()는 값이 입력되지 않으면 null 값으로 들어옴
class
id
name
-> 3개 모두 선택자 로 사용 가능name
을 form으로 전송될 때 넘겨지는 페이지에서 값을 받을 때 해당 name
으로 받음id
는 주로 유일한 것 을 구분할 때 주로 사용class
는 주로 중복된 것 을 선택할 때 사용button
reset
submit
: 버튼의 이름(텍스트)를 정의함hidden
password
text
: 입력 필드의 초깃값을 정의함checkbox
image
radio
: 해당 입력 필드를 선택 시 서버로 제출되는 값을 정의함.<input type="text" name="textvalue" id="textvalue_" value="라디오밸류"> <input type="button" name="buttonvalue" id="buttonvalue_" value="버튼밸류"> <input type="radio" name="radiovalue" id="radiovalue_" value="라디오밸류">
<input type="checkbox" name="hobby" id="hobby0" value="운동"><label for="hobby0">운동</label>
<!-- input 태그 안의 id값과 label 태그 for 속성의 값을 동일하게 설정 -->
readonly
: value 의 값이 전송됨disabled
: value 의 값이 전송되지 않음
GET 방식
-> 헤드에 파라미터가 포함되어있음 (헤드 부분이 웹 경로에 노출됨)
-> 헤드길이는 제한적임 = 파라미터 크기에도 제한 있음POST
방식 -> 바디에 파라미터가 포함되어있음 (바디 부분은 웹 경로에 노출 X)
http://localhost:8090/Ch03/loginServlet?userId=a&userPwd=b
// 키 -> userId 와 userPwd
// 값 -> a 와 b
String userId반환값 = request.getParameter("userId"); // getParameter로 받음 (키 값)
String userPwd반환값 = request.getParameter("userPwd");
<button type="button">닫기</button>
<script>
const btn=document.querySelector("button[type=button]");
btn.addEventListener("click",e=>{ // 닫기버튼 클릭했을 때
opener.document.querySelector("#userId_"). // 부모창의 아이디 입력부분에 파라미터로 받은 userId값을 넣어줌
value="<%=request.getParameter("userId")%>";
close(); // 그리고 현재창(자식창) 닫아줌
});
</script>
예) http://localhost:8080/project/list.jsp
request.getContextPath()
: 프로젝트 Path만 가져옴
return -> /project
request.getRequestURI()
: 프로젝트 + 파일경로까지 가져옴
return -> /project/list.jsp
request.getRequestURL()
: 전체 경로를 가져옴
return -> http://localhost:8080/project/list.jsp
request.ServletPath()
: 파일명만 가져옴
return -> /list.jsp
request.getRealPath()
: 서버 or 로컬 웹 애플리케이션 절대경로 가져옴 (webapp)까지!
return -> c:\project\webapps\project\
<tr>
<th>패스워드</th>
<td>
<input type="password" name="password" id="password_" ><br>
</td>
</tr>
<tr>
<th>패스워드확인</th>
<td>
<input type="password" id="password_2" ><br>
</td>
</tr>
<tr>
<th></th>
<td>
</td>
</tr>
$("#password_2").keyup(e=>{ // 해당 선택자에 키 올렸을 대
const password=$("#password_").val();
const passwordCheck=$(e.target).val(); // e.target = #password_2
let color,msg;
if(password==passwordCheck){
color="green"; msg="비밀번호가 일치합니다.";
//$("<p>").css("color","green").text("비밀번호가 일치합니다.");
}else{
color="red"; msg="비밀번호가 일치하지 않습니다.";
//$("<p>").css("color","red").text("비밀번호가 일치하지않습니다.");
}
const td = $(e.target).parents("tr").next().find("td");
td.html("");
$("<p>").css("color",color).text(msg).appendTo(td);
// p 태그 만들어서 해당 색상과 문구넣음
});
사용하는 이유
: 사용자에게 굳이 보여줄 필요는 없지만 필요한 데이터이기 때문에 숨겨놓고 파라미터로 찾을 수 있게 하려고
https://mvnrepository.com/
-> 라이브러리들 다운받을 수 있는 사이트
ojdbc.jar
: 자바와 데이터베이스를 연결하기 위해서 사용하는 라이브러리lombok.jar
: 클래스를 만들때 자동으로 set,get,hash,equals 메소드 등 여러가지를 직접 만들어줌cos.jar
: 웹페이지에서 파일 업로드를 도와주는 라이브러리@WebFilter(urlPatterns = {"/admin/*","/notice/insertForm.do"})
// urlPatterns 는 한개만 적용할때는 생략해도됨
@webFilter("/admin/*")
BoardComment bc =BoardComment.builder()
.boardRef(Integer.parseInt(request.getParameter("boardRef")))
.level(Integer.parseInt(request.getParameter("level")))
.boardCommentWriter(request.getParameter("boardCommentWriter"))
.boardCommentContent(request.getParameter("content"))
.boardCommentRef(Integer.parseInt(request.getParameter("boardCommentRef")))
.build();