You are using an outdated browser. Please upgrade your browser to improve your experience.

11/30

http://www.acidtests.org/

웹브라우저가 html,css표준을 얼마나 지원하는가를 테스트 할 수 있는 사이트

웹 브라우저에서 바라보는 루트 : 서버 루트

서블릿 컨테이너가 바라보는 루트 : 웹 어플리케이션 루트(컨텍스트 루트)

post로 보내긴 하는데 multipart로 보내진 데이터를 서블릿에서 처리를 못한다.

그럼 어떡하느냐? 이걸 처리하려면 따로 프로그램을 짜줘야 한다.

일반적인 포스트 요청과 다르게 multipart는 일반적인 인코딩 대신 이렇게 해준다.

      for (FileItem part : parts) {
        if (part.isFormField()) {
          // 파트의 데이터가 일반 데이터라면
          paramMap.put(part.getFieldName(), // 클라이언트가 보낸 파라미터 이름
              part.getString("UTF-8") // 파라미터의 값. 값 꺼낼 때 인코딩을 지정해야 한다.
          );

servlet04의 fileupload예제는 HashMap을 써서 데이터를 분리하여 저장하는 등 귀찮은 공정을 거쳐야 하므로 잘 쓰지 않는다. (commans file upload)


실무에서도 서로의 DB를 잘 공유하지 않는다. 자기 DB는 자기가 테스트하는것임.

remove할때 wtpwebapps upload에 미리

배포폴더로가서 어딘가에 복사해놨다가 upload를 다시 갖다 붙여야한다.

현업에서는 서버를 여러대 둔다.


체크박스의 값은 체크를 하면 넘어가고 체크를 하지 않으면 값이 아예 넘어가지 않는다.

http://localhost:9999/bitcamp-web-project/ex04/s7?a=aaaa&b= b값에 아무것도 없지만 빈 문자열 값을 서버에 넘긴것임. 파라미터가 넘기는 것도 빈 문자열이라는것!

게시판 게시글 출력시 사진 업로드하고 조그맣게 다 붙은 사진이 기억날것이다. 업로드한 사진은 4mb인데 다운로드 받아서 출력할땐 작은 이미지로 출력하더라도 웹브라우저가 다운받는게 작은 이미지가 아니다. 그냥 원본 다운받고 출력하는 모습이 작은 사진일뿐임!

다운로드 용량은 똑같다는 것!

그래서 섬네일 이미지만 따로 만들어서 그걸 링크를 걸어야 한다는 것…

db에 저장할때는 원본파일명으로 저장하고

db에서 가져온 원본 파일명에 접미사로 섬네일 크기(_20x20, 등등등)을 붙여서 사용하기

그래야 찾기쉽고 사용하기 쉬움!!!

원본파일 가져와서 사이즈 줄이는 이런짓

    out.printf("<img src='../upload/%s' height='80'><br>\n", filename);

하지말기!!!! 이건 보이는 크기만 줄이는거지 썸네일이 아니라는거!!!

실무에서는 썸네일이 선택아닌 필수라는거 그니까 반드시 프로젝트에 제대로 적용하라는거

사진 기준은 높이로 맞춰야함

너비로 맞추면 높이가 뒤죽박죽이라서 높이로 맞춰줘야 간격이 일정하게 나온다!

너비는 비율에 따라 달라지게 해줘도 된다.

정사각형으로 하고싶다면? crop을 쓰면 된다. thumnaillator에 그런 기능 있으니 찾아봐야함


자바 웹프로젝트 패키지05

필터는 ㅇ서블릿 실행하기 전에 먼저 실행되기 때문에 브라우저에서 실행할 방법이 없다. 그냥 서블릿을 요청해야한다.

    System.out.printf("ex06.Filter01 : encoding=%s\n", filterConfig.getInitParameter("encoding"));

이런 코드를 보면 web.xml에 등록된 것을 읽어오는 놈이라는 걸 이해할 정도는 되어야 한다.

필터를 애노테이션으로 설정하기

 @WebFilter(
 value="/ex05/*",
 initParams={
 @WebInitParam(name="encoding", value="UTF-8"),
 @WebInitParam(name="aaa", value="nono")
 })

web.xml파일

	  <init-param>
	    <param-name>encoding</param-name>
	    <param-value>UTF-8</param-value>
	  </init-param>
	  <init-param>
	    <param-name>aaa</param-name>
	    <param-value>okok</param-value>
	  </init-param>

애노테이션 바꾸는건 web.xml바꾸는거랑 똑같아서 서버 restart해줘야 함.

필터는 어떤 순서로 꼽힐지 보장할 수 없다. 필터는 순서에 따지지 않고 돌아가도록 만들어야한다.

web.xml에 컨텍스트 초기화 파라미터를 설정하는 방법

<context-param>
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
</context-param>
<context-param>
  <param-name>aaa</param-name>
  <param-value>hoho</param-value>
</context-param>

서블릿 컨테이너의 이런 메서드(getinitparameter)를 봤을 경우엔 위와 같이 context-param을 찾아본다.

   System.out.printf("ex06.Filter03 : encoding=%s\n",
        request.getServletContext().getInitParameter("encoding"));

bitcamp-java-project-server에 필터 적용하기

필터는 어떤때 필요한가? 문자인코딩을 몇백개가 넘는 servlet에 일일이 적용해야 한다면 너무 귀찮을거다.

그래서 filter를 적용하도록 한다.

<url-pattern>/*</url-pattern>

필터실행을 따지지 말고 모든 경우에 실행하도록 /*로 셋팅.

xml파일은 이렇게 셋팅

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0"
  metadata-complete="false">
 
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.eomcs.pms.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
</web-app>

CharacterEncodingFilter는 이렇게 셋팅

package com.eomcs.pms.web.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

//@WebFilter("")
public class CharacterEncodingFilter implements Filter {
  FilterConfig config;

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    config = filterConfig;
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {

    // 다음 필터나 서블릿을 실행하기 전에
    // 요청 파라미터의 값이 UTF-8로 인코딩 되었음을 알린다.
    request.setCharacterEncoding(config.getInitParameter("encoding"));

    // 다음 필터 또는 서블릿을 실행한다.
    chain.doFilter(request, response);
  }
}

html은 스태틱리소스라 한번 작성되면 동적으로 바뀌지 않는다.

하지만 서블릿은 그 html을 동적으로 만든다.

ProjectAddFormServlet생성, 존재하는 멤버 받아오기

      out.println("<ul>");

      List<Member> members = memberService.list();
      for(Member member : members) {
        out.printf("<li><input type='checkbox' name='members' value='%d'>%s</li>\n",
            member.getNo(), member.getName());
      }
      out.println("</ul><br>");

html을 서블릿에서 동적으로 만든 예

프롬프트의 out,in을 더이상 쓰지 않는 이유 : stateless방식은 한번에 데이터를 왕창 보내고 한번에 왕창 받는 방식이기 때문이다.

projectAddServlet


      // 프로젝트에 참여할 회원 정보를 담는다.
      List<Member> members = new ArrayList<>();

      String[] memberNoList = request.getParameterValues("members");
      if(memberNoList != null ) {
        for(String memberNo : memberNoList) {
//          Member member = new Member();
//          member.setNo(Integer.parseInt(memberNo));
          members.add(new Member().setNo(Integer.parseInt(memberNo)));
        }
      }

멤버를 이런식으로 목록을 나열하여 선택할 수 있도록 한다.

  public Member setPassword(String password) {
    this.password = password;
    return this;
  }

셋터메소드의 리턴값이 그 자신이기 때문에 이런 기법이 가능하다.


요즘트렌드 - 사진만 바꿀수있게

MemberPhotoUpdateServlet생성(강사님 소스 참고)