웹 어플리케이션은 톰켓과 같은 웹 컨테이너에서 실행되는구조이다.
1. %CATALINA_HOME%webApp에 어플리케이션 저장
2. server.xml에 직접 웹 어플리케이션 등록
%CATALINA_HOME%webApp에 어플리케이션 저장
-> 위치에 웹어플리케이션을 위치시킨후 tomcat을 껏다가 실행하면 톰켓이 자동으로
웹 어플리케이션을 인식한후 실행하는 방법
server.xml에 등록하는 웹 어플리케이션을 컨택스트라고 부른다
<Context path="/webMal"
docBase="C:\webShop"
reloadable="true" />
예를 들어 이런식으로 server.xml에 Host태그안에 적어준다
path: url에 사용할 컨택스트 이름
docBase : 컨택스트에 대한 십제 웹 어플리케이션이 위치한 경로
클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바클래스
자바 서블릿은 일반 자바프로그램과는 다르게 독자적으로 실행되지못하고 톰캣과 같은
JSP/Serlvet 컨테이너에서 사용된다는 차이점이 있다.
init, destory 함수는 필요하지 않으면 쓰지않아도 되는 반면, do로 시작하는 메서드는
서블릿의 핵심 기능을 처리하므로 반드시 구현해야한다.
FristServlet.java
@Override
//초기화 작업 주로 수행
public void init() throws ServletException {
System.out.println("init 메소드 호출");
}
@Override
//클라이언트가 요청하는 작업 수행
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doGet 메소드 호출");
}
@Override
//기능수행및 메모리에서 소멸될때 호출
public void destroy(){
System.out.println("destroy 메소드 호출");
}
web.xml
<servlet>, <servlet-mapping>
패키지명과 프로젝트 명을 그대로 url로 나타나게 되면 보안상의 이유등으로
좋지 않은 결과를 얻게될수있다. 그래서 web.xml로 servlet을 매핑시켜주어서
URL에 나타나게 하는 방법을 사용하는것을 web.xml에 적어준다
두개의 태그를 이용하여서 서로 연결시켜주어주며,
url-pattern이 url에서 호출될때의 이름을 mapping하는것을 의미한다.
<servlet>
<servlet-name>aaa</servlet-name>
<servlet-class>sec01.ex01.FirstServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>bbb</servlet-name>
<servlet-class>sec01.ex01.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>aaa</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>bbb</servlet-name>
<url-pattern>/second</url-pattern>
</servlet-mapping>
여러 서블릿을 web.xml에 설정할경우 복잡해진다는 단점이있다.
annotation을 이용하여서 직접 기능 명시를 하게된다면 가독성이 좋아지는 장점이있다.
annotation : 소스코드에 직접 기능을 설정하는 방법
@WebServlet을 이용하자.
주의 할점 : annotation이 적용되는 클래스는 HttpServlet 클래스를 항상 상속받아야한다.
@WebServlet("/third")
public class ThridServlet extends HttpServlet {
...
}
이클립스에서는 new -> Servlet을 하게되면
간단히 Servlet에 대한 정보와 annotation을 정해서 만들수있다.
혹여 annotation을 사용할때는 매핑 이름이 사용되고있는 다른 매핑이름과 중복되지않도록 주의해야한다
<form name="frmInput" method="get" action="input">
아이디: <input type="text" name="used_id"><br>
비밀번호: <input type="password" name="user_pw"><br>
<input type="checkbox" name="subject" value="java" checked>자바
<input type="checkbox" name="subject" value="C언어">C언어
<input type="checkbox" name="subject" value="JSP">JSP
<input type="checkbox" name="subject" value="안드로이드">안드로이드
<br><br>
<input type="submit" value="전송">
<input type="reset" value="초기화">
</form>
String getParmeter(String name) - name의 값을 알고 name값 전송된 값을 받아오는데 사용
string [] getParameterValues(String name) - name에 대해 여러개의 값을 얻을때 사용
Enumeration getParameterNames() - name 값을 모를때 사용
@WebServlet("/input") //form 태그의 action과 mapping
InputServlet.java
package sec01.ex01;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/input") //form 태그의 action과 mapping
public class InputServlet extends HttpServlet{
public void init() throws ServletException{
System.out.println("init 메서드 호출");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
request.setCharacterEncoding("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);
}
}
public void destory(){
System.out.println("destory 메서드 호출");
}
}
InputServlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
request.setCharacterEncoding("utf-8");
Enumeration enu = request.getParameterNames();
while(enu.hasMoreElements()){
String name = (String) enu.nextElement();
String[] values = request.getParameterValues(name);
for(String value : values){
System.out.println("name= " + name + ",value=" + value);
}
}
}
name 값을 모르는 경우에는 Enumeration enu = request.getParameterNames() 처럼
모든것을 다 받아와서 한꺼번에 뿌려줘도 된다
get
서블릿에 데이터를 전송할때 데이터가 url 뒤에 name=value 형태로 전송
여러개의 데이터를 전송할떄는 &로 구분
보안이 취약
최대 255자의 데이터 전송 제한
기본전송방식 및 사용 쉬움
웹브라우저에서 직접 입력 가능
post
tcp/ip 프로토콜 데이터의 head 영역에 숨겨져서 전송
보안에 유리
데이터 용량 무제한
처리속도가 get보다 느림
package sec03.ex02;
import java.io.IOException;
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;
@WebServlet("/login4")
public class LoginServlet4 extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("init 메서드 호출");
}
//Get 방식으로 처리할때
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet 메서드 호출 ");
doHandle(request, response);
}
//Post 방식으로 처리할때
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost 메서드 호출");
doHandle(request, response);
}
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
request.setCharacterEncoding("utf-8");
String user_id = request.getParameter("user_id");
System.out.println("doHandle 메서드 호출 ");
String user_pw = request.getParameter("user_pw");
System.out.println("아이디 : " + user_id);
System.out.println("비밀번호 : " + user_pw);
}
public void destory(){
System.out.println("destory 메서드 호출");
}
}