서블릿 코드는 Java Resources에서 만들지만 실행은 webapp에서 웹을 구현한다.
기존 자바에서는 표준출력장치로 출력을 해봤다면
웹용 자바인 servlet을 이용하여 get방식.
출력방향을 서버에서 클라이언트(브라우저) 측으로 출력을 해보자
Servlet.java
//@WebServlet("/Servlet1Hello") <--한줄로 매핑
public class Servlet1Hello extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// Mime type과 문자 코드
resp.setContentType("text/html;charset=utf-8");
System.out.println("서버 컴의 표준출력장치로 출력");
//getWriter로 printwriter객체를 얻음 웹 브라우저 출력
PrintWriter out = resp.getWriter();
out.println("<html><body>");
out.println("<h1>서블릿 문서 처리 성공<h1>");
out.println("</body></html>");
out.close();
}
}
web.xml
모든 요청은 web.xml을 가장 먼저 읽는다.
그러므로 작성한 servlet은 xml파일에서 매핑해야한다.
//web-app에 추가
<servlet>
<servlet-name>kbs</servlet-name>
<servlet-class>pack1.Servlet1Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>kbs</servlet-name>
<url-pattern>/Servlet1Hello</url-pattern>
</servlet-mapping>
<servlet>
에 물리적인 파일의 요청명을 명시하고<servlet-mapping>
에서 논리적인 요청명으로 매핑한다.<servlet-mapping>
의 url을 읽고 servlet-name을 확인한다.그런데 서블릿의 개수가 많을수록 똑같은 매핑을 반복해야하는데 이는 비효율적이다.
그래서 기본 Annotation을 이용하여 요청명을 코드한줄로 매핑한다.
@WebServlet("/hello")
접속시 링크는 http://localhost/javaweb1/hello
가 된다.
이를 html에서 접속해보자
html
<body>
서블릿 문서 방문하기<br/>
<a href="hello">첫번째 서블릿</a>
</body>
a태그에 매핑 명을 넣으면 매우 간단히 가능하다.
@WebServlet("/Servlet2Go")
public class Servlet2Go extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
<!--초기화 담당 : 서비스 실행시 1회 수행-->
System.out.println("init");
}
public void destroy() {
<!--마무리 담당 : 서비스 종료 시 1회 수행-->
System.out.println("destroy");
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
<!--get, post 요청 수신-->
System.out.println("service");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
<!--get, 요청 수신-->
System.out.println("doGet");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
<!--post 요청 수신-->
System.out.println("doPost");
}
}
요청을 수신할때 get,post 상관없이 service가 호출된다.
get/post를 지정 사용하고 싶으면 doGet dePost를 사용하면 된다.
요청명을 여러개 쓸 수도 있다.
@WebServlet({"/Servlet2Go","/nice"})
<a href="Servlet2Go">두번째 서블릿</a><br/>
<a href="nice">두번째 서블릿</a><br/>
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// get, post 요청 수신
response.setContentType("text/html;charset=utf-8");
System.out.println("서버 컴의 표준출력장치로 출력");
// getWriter로 printwriter객체를 얻음 웹 브라우저 출력
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>서블릿 문서 이해</h1>");
int a = 10, b=20;
out.println("a: "+a+",b : " +b);
out.println("<br>calc메소드 수행" + calc(a,b));
Servlet2other other = new Servlet2other("홍길동");
out.println("<br>other의 이름 : " + other.getIrum());
out.println("<br>other의 display 수행 결과 : " );
other.display(5, out);
out.println("</body></html>");
out.close();
}
private int calc(int a, int b) {
return a+b;
}
public class Servlet2other {
private String irum;
public Servlet2other(String irum) {
this.irum = irum;
}
public String getIrum() {
return irum;
}
public void display(int n,PrintWriter out) {
try {
int su = 10/n;
out.println("<p>연산 결과 :"+su+"<p>");
} catch (Exception e) {
System.out.println("display error"+e);
}
}
}
자바 내에서 html와 자바의 메소드,클래스,변수를 함께 사용한것을 확인할 수 있다.
참고로 객체 생성은 service에서 하는것이 아닌 최초 1회 시행되는 init에서 하는것이 적절하다.
get방식
form태그의 action에 servlet 명을 작성하고 호출해봤다.
<body>
<h2>get test</h2>
<a href="Servlet3Get?name=신기해&addr=역삼동&age=33">get링크로 자료 전송</a>
<br>
<form action="Servlet3Get">
이름 : <input type="text" name="name" value="신기루"><br/>
주소 : <input type="text" name="addr" value="정자동"><br/>
나이 : <input type="text" name="age" value="22"><br/>
<br>
<input type="submit"/>
</form>
</body>
servlet에서 전송데이터 받기
함수로 구현 후 결과 반환
<body>
<h2>post test</h2>
<form action="Servlet4Post" method="post">
이름: <input type="text" name="name" value="홍길동"><br/>
주소1: <input type="text" name="addr" value="서울시"><br/>
주소2: <input type="text" name="addr" value="강남구"><br/>
<br>
<input type="submit">
</form>
</body>
같은 name이 2개인것을 확인하자
servlet에서 post로 데이터 받고 출력하기
단일개수의 데이터는 getParameter
사용하여 넘겨받았다.
하지만 name값은 여러개이므로 자바에서 배열로 담았다.
그때 사용하는 request
는 getParameterValues
이다.
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");