JSP
12.05.(월) JSP(15): Servlet(2)
콜라든포비
2022. 12. 6. 00:28

Servlet
IndexServlet.java에 로그인 정보에 따라서 로그인 버튼을 표시할지, 회원정보와 함께 로그아웃 버튼을 표시할지 코드를 짜보자.
LoginServlet.java에서 로그인을 성공하면 세션에 아이디와 이름을 기록했다.
세션을 요청해서 이름에 대한 정보가 담겨있으면 로그인이 성공했다는 뜻이므로 회원 이름과 로그아웃 버튼을 표시하면 된다.
package kr.co.campus;
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;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class IndexServlet
*/
@WebServlet("/IndexServlet")
public class IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public IndexServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
// doGet(), doPost()가 실행되기 전 초기화하는 메소드
public void init(ServletConfig config) throws ServletException {
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
// 클라이언트 요청 시 get방식으로 접속하면 실행되는 메소드
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// response.getWriter().append("Served at: ").append(request.getContextPath());
System.out.println("doGet()메소드 실행");
// 클라이언트 측에서 보내온 데이터 서버로 가져오기
// int num = Integer.parseInt(request.getParameter("num"));
// String name = request.getParameter("name");
// System.out.println("번호: " + num);
// System.out.println("이름: " + name);
// 클라이언트에게 문자열(html)을 response로 쓰기
// 웹 브라우저가 받아서 표시
// 1. response객체에 헤더 설정
response.setContentType("text/html; charset=UTF-8");
// 2. response객체에서 PrintWriter객체 구하기
PrintWriter pw = response.getWriter();
pw.println("<!DOCTYPE html>");
pw.println("<html>");
pw.println("<head>");
pw.println("<title>서블릿 홈페이지</title>");
pw.println("<style>");
pw.println("h1{background-color:yellow;}");
pw.println("</style>");
pw.println("</head>");
pw.println("<body>");
pw.println("<h1 class='b'>Servlet Homepage</h1>");
// Session에서 로그인 정보 확인하고 버튼 표시
HttpSession session = request.getSession();
String logName = (String)session.getAttribute("logName");
if(logName==null || logName.equals("")) { // 로그인이 안 되어있을 때
pw.println("<a href='"+request.getContextPath()+"/login.do'>로그인</a><br>");
}else { // 로그인이 되어있을 때
pw.println(logName + "님 <a href='"+request.getContextPath()+"/logout.do'>로그아웃</a><br>");
}
// pw.println("번호: "+num+"<br>");
// pw.println("이름: "+name+"<br>");
pw.println("</body>");
pw.println("</html>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
// 클라이언트 요청 시 post방식으로 접속하면 실행되는 메소드
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// doGet(request, response);
}
}
이렇게 로그인과 로그아웃을 하는 형태의 페이지를 만들었다.
InitServlet.java를 만들고, init.do와 함께 파라미터를 넘겨주는 방법을 알아보자.
파라미터는 url매핑을 할때 <init-param>태그로 넘겨줄 수 있다.
<servlet>
<servlet-name>init</servlet-name>
<servlet-class>kr.co.campus.InitServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>Sangmin Kim</param-value>
</init-param>
<init-param>
<param-name>addr</param-name>
<param-value>서울시 강남구</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>init</servlet-name>
<url-pattern>/init.do</url-pattern>
</servlet-mapping>
이렇게 매핑을 해주면,
/init.do?name=Sangmin+Kim&addr=서울시+강남구
위 주소와 같은 의미를 가진다고 보면 된다.
그럼 InitServlet.java에선 어떻게 받아줘야할까?
package kr.co.campus;
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 InitServlet
*/
@WebServlet("/InitServlet")
public class InitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public InitServlet() {
super();
}
/**
* @see Servlet#init(ServletConfig)
*/
String name;
String addr;
// 클라이언트의 요청 시 doGet(), doPost()메소드 실행 이전에 자동실행됨
public void init(ServletConfig config) throws ServletException {
name = config.getInitParameter("name");
addr = config.getInitParameter("addr");
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// web.xml의 <init-param>태그에 있는 데이터를 서블릿으로 가져오기
// getInitParameter()를 이용한다
// String name = getInitParameter("name");
// String addr = getInitParameter("addr");
res.setContentType("text/html; charset=UTF-8");
PrintWriter pw = res.getWriter();
String html = "<!DOCTYPE html>"
+ "<html>"
+ "<head>"
+ "<title>Init Parameter</title>"
+ "<body>";
html += "<h1>Init Test</h1>"
+ "<ol>"
+ "<li>Name : "+name+"</li>"
+ "<li>Address : "+addr+"</li>"
+ "</ol>"
+ "</body>"
+ "</html>";
pw.println(html);
}
}
가장 먼저 실행되는 init()에서 파라미터를 받아주고, 미리 선언해둔 문자열에 담아준 후, doGet()에서 사용하면 된다.