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 |