toggle menu

JSP 정리 - 자바 서블릿

2012. 8. 16. 19:22 JAVA/JSP
서블릿은 보안에서 JSP보다 낫기 때문에 보안을 중시할 경우 서블릿을 활용.



public class A extends HttpServlet
{


}

다른 곳에서 접근해야 하므로 public 으로 선언
HttpSevlet을 상속받으면 웹 접근 가능. 여기에서 필요한 메서드를 재정의하여 사용한다. 



Sevlet의 라이프사이클!!!

생성자 -> init() -> service() -> doGet혹은 doPost -> destroy()

그런데 사실은 init() 다음 스레드를 생성하여 다양한 사용자들의 요청에 대응한다.



서비스는 사용자 요청이 get인지 post인지 판별해서 doGet 혹은 doPost 으로 보내게 된다.
디폴트는 get방식임!!

 

서블릿은 초기화를 init()에서 수행하게 된다.
ServletConfig값을 받아와서 처리(?)


저 라이프 사이클 중에서 재정의해서 사용하는 부분은 대부분 doGet이나 doPost이다.
그중에서도 주로 doPost를 재정의하고 doGet은 doPost를 호출하는 형태로 작성하게 된다.

그렇다면 doPost에서 무엇을 하게 되는가?
그냥 우리가 앞서 해왔던 JSP에서의 작업을 구현해주면 된다. 내용을 출력하고.. 


init 에 파라메터를 전달해주어야할 필요가 있다면, web.xml 파일에서 init 파라메터를 추가해주어야 한다.


	<servlet>
		<description></description>
		<display-name>TestSevlet</display-name>
		<servlet-name>TestSevlet</servlet-name>
		<servlet-class>ex0816.TestSevlet</servlet-class>
	</servlet>



위에는 서블릿을 등록해준 것이다. servelet-name은 그냥 이름이다. 그러나 헷갈리지 않도록 클래스 이름과 같이 한것을 볼 수 있다.
 

	<servlet-mapping>
		<servlet-name>TestSevlet</servlet-name>
		<url-pattern>/TestSevlet</url-pattern>
	</servlet-mapping>


매핑은 URL에서 TestSerlet 이라는 이름을 타이핑하면 위에 등록한 서블릿을 실행하겠다는 것이다.
만약 위에서 서블릿 이름을 aaa 로 했다면 아래 매핑의 서블릿 이름도 aaa 로 해야할 것이다.


<!--  내가 임의로 추가한 부분 ㅋㅋ -->
  
<servlet>
	<servlet-name>myLoginCheck</servlet-name>
	<servlet-class>ex0817.LoginServlet</servlet-class>
</servlet>


<!-- 여기서 이렇게 임의로 연결해주어야 한다. -->

<servlet-mapping>
	<servlet-name>myLoginCheck</servlet-name>
	<url-pattern>/loginCheck</url-pattern>
</servlet-mapping>




web.xml 파일을 수정한 것은 톰켓을 다시 실행해야지 적용된다는 걸 잊지 말자!!

이제 실제 FORM의 ACTION 에는 프로젝트명/URL패턴 이런 식으로 하게 된다.








출력스트림
클라이언트의 화면에 출력할 것이기때문에 response로 가져오게 된다.
response.getWriter() 메소드를 사용하게 되는데,
PrintWriter out = response.getWriter(); 의 형태로 선언해서 사용하게 된다.


한글을 쓰기 위해서는 
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter(); 이렇게 해야한다.

PrintWriter out = response.getWriter(); 
response.setContentType("text/html; charset=UTF-8");
이렇게 반대로 하면 한글이 절대로 나오지 않는다.. 이걸 발견하다니ㅠㅠ





세션을 가져와서 사용하는 방법
//세션에 정보 저장하기
HttpSession session = request.getSession();
session.setAttribute("id", request.getParameter("userId"));





포워드를 사용해 페이지를 이동하는 방법
//포워드를 이용해 페이지 이동
RequestDispatcher requestDispatcher = null;

requestDispatcher = request.getRequestDispatcher("jspExam/ResultCheck");
requestDispatcher = request.getRequestDispatcher("/ResultCheck");

requestDispatcher.forward(request, response);

/**
 * 위의 두 개는 동일한 곳으로 포워딩된다.
 * jspExam은 프로젝트명이다.
 * web.xml 파일에 url패턴을 등록한대로, ResultCheck라는 이름으로 접근한다.
 * 
 * /로 시작하면 앞에 프로젝트명이 생략된 형태이다.
 * /로 시작하지 않으면 프로젝트명부터 전체 경로를 써주어야한다.  
 */


 
일반적으로 doGet이나 doPost가 동일한 역할을 수행하기 때문에 둘 중 하나에서 다른 메소드를 호출해서 한 곳에서 처리하는게 일반적이다.

아래는 간단한 doGet, doPost 예제이다.
import java.io.IOException;
import java.io.PrintWriter;

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

public class testServlet extends HttpServlet
{
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException
	{
		this.doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
	throws ServletException, IOException
	{
		request.setCharacterEncoding("UTF-8"); //POST로 넘어오는 값의 인코딩을 설정
		response.setContentType("text/html; charset=UTF-8"); //출력할 페이지의 인코딩을 설정
		PrintWriter out = response.getWriter(); //출력 스트림 가져오기
		
		//여기에 관련 내용
		//서블릿 내부는 사실상 자바와 동일하다
	}
}




 

JAVA/JSP 관련 포스팅 더보기