servlet-context.xml에서 viewResolver 부분을 삭제한다.
controller을 만들고
아래와 같이 viewResolver가 만들어 주었던 prefix와 suffix 부분을 다 적어 준다.
JSP 에서 filter 클래스에서 컨트롤러가 실행되기 이전에 처리되는 부분에서 request 인토딩을 하였다. 이부분을 web.xml에 추가한다.
web.xml에 filer 태그를 추가해 준다.
forceEncoding 은 웹 어플리케이션에서 클라이언트와 서버간의 문자 인코딩을 강제로 설정하거나 지정하는데 사용된다. 인코딩에 관련해서 문자깨짐, 보안문제, 검색 밑 분석 문제가 발생할 수 있는데
문자깨짐은 클라이언트와 서버 간에 서로 다른 문자 인코딩이 사용되는 경우, 특수 문자나 다국어 문자가 포함된 경우 문자가 꺠질수도 있다.
보안 문제는 인코딩과 관련 취약점을 악용한 공격이 발생할 수 있다.
검색 및 문석 문제는 텍스트 데이터를 저장하소 검색할때 올바른 문자 인코딩을 사용하지 않으면 검색 및 분석문제가 발생할 수 있다.
이런 문제를 해결 하고자 사용된다. 전달되는 데이터의 문자 인코딩을 일관되게 설정하는데 도움을 준다. 인코딩을 강제로 설정하는데 사용될수 있으며 이를 통해 문자열 테이터의 안정성과 일관성을 유지할 수 있다.
false로 설정되어 있으면 문자 인코딩을 강제로 하지 않는다는 것이다. 문자 인코딩을 강제로 변경하지 않는 것은 웹 애플리케이션에서 사용되는 문자 데이터의 인코딩을 클라이언트 또는 서버에서 자동으로 처리하도록 하려는 경우에 사용될 수 있다. 이런 설정은 데이터가 전달될 때 원래의 문자 인코딩이 그대로 유지되며 클라이언트 또는 서버에서 추가적인 문자 인코딩처리가 필요하지 않는다.
redirect 하는 방법
1. 스프링이 지원하는 방식
return "redirect:이동경로";
public String add(){
return "redirect:/list.do";
}
2. 자바스크립트 코드를 만든다.
location.href='이동경로';
public String add(HTTPServletResponse response){
PrintWriter out = response.getWriter();
out.println("<script");
out.println("location.href='이동경로'");
out.println("<script'>'");
} -주로 alert창을 이용할때 쓴다.
redirect 이동 경로
1. 반드시 URLMapping 값을 작성한다.
2. 이동할 JSP 경로를 작성할 수 없다.
//@RequestMapping(value = "/faq/add.do", method = RequestMethod.POST)
public String add(HttpServletRequest reqeust) {
String title = reqeust.getParameter("title");
String content = reqeust.getParameter("content");
// title이 빈 문자열이면 add 실패로 가정(DB 처리할 때 insert 성공은 1, 실패는 0이다.)
int addResult = title.isEmpty() ? 0 : 1;
// addResult를 가지고 faq 목록 보기로 이동(리다이렉트에서 모델에 담아서 전달하면 안된다. )
return "redirect:/faq/list.do?addResult=" + addResult; //jsp가 오면 작동을 안함(redirect하면)
}
//@RequestMapping(value="/faq/list.do", method=RequestMethod.GET)
public String list(@RequestParam(value="addResult", required=false) String addResult, Model model) { //@RequestParam은 우리가 파싱하지 않아도 알아서 변환해 준다.
model.addAttribute("addResult", addResult); //1 or 0을 전달한다.
return "faq/list"; //WEB-INF/views/faq/list.jsp
}
@RequestMapping(value = "/faq/add.do", method = RequestMethod.POST)
public String add2(HttpServletRequest request
, RedirectAttributes redirectAttributes) { // redirect 상황에서 값을 전달할 때 사용한다.
//요철 파라미터
String title = request.getParameter("title");
//title이 빈문자열이면 add 실패
int addResult = title.isEmpty() ? 0 : 1 ;
// faq 목록 보기로 redirect 할 때 addResult를 "flash attribute"로 곧바로 전달하기
redirectAttributes.addFlashAttribute("addResult", addResult);
// faq 목록보기로 redirect
return "redirect:/faq/list.do";
}
@RequestMapping(value="/faq/list.do", method=RequestMethod.GET)
public String list2() {
return "faq/list";
}
1. Dependency Injection
2. Spring Container에 저장된 객체를 가져오는 방식이다.
3. 주요 Annotation
1) @inject
(1) javax.inject.Inject
(2) 타입이 일치하는 객체를 찾아서 가져온다. 없으면 오류가 발생한다.
(3) 동일한 타입의 객체가 2개 이상 있다면 이름이 일치하는 객체를 가져온다.
2) @resource
(1) javax.annotation.Resource
(2) javax-annotation-api dependency를 pom.xml 에 추가해야 사용할 수 있다.
(3) 이름이 일치하는 객체를 찾아서 가져온다. 없으면 오류가 발생한다.
3) @AutoWired
(1) org.springframework.beans.factory.annotation.Autowired
(2) @Inject 기반의 Spring Annotation이다. (타입 기반)
(3) 객체 이름을 기준으로 가져올 수 있도록 @Qualifier(org.springframework.beans.factory.annotation.Qualifier)를 사용 할 수 있다.
BoardService DI 처리 방법
1. BoardService 타입의 BoardServiceImpl 객체를 Spring Container에 넣는다. (아래 3가지 방법 중 하나 사용)
1) <"bean">태그 : /WEB-INF/spring/root-context.xml
2) @Configuration + @Bean :com.gdu.app05.config.AppConfig.java
3) @Component
2. @Autowired 를 이용해서 Spring Container에서 BoardService 타입의 객체를 가져온다.
1) 필드에 주입하기
2) 생성자에 주입하기
3) setter 형식의 메소드에 주입하기