DispatcherServlet을 통해서 데이터 전달이 되고 데이터 출력이 완성된다.
MVC -> HandlerMapping에게 url 호출이 들어왔는데, 물어본다.
url 호출의 경로가 정상적이면, controller에게 데이터를 요청하고 view를 for_ward 하는 것들을 지시한다.
객체간의 의존적 관계를 보아야한다.
DeptDao -> SqlSessionTemplate -> SqlSessionFactoryBean -> BasicDataSource 이렇게 사용이 가능할 수 있도록 해야하는데 그러기 위해서는 아래에서 부터 Injection 시켜야한다. (Dependency Injection) 의존성 주입
----------------- Spring Framwork > Spring Boot로 가면, 내부 환경설정이 전부 되어있기 때문에, context 같은 라이브러리 설정 파일들이 전부 사라져있다. 그렇기 때문에 Framwork에서 사용하는 환경설정에 대해서 기본적인 구조를 파악하고 있자
Spring Framwork로 DB의 parameter 값 받아와주는것 시작
한 줄 요약: request 해와서 가져왔던 parameter를 매개변수 안에서 @RequestParam 하여서, null 값이 들어올때와 Integer.parseInt() 해줬던것을 전부 처리한다. 그리고, HttpServlet request와 response를 매개변수로 받아줬던것을 변경했기에 Model model을 이용해서, 값을 넘겨준다.
// 자동엮기(자동으로 injection)
@Autowired
VisitDao visit_dao;
// (전체+필터)조회
// /visit/list.do
// /visit/list.do?page=2&search=name_content&search_text=현진
@RequestMapping("/visit/list.do")
public String list(@RequestParam(name="search", defaultValue = "all") String search,
String search_text) {
// 기존에는 Method 인자를 던져주고 Spring이 request parameter를 받아줬던 것이다.
// 1. parameter 받기
// String search = request.getParameter("search");
// search_text = request.getParameter("search_text");
// search 값이 안들어왔을때 그냥 default로 전체보기로 보여주겠다.(안넣어주면 nullPointException)
/*
if(search==null) { search="all"; }
*/
RequestParam(name="search" -> 라는 파라미터가 들어오는데, defaultValue = "all" -> 값이 null 이면 all을 넣는다.)
기존에 nowPage를 잡아줘서 없으면 기본값을 1로 주었다.
하지만, 이걸 Method의 parameter에서 전부 다 처리해준다. (page라는 parameter 값을 받아오고, 값이 null 이면, defaultValue="1" 1을 넣어준다.)
전부 String으로 넣어도 Spring이 넘겨줄때 nowPage가 int이듯이, 정수형으로 바꿔서 넘겨준다.
밑에 있는 request binding은 model Attribute 방법으로 변경해준다. (parameter 값에 있던 request 값을 없애주었기 때문이다)
@Controller
public class VisitController {
public VisitController() {
System.out.println("--VisitController()--");
}
// 자동엮기(자동으로 injection)
@Autowired
VisitDao visit_dao;
// (전체+필터)조회
// /visit/list.do
// /visit/list.do?page=2&search=name_content&search_text=현진
@RequestMapping("/visit/list.do")
public String list(@RequestParam(name="search", defaultValue = "all") String search,
String search_text,
@RequestParam(name="page", defaultValue = "1") int nowPage,
Model model) {
// 기존에는 Method 인자를 던져주고 Spring이 request parameter를 받아줬던 것이다.
// 1. parameter 받기
// String search = request.getParameter("search");
// search_text = request.getParameter("search_text");
// search 값이 안들어왔을때 그냥 default로 전체보기로 보여주겠다.(안넣어주면 nullPointException)
/*
if(search==null) { search="all"; }
*/
/*
* int nowPage = 1; try { nowPage =
* Integer.parseInt(request.getParameter("page")); } catch (Exception e) { //
* TODO: handle exception }
*/
// start/end
int BLOCK_LIST = 2;
int start = (nowPage-1) * BLOCK_LIST + 1;
int end = start + BLOCK_LIST - 1;
// 검색조건을 담을 맵
Map<String, Object> map = new HashMap<String, Object>();
map.put("start",start);
map.put("end",end);
// 이름 + 내용
if(search.equals("name_content")) {
map.put("name", search_text); // 데이터를 찾아오는 값에 이름에다가두 넣구우
map.put("content", search_text); // 내용에다가두 넣구우
} else if(search.equals("name")) { // 문자열 비교는 무조건 equals //search=="name"(X)
// 이름
map.put("name", search_text);
} else if(search.equals("content")) {
// 내용
map.put("content", search_text);
}
// 방명록 데이터 가져오기
List<VisitVo> list = visit_dao.selectList(map);
// 전체 게시물수
int rowTotal = visit_dao.selectRowTotal(map);
// 검색정보 filter : search_filter = "search=name&search_text=길동"
String search_filter = String.format("search=%s&search_text=%s", search, search_text);
// pageMenu 만들기
String pageMenu = Paging.getPaging("list.do", // pageURL
search_filter,
nowPage, // 현재페이지
rowTotal, // 전체페이지
MyCommon.Visit.BLOCK_LIST, // 한화면에 보여질 게시물 수
MyCommon.Visit.BLOCK_PAGE); // 한화면에 보여질 페이지 수
// request binding
model.addAttribute("list", list);
model.addAttribute("pageMenu", pageMenu);
return "visit/visit_list"; // /WEB-INF/views/ + visit/visit_list + .jsp
}// end:list()
// 입력폼 띄우기
@RequestMapping("/visit/insert_form.do")
public String insert_form() {
return "visit/visit_insert_form.jsp"; // viewName
}// end:insert_form()
// 입력(등록)하기
// /visit/insert.do?name=홍길동&content=내용&pwd=1234
@RequestMapping("/visit/insert.do")
public String insert(VisitVo vo, HttpServletRequest request) {
// Method인자 : DispatcherServlert에 대한 요구사항
// 나 호출할 때 (invokation) parameter 들어올 텐데, 그걸 vo로 포장해서 줘
// 1. parameter(전달인자) 받기
/*
String name = request.getParameter("name");
String content = request.getParameter("content").replaceAll("\n", "<br>");
String pwd = request.getParameter("pwd");
*/
String content = vo.getContent().replaceAll("\n", "<br>");
vo.setContent(content);
// 2. ip 정보 받기
String ip = request.getRemoteAddr();
vo.setIp(ip);
// 3. VisitVo 포장
// vo에서 오버로드 된 생성자 새로 추가
// VisitVo vo = new VisitVo(name, content, pwd, ip);
// 4. DBinsert
int res = visit_dao.insert(vo);
// 내가 원하는것은 Redirect이다.
// return "visit_list.jsp"; (기존 Dispatcher 형식)
return "redirect:list.do";
// FrontController(현재:DispatcherServlet)에게 반환
// redirect : 접두어 확인 후 response.sendRedirect("list.do") 처리
}// end:insert
// /visit/check_pwd.do?idx=5&c_pwd=1234
// 입력(등록)하기
@RequestMapping(value="/visit/check_pwd.do",produces="application/json;charset=utf-8")
// view가 아니라 응답데이터로 넘겨줄께
@ResponseBody
public String check_pwd(int idx,String c_pwd) {
// parameter 받기
// int idx = Integer.parseInt(request.getParameter("idx"));
// String c_pwd = request.getParameter("c_pwd");
// idx에 해당되는 게시물 1건을 얻어온다
VisitVo vo = visit_dao.selectOne(idx);
// 비밀번호 비교
boolean bResult = vo.getPwd().equals(c_pwd);
// JSON Data 생성 전송 : {"result":true}
String json = String.format("{\"result\":%b}", bResult);
// @ResponseBody
// 반환 값을 DispatcherServlet이 직접 전송
// contentType은 @RequestMappong에 produces 값을 사용한다.
/*
response.setContentType("application/json;charset=utf-8");
response.getWriter().print();
*/
return json; // 이렇게 사용할시 forward 되어버린다 jsp가 아니기 때문에 505 error
}// end:check_pwd
// 삭제하기
@RequestMapping("/visit/delete.do")
public String delete(int idx) {
// int idx = Integer.parseInt(request.getParameter("idx"));
// DB 삭제
int res = visit_dao.delete(idx);
return "redirect:list.do";
}// end:delete
// 수정폼으로 연결
// /visit/modify_form.do?idx=5
@RequestMapping("/visit/modify_form.do")
public String modify_form(int idx, Model model) {
// int idx = Integer.parseInt(request.getParameter("idx"));
// idx에 해당되는 게시물 1건 얻어오기
VisitVo vo = visit_dao.selectOne(idx);
// textarer \n기능처리 : content <br> -> \n 변환
String content = vo.getContent().replaceAll("<br>", "\n");
vo.setContent(content);
// request binding(JSP에게 vo의 데이터를 넘겨줘야 하기 때문에 setAttribute 한다)
model.addAttribute("vo", vo);
return "visit/visit_modify_form";
}// end:modify_form
@Autowired(@RequestMappong에 의해서 Method 호출시 DS가 자동으로 Injection 시켜준다)
servlet-context.xml에 자동으로 생성되게 Auto-Detecting이 되어있어야 @Autowired가 자동으로 전역변수로 Method가 호출 될 때마다 Injection 된다.
만약 수동생성으로 되어 있다면 반드시 <context:annotation-config/> 를 넣어주어야 한다.
// 수정하기
@RequestMapping("/visit/modify.do")
public String modify(VisitVo vo,
@RequestParam(name="page",defaultValue = "1") int page,
@RequestParam(name="search",defaultValue="all") String search,
String search_text,
RedirectAttributes ra
) {
// parameter 받기
// int idx = Integer.parseInt(request.getParameter("idx"));
// String no = request.getParameter("no");
// String name = request.getParameter("name");
// String content = request.getParameter("content").replaceAll("\n", "<br>");
// String pwd = request.getParameter("pwd");
String content = vo.getContent().replaceAll("\n", "<br>");
vo.setContent(content);
// String page = request.getParameter("page");
// String search = request.getParameter("search");
// String search_text = request.getParameter("search_text");
// ip주소 얻어온다
String ip = request.getRemoteAddr();
vo.setIp(ip);
// VisitVo 포장
// VisitVo vo = new VisitVo(idx, name, content, pwd, ip);
// DB 수정하기
int res = visit_dao.update(vo);
// RedirectAttributes : redirect parameter 정보담는객체
ra.addAttribute("page", page);
ra.addAttribute("search",search);
ra.addAttribute("search_text",search_text);
// DispatcherServlet이 response.sendRedirect("page=%s&search=name&search_text=길동");
return "redirect:list.do";
}// end:modify
'SpringBoot↗' 카테고리의 다른 글
[오류해결]Spring 글씨깨짐 (0) | 2024.07.20 |
---|---|
Spring DB FileUpload (0) | 2024.07.19 |
SPring Visit 게시판 변경하기 (0) | 2024.07.18 |
Spring MVC Mybatis DB 사용해보기 (0) | 2024.07.18 |
Spring DB 데이터베이스 연동(설정 세팅) (0) | 2024.07.18 |