요르딩딩

Servlet&JSP 프로그래밍 (15강 ~ 25강) 본문

[강의]/[서블릿 JSP 강의] (뉴렉처)

Servlet&JSP 프로그래밍 (15강 ~ 25강)

요르딩딩 2024. 6. 7. 14:10
728x90
반응형

 

[15. GET요청과 쿼리 스트링]
1.  http://localhost/hello?cnt=3 : 쿼리 스트링 (GET) -> 문자열로 넘어간다.
int cnt = Integer.parseInt(request.getParameter("cnt"));

 

2. 대신 위의 코드의 경우  cnt값이 없으면, 오류가 발생한다.

 

[16. 기본값 사용하기]
-  /hello?cnt=3 ---> "3"
- /hello?cnt=    ---> ""
- /hello?           ---> null
- /hello             ---> null
String temp = request.getParameter("cnt");
int cnt = 0;
if (temp != null && !temp.equals("")){ // Null과 빈문자열 모두 체크해줘야한다!!!
 ...
}​

1. index.html에 <a href="hi?cnt=3"> 인사하기 </a> 하면 버튼만 클릭하여 쿼리스트링을 보낼 수 도 있다.
[17.  사용자 입력을 통한 GET 요청]
<form action ="hi">
    <div>
       <label> 안녕하세요. </label>
   </div>
   <div>
      <input type ="text" name ="cnt" />
      <input type="submit" value="3"/>
   </div>
</form>

# GET : http://localhost:8080/hi?cnt=3 이 호출됨.
[18. 입력할 내용이 많은 경우는 POST 요청]

<form action ="notice-reg">
    <div>
       <label> 안녕하세요. </label> <input name = "title" type = "text">
   </div>
   <div>
      <label> 내용 </label> <input name = "content" type = "text">
      <input type="submit" value="등록"/>
   </div>
</form>

# (기본)GET호출 : http://localhost:8080/notice-reg?title=hi&content=abcde > 길이가 제한문제, 보안문제
# POST 호출 : <form action ="notice-reg" method="post">로 변경
  - 파라미터가 body로 전달됨.

# 파라미터 사용
request.getParameter("title");
request.getParameter("cotent");
[19. 한글입력 문제]
- 브라우저에서 서버로 한글이 전달되지 못할때
- 영문자는 1바이트, 그외는 2바이트
- UTF-8 (2바이트로 전달) -> URL Encoding -> ISO-8859-1 (1바이트로 인식)이기때문에 오류
  그래서 서블릿 코드에 request.setCharacterEncoding("UTF-8"); 작성해줘야함.
  그러나 톰캣서버의 값을 잘 바꾸지는 않음.
[20. Servlet Filter]
# 웹서버 > was > (Filter) > servlet Container (서블릿 여러개 존재)
# 서블릿마다 공통된 기능을 넣는것은 비효율. 그렇다고 톰캣의 설정인 server.xml에서 바꾸는것도 무리
# Fillter는 서블릿 컨테이너로 들어갈떄/나올때 둘다 작동 가능 

# 필터 추가하기 
 * (방법 1)
   1. Class생성 > interfaces add > Filter 선택 > 완료
   2. 자동으로 impolements Filter와 doFilter메소드가 생성됨.
      - chain.doFilter(reqeust, response); : 요청이 오면 흐름을 넘기는거
public class CharacterEncofingFilter implements Filter {
   @Override
   public void doFilter (ServletReqeust request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
   
      System.out.println("before filter");
      
      request.setCharacterEncoding("UTF-8");// 인코딩 
      chain.doFilter(request, response); // 흐름넘기기
      
      System.out.println("after filter");
   }

 


   3. filter 클래서 설정 
      - web.xml 설정 
<filter>
   <filter-name>characterEncofingFilter</filter-name>
   <filter-class>com.newlec.web.filter.CharcterEncodingFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>characterEncodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>​


* (방법 2)

   1. 어노테이션 설정
@WebFilter("/*") // 어노테이션으로 설정하기
public class CharacterEncofingFilter implements Filter {
   @Override
   public void doFilter (ServletReqeust request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
   
      System.out.println("before filter");
      
      request.setCharacterEncoding("UTF-8");// 인코딩 
      chain.doFilter(request, response); // 흐름넘기기
      
      System.out.println("after filter");
   }


# 톰캣을 가동하면 1번 실행, 그 이후로 요청때마다 실행됨.
[21. 학습과제]
[22. 과제풀이]
[23. 여러개의 submit  버튼 사용하기]

HTML의 input태크에 name값이 있다면 값이 전달된다.
type에 따라 다른데, type="submit"인 경우는 클릭된 것에 한해서만 값이 전달된다.

# 개발자도구 : Form Data
x=2&y=3&operator=%EB%8D%~~~  => 한글일 url인코딩 된것입니다.
...
<body>
   <form action = "calc">
    <input type="text" name="x" />
    <input type="text" name="y" />
    ..
    <input type="submit" name="operator" value="덧셈">
    <input type="submit" name="operator" value="뺄셈">
...

@WebServlet("/calc")
public class Calc extend HttpServlet {
     protected void service(HttpServletRequest request, ~){
     response.setCharacterEncoding("UTF-8");
     response.setContentType("text/html; charset=UTF-8");
     
     String x = request.getParameter("x");
     String y = request.getParameter("y");
     String operator = request.getParameter("operator");
     
     ...
    }
}


[24. 입력 데이터 배열로 보내기]

데이터를 배열로 보내고 싶을때는 태그의 name를 동일한 값으로 넣어주면 된다.
값을 전달받는 컨트롤러는 getParameterValues로 받아야 한다.

# 개발자도구 : Form Data
num=1&num=2&num=3&num=4
...
<body>
   <form action = "add2">
    <input type="text" name="num" />
    <input type="text" name="num" />
    <input type="text" name="num" />
    <input type="text" name="num" />
    ..
    <input type="submit" name="operator" value="덧셈">
    <input type="submit" name="operator" value="뺄셈">
...​
@WebServlet("/add2")
public class Calc extend HttpServlet {
     protected void service(HttpServletRequest request, ~){
     response.setCharacterEncoding("UTF-8");
     response.setContentType("text/html; charset=UTF-8");
     
     String[] num = request.getParameterValues("num");
     ...
    }
}

 

[25. 상태를 유지의 필요성]

# 사용자로부터 두 개의 값을 하나씩 개별적으로 입력 받는 방식 
# 상태 유지를 위한 5가지 방법 : application, session, cookie, hidden input,.querystring

...
<body>
   <form action = "calc2">
    <input type="text" name="v" />
    ..
    <input type="submit" name="operator" value="+">
    <input type="submit" name="operator" value="-">
    <input type="submit" name="operator" value="=">
...​
@WebServlet("/calc2")
public class Calc extend HttpServlet {
     protected void service(HttpServletRequest request, ~){
     response.setCharacterEncoding("UTF-8");
     response.setContentType("text/html; charset=UTF-8");
     
     String[] num = request.getParameterValues("num");
     ...
    }
}

자세한 내용은 26강에...

 

 

728x90
반응형
Comments