jsp를 공부하면서 처음 어려웠던 부분이 서블릿이였는데, 저 나름대로 공부하며 정리했던 내용인데 올려봅니다 !

💎Servlet
🔹웹클라이언트의 요청을 처리할 수 있는 클래스
🔹Servlet이 되기 위해서는 Httpservlet을 상속받아야 한다.
🔹a.jsp —> a_jsp.java( _jspService() )를 만드는 것을 서블릿(이건 톰캣이 함)
💎생성하기
🧙🏻♂️
1. HttpServlet 상속받는 서블릿 클래스 생성 : 패키지와 클래스명을 입력한 뒤 생성
src -> New -> Servlet
2. web.xml 작성
<servlet>
<servlet-name>Test1</servlet-name>
<servlet-class>a.b.Test1</servlet-class>
<load-on-startup>1</load-on-startup>
<servlet-mapping>
<servlet-name>Test1</servlet-name>
<url-pattern>/Test1</url-pattern>
3. 서블릿 클래스의 doGet() 내용 작성
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out=response.getWriter();
out.write("abc");
}
4. 실행하기
http://localhost:8282/프로젝트명/Test1
💎생성하기
🧙🏻♀️ 생성 조건 ?
1️⃣HttpServlet 상속받아야 함 (부모여야 함, super class)
2️⃣web.xml 문서에 태그, 자동으로 생성됨 *이것들의 servlet-name 이름이 동일하면 한 쌍
3️⃣실행하기 ? http://localhost:8282/Servlet1/Test1 *url-pattern을 프로젝트 이름(Servlet1) 뒤에 적음
🔹톰캣 엔진은 해당 클래스를 여기서 찾음
⇒ c:/tomcat/webapps/Servlet1/WEB-INF/classes/a.b.Test1
🔹http://localhost:8282/Servlet1/Test1
⇒ a.b.Test1의 doGet()을 자동으로 찾음 / url에 직접 요청하면 get~
🔸a.jsp
<form action="/Servlet1/Test1" method="post">
<input type="hidden" name="a" value="b" />
<input type="submit" />
</form>
⇒ doPost()는 form태그 action에 Servlet1/Test1적고 method="post"적으면 찾음
🔹doGet과 doPost의 차이점
- form태그의 method는 기본값이 get
url에 직접 적어 요청하는 방식
파라미터 넘어간 것 보인다
데이터 많이 보낼 수 없다
보안상 취약하다 - post는 파라미터 넘어간 것 보이지 않는다
많은 양의 데이터 보낼 수 있다
파일 전송에 적합한 방식
🔹Test1 o=new Test(); 톰캣이 자동으로 서블릿 객체를 만듦
서블릿 객체 생성되는 시점 ? 최초의 서블릿 요청이 들어왔을 때 !
서블릿 객체는 1번만 메모리에 올라감(생성됨)
🔹서블릿의 라이프사이클
- init() : 최초로 딱 1번 호출, 서블릿 객체가 만들어질 때
- 서블릿 객체를 최초로 생성한 뒤, 어떤 작업을 하고 싶다면 ?
init() 오버라이딩해서 작업내용 작성하기 ! - destroy() : 서블릿이 메모리에서 사라질 때 호출됨, 서블릿 객체를 메모리에서 없앨 때(어떤 작업을 해야 할 때) 이것을 호출, 서블릿 객체는 톰캣을 꺼야 그 객체가 메모리에서 사라짐.
🔹서블릿 객체를 미리(톰캣 가동될 때) 생성해둘 수 있는 방법?
- 음수
⇒ load-on-startup의 기본값은 음수
⇒ init()가 사용자 요청이 왔을 때 호출. 서블릿 객체가 사용자의 요청이 왔을 때 생성. - 양수
⇒ 이 객체를 톰캣 가동될 때 생성.
⇒ 톰캣을 켰을 때 init()가 호출. 서블릿 객체가 톰캣 켰을 때 생성.
🔹init()에서 시간이 많이 걸리는 일을 할 수 있음. ex)하드디스크에서 파일 읽는 것 등
🔹out.write("abc");
⇒ jsp내장 객체이기 때문에 이렇게만 쓸 수 없다.
response객체도 jsp내장 객체이지만, doGet으로 넘어와서 사용 가능
⇒ PrintWriter out=response.getWriter();
out.write("abc");
이렇게 하면 클라이언트에 응답할 수 있다 !
🔹a.jsp / b.js / c.css / d.html / e.png / a.b.ABC(서블릿) ⇒ 파일의 위치를 알아야 함
webapps/프로젝트명/WEB-INF/classes/a.b.ABC, a.b.dto.Member
webapps/프로젝트명/WEB-INF/lib/xxx.jar
webapps/프로젝트명/xxx.jsp
webapps/프로젝트명/xxx.js
webapps/프로젝트명/xxx.css
webapps/프로젝트명/xxx.png
🔹서블릿을 수정하면 톰캣도 재가동해야 함. 프로젝트를 리스타트해야 함.
⇒ 프로젝트가 많으면 속도 느림 ⇒ 톰캣 매니저에서 특정 프로젝트만 다시 로드 가능 !
#a.jsp
<form action="/Servlet1/Test1" method="post">
<input type="hidden" name="a" value="b" />
<input type="submit" />
</form>
#Test1.java
doPost
PrintWriter out=reponse.getWriter();
out.write("def"); //localhost:8282/Servlet1/a.jsp로 가서 제출누르면 def나옴
out.write(request.getParameter("a")); //새로고침하고 제출누르면 defb나옴
#Test2.java
response.setContentType("text/html; charset=UTF-8");
PrintWriter out=reponse.getWriter();
out.write("홍길동");
//이것만 적으면 한글깨짐
//http프로토콜 방식으로 한글을 보내면 언급을 해야함, 응답할 때 한글처리를 해야함
🔹context-param은 모든 서블릿에서 공용으로 사용하는 파라메터
🔹application은 jsp내장 객체이기 때문에 얻어오려면..?
- this는 HttpServlet 상속받은 객체, 즉 this. 하면 HttpServlet 객체의 메서드 다 나옴
- application의 클래스명은 ServletContext⭐
- application은 jsp내장 객체 이름이지만, 실제 application은 참조형 변수 이름, 이것의 자료형은 ServletContext
#web.xml에 이렇게 적으면
<context-param>
<param-name>aa</param-name>
<param-value>bb</param-value>
</context-param>
#Test1, Test2의 doGet에 이렇게 적어주면 둘 다 사용 가능 !
doGet
ServletContext application=this.getServletContext();
PrintWriter out=response.getWriter();
out.write(application.getInitParameter("aa")); //web.xml의 param-name의 값 얻는 방법
//Test1, Test2 둘 다 bb 출력
🔹서블릿 태그에 init-param을 주면, 이 값은 이 서블릿 전용
- 다른 서블릿에서는 null값
- config는 jsp내장 객체, 이것의 풀네임은 ServletConfig
#web.xml
<init-param>
<param-name>cc</param-name>
<param-value>dd</param-value>
</init-param>
#Test1, Test2
doGet
ServletContext application=this.getServletContext();
PrintWriter out=response.getWriter();
out.write(application.getInitParameter("aa"));
ServletConfig config=this.getServletConfig();
String s=config.getInitParameter("cc");
out.print(s);
//Test1은 bbdd
//Test2는 bbnull
💫init-param, context-param의 값 얻어오는 법
- —> ServletConfig config=this.getServletConfig();
- —> ServletContext application=this.getServletContext();
<init-param> —> javax.servlet.ServletConfig config
<param-name>aa
<context-param> —> javax.servlet.ServletContext application
<param-name>bb
/* <init-param>
-> 접근하려면 javax.servlet.ServletConfig라는 객체로 얻을 수 있다
이름은 내장객체와 동일하게 config
<context-param>
-> 접근하려면 javax.servlet.ServletContext라는 객체로 얻을 수 있다
이름은 내장객체와 동일하게 application */
ServletConfig config=this.getServletConfig();
ServletContext application=this.getServletContext();
String str1=config.getInitParameter("aa");
String str2=config.getInitParameter("bb");
/* 서블릿에서 내장객체 얻는 법 ?
Httpservlet은 메서드를 가지고 있다 : config와 application 주소를 얻어온다
param-name이 둘 다 있으면 이름을 주면 value값을 얻을 수 있다, 리턴타입은 String형
*/
/* init-param과 context-param의 차이 ?
init-param은 servlet태그 안에 있음 : 서블릿마다 얻고 싶으면 servlet태그 안에 세팅
context-param은 servlet태그 안에 있지X : 모든 서블릿에서 사용하고 싶으면 context-param에 세팅
*/
💫 즉, init-param은 ServletConfig / context-param은 ServletContext로 얻는다.
- config와 application은 jsp내장 객체 이름이다.
- 서블릿에서는 이 2개를 this.으로 얻어온다.(이미 메모리에 있기 때문에)
- 파라미터 이름을 줘서 값을 얻어온다 !
- init메서드(초기화하다)는 최초로 딱 1번 호출, 서블릿 객체 만들어질 때 !
- super.init(config); 호출하지 않으면 ServletConfig config=this.getServletConfig 했을 때 config가 null
- init메서드에서 시간 많이 걸리는 일들 할 수 있음. ex) HDD에서 파일 읽어 메모리에 올리는 작업
- init-param, context-param의 값 얻어오는 법
—> ServletConfig config
—> ServletContext application - 서블릿은 리로드 해야 함. 클래스 파일이 배포되고 톰캣 엔진이 파일을 읽기 위해서 !
- init메서드 호출되고 나서 사용자가 호출하면 doGet 호출됨
💫경로 얻어오는 법
#web.xml
Test1 밑에
<init-param>
<param-name>abc</param-name>
<param-value>def</param-value>
</init-param>
Test3 밑에
<context-param>
<param-name>AAA</param-name>
<param-value>BBB</param-value>
</context-param>
#Test1.java
public void init(ServletConfig config) throws ServletException{
super.init(config);
String s1=config.getInitParameter("abc");
ServletContext application=this.getServletContext();
String s2=application.getInitParmeter("AAA");
System.out.println(s1);
System.out.println(s2);
}/*매니저가서 리로드 !
def
BBB 콘솔창 출력*/
💎Servlet 화면 이동(서블릿 화면 이동)
🧙🏻♂️ *doGet
RequestDispatcher rd=request.getRequestDispatcher("b.jsp");
rd.forward(request, response);
*doPost
response.sendRedirect("c.jsp");
* http://localhost:8282/Servlet1/Test3?a=100
* a는 100 b는 200
#a.jsp
<form action="/Servlet1/Test3" method="post">
<input type="hidden" name="a" value="b" />
<input type="submit" />
</form>
#b.jsp
<%=request.getParameter("a") %><br/>
<%=request.getAttribute("b") %><br/>
#Test3.java
doGet
request.setAttribute("b", 200);
RequestDispatcher rd=request.getRequestDispatcher("b.jsp");
rd.forward(request, response);
//getRequestDispatcher의 반환형 RequestDispatcher
//forward()가 있음
//이게 jsp forward임
//request는 다음페이지까지 전달
doPost
response.sendRedirect("c.jsp");
💫서블릿 화면 이동은 2가지 방법이 있다
1. <% response.sendRedirect(”url”); %>
2. <jsp:forward page=”url” />
- MVC패턴에서 Servlet은 프런트 역할 ! 모든 요청은 doGet으로 옴!
- Servlet에서 Servlet으로 화면 이동X / 보통 Servlet에서 JSP로 화면이동
http://localhost:8282/SERVLET/Test1?abc=100
=>http://localhost:8282/SERVLET/test.jsp?abc=100
=>url이 변경! / 환영합니다.100 출력
#Test1.java
doGet
String str=request.getParameter("abc");
//화면바뀌기 전에 파라미터 받기
response.sendRedirect("test1.jsp?abc="+str);
//다음 화면까지 전달된다
//Servlet은 리로드
#test1.jsp
환영합니다. <%=request.getParameter("abc"); %>
//jsp는 리로드X
객체를 다음페이지까지 전달하려면? 메모리에 계속 저장해야함.
http://localhost:8282/SERVLET/Test1?abc=100
=>url변경되지않음 / 화면바뀌고 / 환영합니다.100 출력
#Test1.java
doGet
RequestDispatcher rd=request.getRequestDispatcher("test1.jsp");
rd.forward(request,response)
//forward 매개변수로 request,response 날라감
//test1.jsp request,response객체를 전달, 다음 페이지에 이 주소값을 전달
//url바뀌지않음, test1.jsp가 응답함
#test1.jsp
환영합니다. <%=request.getParameter("abc"); %>
회원 1명 정보를 다음페이지에서 얻으려면?
http://localhost:8282/SERVLET/Test1
=>aa
#Test1.java
doGet
MemberBean bean=new MemberBean();
bean.setId("aa");
bean.setPw("bb");
bean.setAddr("cc");
bean.setTel("dd");
request.setAttribute("member",bean);
RequestDispatcher rd=request.getRequestDispatcher("test1.jsp");
rd.forward(request,response)
#test1.jsp
<%
MemberBean bean=(MemberBean)request.getAttribute("member");
//리턴타입이 object이기 때문에 형변환
out.print(bean.getId());
%>
'JSP' 카테고리의 다른 글
[JSP]Client에서 JSON형태의 Parameter보내기 (0) | 2022.07.07 |
---|---|
[JSP]HttpServletRequest (0) | 2022.06.24 |
[JSP]MVC Pattern : 톰캣 켰을 때 초기화 하는 작업, 사용자가 요청했을 때 일어나는 과정 (0) | 2022.06.20 |
[JSP]MVC Pattern 정리(2) (0) | 2022.06.16 |
[JSP]MVC Pattern 정리(1) (0) | 2022.06.16 |