BackEnd
5/21 - 서블릿 응답 처리 방법
Jiwon_Loopy
2025. 6. 1. 16:18
반응형
목차
전송 방식
- get
- URL주소에 데이터를 붙여서 전송하는 방식
package pro05.ex01;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
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 LoginServlet
*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("init 메서드 호출");
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
System.out.println("destroy 메서드 호출");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
System.out.println("아이디 :" + user_id);
System.out.println("비밀번호 :" + user_pw);
String[] subject = request.getParameterValues("subject");
for(String str : subject) {
System.out.println("선택한 과목:" + str );
}
PrintWriter pw = response.getWriter();
String data = "<html><body>아이디:" + user_id+"<br>패스워드:"+user_pw + "</body></html>";
pw.print(data);
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form name ="formLogin" method="get" action="login">
아이디 : <input type="text" name="user_id"><br>
비밀번호 : <input type="password" name="user_pw"><br>
<input type="submit" value="로그인"><input type="reset" value="다시입력">
<input type="checkbox" name="subject" value="자바" checked>자바
<input type="checkbox" name="subject" value="언어" >C언어
<input type="checkbox" name="subject" value="JSP" >JSP
<input type="checkbox" name="subject" value="안드로이드" >안드로이드
</form>
</body>
</html>
- post
- 전송하는 데이터를 숨겨서 전송하는 방식
package pro05.ex01;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
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 LoginServlet
*/
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("init 메서드 호출");
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
System.out.println("destroy 메서드 호출");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
System.out.println("아이디 :" + user_id);
System.out.println("비밀번호 :" + user_pw);
String[] subject = request.getParameterValues("subject");
for(String str : subject) {
System.out.println("선택한 과목:" + str );
}
PrintWriter pw = response.getWriter();
String data = "<html><body>아이디:" + user_id+"<br>패스워드:"+user_pw + "</body></html>";
pw.print(data);
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form name ="formLogin" method="post" action="login">
아이디 : <input type="text" name="user_id"><br>
비밀번호 : <input type="password" name="user_pw"><br>
<input type="submit" value="로그인"><input type="reset" value="다시입력">
<input type="checkbox" name="subject" value="자바" checked>자바
<input type="checkbox" name="subject" value="언어" >C언어
<input type="checkbox" name="subject" value="JSP" >JSP
<input type="checkbox" name="subject" value="안드로이드" >안드로이드
</form>
</body>
</html>
DB연결
- 오라클 database 연결
메모
- 각 코드별 에러
- 400
- 클라이언트오류
- 405는 주로 get, post 요청이 다를 경우 발생
- 400
- 프론트 절대 경로
- 컨텍스트패스부터
- 백엔드 절대 경로
- 컨텍스트 패스 빼고
- 쉽게 라이브러리 jar 파일 넣기
- D:\java\workspace\pro05\src\main\webapp\WEB-INF\lib 경로에 붙여넣기
- DB와 객체를 연결하는 DAO (싱글턴)
package sec01.ex01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class MemberDAO {
private Statement stmt;
private Connection conn;
public List<MemberVO> listMembers() {
List<MemberVO> list = new ArrayList<>();
try {
conDB();
String query = "select * from t_member";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String id = rs.getString("id");
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String email = rs.getString("email");
Date joinDate = rs.getDate("joinDate");
MemberVO vo = new MemberVO();
vo.setId(id);
vo.setPwd(pwd);
vo.setName(name);
vo.setEmail(email);
vo.setJoinDate(joinDate);
list.add(vo);
}
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
private void conDB() {
try {
Class.forName("oracle.jdbc.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/xe", "testuser", "test1234");
stmt = conn.createStatement();
}catch (Exception e) {
// TODO: handle exception
}
}
}
- Servlet에 띄울 객체를 담는 VO
package sec01.ex01;
import java.util.Date;
import lombok.Data;
@Data
public class MemberVO {
private String id;
private String pwd;
private String name;
private String email;
private Date joinDate;
}
- 연결
package sec01.ex01;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.List;
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("/member")
public class MemberServlet extends HttpServlet{
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
MemberDAO dao = new MemberDAO();
List<MemberVO> list = dao.listMembers();
pw.print("<html><body>");
pw.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
pw.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td></tr>");
for(int i = 0; i < list.size(); i++) {
MemberVO memberVO = list.get(i);
String id = memberVO.getId();
String pwd = memberVO.getPwd();
String name = memberVO.getName();
String email = memberVO.getEmail();
Date joinDate = memberVO.getJoinDate();
pw.print("<tr><td>" + id + "</td><td>" + pwd + "</td><td>" + name + "</td><td>" + email + "</td><td>" + joinDate + "</td></tr>");
}
pw.print("</table></body></html>");
}
}
- 원격 연결 (코드 X, XML 방식)
- servers → context
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --><!-- The contents of this file will be loaded for each web application --><Context> <!-- Default set of monitored resources. If one of these changes, the --> <!-- web application will be reloaded. --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource> <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <Resource name="jdbc/oracle" auth="Container" type="javax.sql.DataSource" driverClassName="Oracle.jdbc.OracleDriver" url="jdbc:oracle:thin@localhost:1521:XE" username="testuser" password="test1234" maxActive="50"/> </Context>
- MemberDao2
package member; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; public class MemberDAO2 { private PreparedStatement pstmt; private Statement stmt; private Connection con; // private String driver = "oracle.jdbc.OracleDriver"; // private String url = "jdbc:oracle:thin:@localhost:1521/xe"; // private String user = "testuser"; // private String pwd = "test1234"; private DataSource dataFactory; public MemberDAO2() { try { Context ctx = new InitialContext(); Context envContext = (Context)ctx.lookup("java:/comp/env"); dataFactory = (DataSource)envContext.lookup("jdbc/oracle"); } catch (Exception e) { e.printStackTrace(); } } public List<MemberVO> listMembers() { List<MemberVO> list = new ArrayList<>(); try { // connDB(); // 커넥션풀에서 객체 가져오기 con = dataFactory.getConnection(); String query = "SELECT * FROM t_member"; // ResultSet rs = stmt.executeQuery(query); pstmt = con.prepareStatement(query); // 1,2,3.... set ResultSet rs = pstmt.executeQuery(); while (rs.next()) { MemberVO vo = new MemberVO(); vo.setId(rs.getString("id")); vo.setPwd(rs.getString("pwd")); vo.setName(rs.getString("name")); vo.setEmail(rs.getString("email")); vo.setJoindate(rs.getDate("joindate")); list.add(vo); } rs.close(); pstmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } return list; } // DB 연결 // private void connDB() { // try { // Class.forName(driver); // con = DriverManager.getConnection(url, user, pwd); // stmt = con.createStatement(); // } catch (Exception e) { // e.printStackTrace(); // } // } }
- DataSource 이용하여 회원정보 등록
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<script>
function fn_sendMember() {
var frmMember = document.frmMember;
var id = frmMember.id.value;
var pwd = frmMember.pwd.value;
var name = frmMember.name.value;
var email = frmMember.email.value;
if (id.length == 0 || id == '') {
alert('아이디는 필수입니다.');
} else if (pwd == '') {
alert('비밀번호는 필수입니다.')
} else if (name == '') {
alert('이름은 필수입니다.')
} else if (email == '') {
alert('이메일은 필수입니다.')
} else {
frmMember.method = 'post';
frmMember.action = 'member3'
frmMember.submit();
}
}
</script>
<body>
<form name="frmMember">
<table>
<th>회원가입창</th>
<tr>
<td>아이디</td>
<td><input type="text" name="id"></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="password" name="pwd"></td>
</tr>
<tr>
<td>이름</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td>이메일</td>
<td><input type="text" name="email"></td>
</tr>
</table>
<input type="button" value="가입하기" onClick="fn_sendMember()"/>
<input type="reset" value="다시입력"/>
<input type="hidden" value="command" value="addMember" />
</form>
</body>
</html>
서블릿 포워드
- 포워드
- 하나의 서블릿에서 다른 서블릿이나 JSP와 연동하는 방법
- 요청에 대한 추가 작업을 다른 서블릿이 하도록 함
- 요청에 포함된 정보를 다른 서블릿이나 JSP와 공유 가능
- 요청에 정보를 포함시켜 다른 서블릿에 전달
- 모델2 개발 시 서블릿에서 JSP로 데이터 전달하는데 사용
- 웹 브라우저에 재 요청
- redirect
- HttpServletResponse 객체의 sendRedirect() 이용
- refresh
- HttpServletResponse 객체의 addHeader() 이용
- location
- 자바스크립트 location 객체의 href 이용
- redirect
- 클라이언트를 거치지 않고 재 요청
- dispatch
- RequestDispatcher 클래스의 forward() 메서드 이용
- 서블릿의 포워드가 서버에서 수행되었으므로, 웹 브라우저 주소창의 URL은 변하지 않음
- 하나의 요청임
- dispatch
- 요청이 다르면 다른 리퀘스트 객체
MVC
- 모델
- 데이터
- 뷰
- UI
- 컨트롤러
- 비즈니스 로직
저장소
- 사용 빈도
- Page < Request < Session < application
- 페이지 < 요청 < 브라우저 < 프로젝트
바인딩
- GET방식으로 데이터를 전달할 때 대량의 값은 불편을 초래
- 바인딩을 이용
- 객체에 바인딩 된 자원을 가져옴
- 관련 메서드
- setAttribute
- getAttribute
- removeAttribute
- Redirect방식의 경우 2번 요청 하므로, request와 response객체가 다르므로, null이 출력
- HttpSession에 request.getSession으로 가져와 저장
- session에 set을 하고, 후에 get으로 꺼내 전송하면 됨
- dispatch 방식을 사용하면 1번 요청이므로, 올바른 값이 출력
세션과 쿠키
- 세션
- 세션은 브라우저를 끄면 날아감
- 브라우저를 유지한 상태에서 새 창으로 열어도 정보가 남아있음 ( ex) 로그인 정보 유지 )
- 서버의 메모리에 저장
- 쿠키
- 브라우저를 꺼도 남아 있다면 쿠키 ( ex) 이전에 로그인했던 기록이 있다면 자동 로그인 )
- 내 PC에 저장
- 페이지 이동
- 2번
- 값을 전달하기 위해 쿼리 스트링
- B?a=1&b=1 …
- response.sendRedirect (경로)
- response.addHeader(”Refresh”, “초;url=경로”)
- html(jsp)애서 meta
- javascript로 location.href=”경로”
- 값을 전달하기 위해 쿼리 스트링
- 1번
- requestDispatcher (포워딩)
- 1번의 요청 (주소창은 A, 화면은 B)
- requestDispatcher (포워딩)
- 2번
- 저장소
- 위의 1번 방법이 직접적으로 값을 전달할 수 없음
- 해결 방법으로 저장소 사용
- 종류
- page
- request
- 하나의 같은 요청
- session
- 하나의 프로그램 브라우저
- application
- 어플리케이션 전체
- 범위
- page < request < session < application
728x90
반응형