Servlet



<Eclipse IDE EE 버전으로 웹개발 환경 구축>
(WAS로는 tomcat 9 버전 사용)

Dynamic Web project로 프로젝트 생성
Target runtime에 사용할 tomcat 등록
Java Resources\src -여기에 java 패키지와 소스코드 작성
src\main\webapp  -여기에 html 작성
(버전에 따라 폴더 이름 또는 구성은 달라질 수 있다)

가동되는 브라우저를 변경하고 싶다면 window > web browser 변경
프로젝트 명이 url에 드러나지 않게 하려면 file > Properties > web project settings > Context root를 / 로 변경

 

웹 브라우저에서 실행되는 실제 파일은 위와 같은 이클립스 개발 디렉토리나 톰캣 폴더가 아닌
배포시 workspace\.metadata\.plugins\org.eclipse.wst.server.core 에서 복제되어 생성된다.



<Annotaion을 이용한 URL 맵핑>


@WebServlet("/hello")
public class Nana extends HttpServlet {}

-위처럼 어노테이션을 클래스 위에 붙여주면 web.xml 등 외부파일에서 설정할 필요없이 적용된다.
(Servlet 어노테이션 임포트 해야함)
-어노테이션을 사용해 url을 맵핑할 시 web.xml의 metadata-complete은 false로 바꿔주어야 한다.
(true로 되어 있으면 web.xml 의 설정이 우선된다)



<한글과 콘텐츠 형식>


브라우저에 response 하는 콘텐츠의 형식을 알려주지 않을 경우 브라우저는 자의적으로 해석한다.

ex) 익스플로러는 response한 문자열의 "<br>"을 html로 해석해 한줄을 내리지만 크롬은 text로 해석해 그대로 출력한다.
(tomcat 기본 인코딩은 ISO-8859-1)


=서버에서 한글을 지원하지 않는 문자코드로 인코딩 될 경우= 
(ex) ISO-8859-1 문자코드
한국어 출력 : ??:???????

해결법)
response.setCharacterEncoding("UTF-8");


=서버에서는 한국어를 지원하는 UTF-8로 인코딩해서 보냈지만 브라우저가 다른 코드로 잘못 해석한 경우=
(ex) EUC_KR 문자코드
한국어 출력 : 뒹귥◆땗뺎◆

해결법)
response.setContentType("text/html; charset=UTF-8");


이클립스에서 소스 파일 생성시 인코딩 방식 미리 설정하기
window > preference > web > files... > encoding 변경



<GET 요청과 쿼리스트링>


=쿼리스트링에 따른 request.getParameter("cnt");  반환 값=

http://localhost/hello?cnt=3   =GET=>

hello?cnt=3 =>   "3"
hello?cnt= =>   ""
hello? =>   null
hello =>   null

테스트용 html)
<body>
환영합니다.<br >
<a href="hi">인사하기</a><br >
<a href="hi?cnt=3">인사하기</a><br >
</body>



<POST 요청>


<form action="notice-reg" method = "post">
-url에 쿼리가 표시되지 않고 요청바디를 통해 요청됨

post 요청 시 title=abc&content=abcdefg 이러한 형태로 전달된다

=한글 포스트 시 깨짐 문제=
한국어 출력 : dsad ì•ˆë…•하세요

해결법)
request.setCharacterEncoding("UTF-8");

(tocat\conf\server.xml 외부 설정 파일에서 기본 인코딩 설정을 UTF-8로 가능하지만 권장되지 않는다)
(톰캣으로 운영하는 모든 서버가 UTF-8 이 되기 때문)



<Servlet Filter>


서블릿 request, respond가 실행되기 전 먼저 선행되어
인코딩 설정, 유효성 검사, 다른 url로 우회시키는 등의 일을 시킬 수 있는 필터 인터페이스.

public class CharacterEncodingFilter implements Filter {
@Override
  public void doFilter(ServletRequest request
    , ServletResponse response
    , FilterChain chain)
    throws IOException, ServletException {
      request.setCharacterEncoding("UTF-8");
      chain.doFilter(request, response);
    }
}

FilterChain 객체
필터가 언제 실행될 지, 어떻게 실행될지 흐름을 제어하는 용도
chain.doFilter(request, response);
다음 url로 진행시킨다



=Annotaion을 이용한 Filter URL 맵핑=

import javax.servlet.annotation.WebFilter;

@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {}



=web.xml 설정을 통한 url맵핑=

  <filter>
   <filter-name>characterEncodingFilter</filter-name>
   <filter-class>패키지.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
   <filter-name>characterEncodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>

->   /* 모든 url에 대해 필터를 적용시킬 경우

 

 

 

<입력 데이터 배열로 받기>

[html]

<body>
<form action="add2" method="post">
<div>
<input type="text" name="num" />
<input type="text" name="num" />
<input type="text" name="num" />
<input type="text" name="num" />
</div>
<div>
<input type="submit" value="덧셈" />
</div>
<div>
결과 : 0
</div>
</form>
</body>


[servlet]
String[] num_ = request.getParameterValues("num");
int result = 0;
for (int i = 0; i < num_.length; i++) {
  int num = Integer.parseInt(num_[i]);
  result += num;
}
response.getWriter().printf("result is : %d\n", result);



'Development > Java' 카테고리의 다른 글

Servlet (service, doGet, doPost) #3  (0) 2022.08.13
Servlet (Application, Session, Cookie) #2  (0) 2022.08.12
Tomcat  (0) 2022.08.11
JDBC  (0) 2022.08.07
Java Thread & Sync  (0) 2022.08.04

+ Recent posts