ServletContext
Session처리
JSP
(항상 써야하나요? 필요한 경우가 있음)
: 저장공간 -> Map 구조 -> key와 value 쌍으로 데이터 저장
: servlet container 안에 위치 - client thread가 호출하는 doGet(doPOST())안에서 이 객체의 reference를 얻어서 사용 가능
count는 Servlet을 stateful형태로 사용하지 않음
만약 stateful로 사용하려면 singleton 이라는게 전제가 되야함(실제 운영할 때 singleton이 아닌 경우가 생길 수 있음)
form에서 method가 post일 때만 doPost/ 나머지는 doGEt?
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>사용자 이름을 입력하세요</h1>
<!-- action은 servlet을 위한 url mapping임 -->
<form action="secondServlet" method="post">
이름을 입력하세요 : <input type="text" name="userName">
<br><br>
<button type="submit">서버로 전송</button>
</form>
</body>
</html>
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class NameServlet
*/
@WebServlet("/saveName")
public class NameServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public NameServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 한글처리
request.setCharacterEncoding("UTF-8");
// 1. 입력처리
String name = request.getParameter("userName");
// 2. 로직처리
// ServletContext를 가져와서 여기에 이름을 저장 !!
// ServletContext는 Map구조(key와 value 쌍으로 저장)
ServletContext context = this.getServletContext();
context.setAttribute("memberName", name);
// 3. 결과처리
response.setContentType("text/html; charset=UTF-8"); // 설정잡고
PrintWriter out = response.getWriter(); // 구멍 뚫음
out.println("<html><head></head>");
out.println("<body>");
out.println("<a href='secondServlet'>두번째 서블릿 호출</a>");
out.println("</body></html>");
}
}
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class SecondServlet
*/
@WebServlet("/secondServlet")
public class SecondServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public SecondServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 입력받고
// 2. 로직처리
// container가 가지고 있는 걸 가져옴.reference를 확보함
ServletContext context = this.getServletContext();
// context.getAttribute("memberName")는 최상위 오브젝트가 나옴. 나는 String이 필요햐기 때문에 앞에서 (String)으로 잡아줌 !
String name = (String)context.getAttribute("memberName");
// 3. 결과처리
response.setContentType("text/html; charset=UTF-8"); // 설정잡고
PrintWriter out = response.getWriter(); // 구멍 뚫음
out.println("<html><head></head>");
out.println("<body>");
out.println("가져온 이름은 : " + name);
out.println("</body></html>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
: 우리가 사용하는 web은 HTTP 프로토콜을 사용
: HTTP Protocol은 간단한 protocol - 동작방식도 단순
① 로그인
1. MySQL
CREATE TABLE MEMBERS (
id VARCHAR(10) NOT NULL PRIMARY KEY,
name VARCHAR(20) NOT NULL,
password VARCHAR(20) NOT NULL
);
INSERT INTO MEMBERS VALUES('hong', '홍길동', '1234');
②
③
JSP + HTML + JSP요소(Java code+특수한 표기법)가 포함된 구조
JSP file내에서 HTML내용은 out.println("~~) 이 안으로 다 들어감
JSP file내에서 scriptlet:<% 일반 JAVA code %>
: 변수 선언 for, if, while -> 제어문, 객체생성, method호출
JSP File 내에서 <%= 문자열로 가능한 값 %>
: Expression
<%@ import %>
: directive(설정)
<%@ 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>
<%
// 3. 출력은 HTML에 끼워넣기
%>
<%
// 간단한 화면 로직코드
String name = "홍길동"; // 지역변수(method안에 선언)
for(int i=0; i<5; i++) {
%>
<h1>반복!!!</h1>
<%
}
%>
<!-- 출력코드 -->
아우성..
사용자의 이름은 : <%= name %> 입니다.
</body>
</html>
: MVC pattern + JSP를 이용한 View 처리
① 일반적인 Round-Trip방식
② JQuery AJAX를 이용하여 View처리 분리
③ Vue.js 같은 Framework를 이용해 Front-End와 Back-End를 분리
session은 servlet에서 처리함 !
mybatis
-driver.~~
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/mydatabase?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
user = root
password = test1234
loginSuccess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="member.vo.Member" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- JSP에서는 나에게 할당된 session객체를 그냥 사용할 수 있음
어떤 이름을 사용해야 하나요? => session -->
<h1><%= ((Member)session.getAttribute("member")).getMemberName() %> 님 환영합니다.</h1>
</body>
</html>