유효성 검증은 주말에 수정해야 함... !!!!! 

해당 블로그에 정보 남겨놨으니 까먹 지 말자!!

 

어제 만들어놓은 list.jsp는

top.jsp 파일 게시판에 링크연결 해놓고

<li class="nav-item"><a class="nav-link" href="<c:url value="/onememo/bbs/List.do"/>">게시판</a></li>

 

이제 만드는 순서는 이거야

뷰(views)  -> 컨트롤러(.web)  -> 서비스(impl) -> DAO (.mapper : 쿼리문작성하는 .xml)

요 순서 잘잘잘잘잘 익혀두자 !!!!!

글등록 처리 하러 가자


 

[Write]

- 게시판 글 작성하기 (이건 댓글쓰는게 아니고 큰게시판 작성하는거임!!!)

1.뷰

Write.jsp

<c:if test="${! empty InputError}"> </c:if>요거 처리

${InputError} 요거 도 확인

<c:if test="${! empty InputError}">
	<div class="alert alert-success alert-dismissible fade show">
		  <button type="button" class="close" data-dismiss="alert">&times;</button>
		  <strong>Failure!</strong> ${InputError}
	</div>
	</c:if>
	<form method="post" action="<c:url value="/onememo/bbs/Write.do"/>">
	<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
      <div class="form-group">
        <label><kbd class="lead">제목</kbd></label>
        <input type="text" class="form-control" placeholder="제목을 입력하세요" name="title" value="${param.title}">
      </div>
      <div class="form-group">
		<label><kbd class="lead">내용</kbd></label>
		<textarea class="form-control" rows="5" name="content">${param.content }</textarea>
	  </div>
      <button type="submit" class="btn btn-primary">등록</button>
    </form>

 

2.컨트롤러 

MemoController.java  (다시한번 말 하지만 댓글용 노노)

대박 정리하면서 알거같음

write 관련 컨트롤러는 2가지 일을  같이처리함1. 글쓰기 누르면 입력하는 폼으로 이동시키는 일2. 글 작성 후 다시 목록으로 이동시키는데 바로 list로 이동시키는게 아니고 목록으로 이동시키는 list컨트롤러를 호출한다.... 아 그래서 뷰정보 반환이 forword: ~.do 구나!!아 그래서 저걸 배웠구나 !!!!!

앞에서 배운 List(목록)관련 컨트롤러도 원래 여기있음!
@SessionAttributes("id")   //로그인 되어있는 사람만 들어오기!!!!
@Controller
@RequestMapping("/onememo/bbs")
public class MemoController {
   //서비스 주입  setter보단 필드 인젝션으로 주입하자!!!
	@Autowired
	private OneMemoService<OneMemoDTO> memoService;
	
    //예외처리
	@ExceptionHandler({HttpSessionRequiredException.class,PersistenceException.class})
	public String error(Model model,Exception e) {
		System.out.println("예외 클래스명:"+e.getClass().getName());	
			
		 String errorProperty= null ;	
		 String errorMessage= null ;	
		 String forwardUrl = null ;		
			
			if(e instanceof HttpSessionRequiredException ) {				
			//로그인 안될 시 : HttpSessionRequiredException 
				errorProperty="NotMember";
				errorMessage ="로그인후 이용";
				forwardUrl="onememo10/member/Login";
			}
			else if(e instanceof PersistenceException ) {
				errorProperty="InputError";
				errorMessage ="입력중 에러 발생!";
				forwardUrl="onememo10/bbs/Write";
			}		
			model.addAttribute(errorProperty,errorMessage);
			return  forwardUrl;
		}
        
        
    //입력폼으로 이동시키기(GetMapping 이용!)
	@GetMapping("/Write.do") //스프링 4.3부터 지원
	public String write(@ModelAttribute("id") String id) {
		//뷰정보반환
		return "onememo10/bbs/Write";
	}
    
	//입력처리 후 목록으로 이동시키는 list 컨트롤러로 이동 ! 아 복잡해
	@PostMapping("/Write.do")
	public String writeok(
			@ModelAttribute("id") String id,
			@RequestParam Map map
			) {
		//서비스 호출
		map.put("id",id); // 호출 전 넘길 id저장
		memoService.insert(map);	
		//뷰정보반환  forward: 안붙이면 앞뒤로 /WEB-INF/views 랑jsp가 붙음!!
		return "forward:/onememo/bbs/List.do";
	}
 }

 

3.서비스

OneMemoDAO.java

여기서 원래 로직등 작성해야 하나 글 등록은 딱히 뭐 없어서

map에만 내용저장하고 넘기네

여기도 기존에 로그인 + list관련 서비스도 들어 있음! 
@Service("memoService")
public class OneMemoServiceImpl implements OneMemoService<OneMemoDTO> {
	
    //OneMemoDAO주입받는다
	@Autowired
	private OneMemoDAO dao;
    
    //글 삽입 로직!이 들어가야하는데 별다른 로직이 있는게 아니라서 map에 저장만하고 넘겨
    @Override
	public int insert(Map map) {		
		return dao.save(map);
	}
}

4.DAO+mapper

OneMemoDAO.java

여기까지만 스프링에서 지원하는 마이바티스 API(SqlSessionTemplate) 사용 안할 거 

여기도 기존 회원여부 판단용 들어있었음
@Repository
public class OneMemoDAO {	

	//마이바티스 관련 코어 빈을 주입
	@Autowired
	private SqlSessionFactory sqlMapper; 
	
    //글 작성 용
	public int save(Map map) {
		//스프링 지원 마이바티스 API(SqlSessionTemplate) 미 사용시
		//1]SqlSession얻기
		SqlSession session= sqlMapper.openSession();		
		//2]insert()호출
		int affected=session.insert("memoSave", map);
		//3]commit()호출
		session.commit();
		//4]close()호출
		session.close();
		return affected;
	}
}

저  momoSave를 가지고 쿼리문이랑 연결 할  것!

+ mapper

linecomments.xml

여기도물론 기존꺼 다 있음...
<insert id="memoSave" parameterType="Map">
    INSERT INTO onememo VALUES(SEQ_ONEMEMO.NEXTVAL,#{title},#{content},DEFAULT,#{id})
</insert>

 여기까지가 write 하나 끝 !  와우!!!


[view]

역시 또한 뷰(views)  -> 컨트롤러(.web)  -> 서비스(impl) -> DAO (.mapper : 쿼리문작성하는 .xml) 

1.뷰 먼저 

View.jsp

${record.~~~}  이렇게 뿌려주는건 다 작성 후 와서 넣어줘도 됨! 폼만 봐 폼만

아그리고 여기서 좀이따가 댓글 다는 것 도 할 거임 이거 밑으로 더 추가되니까 그렇게만 알아 두셈!!

<tbody class="table-sm">
		<tr>
			<th class="w-25 bg-dark text-white text-center">번호</th>
			<td>${record.no}</td>
		</tr>
		<tr>
			<th class="w-25 bg-dark text-white text-center">글쓴이</th>
			<td>${record.name }</td>
		</tr>
		<tr>
			<th class="w-25 bg-dark text-white text-center">작성일</th>
			<td>${record.postDate}</td>
		</tr>
		<tr>
			<th class="w-25 bg-dark text-white text-center">제목</th>
			<td>${record.title}</td>
		</tr>
		<tr>
			<th class="bg-dark text-white text-center" colspan="2">내 용</th>
		</tr>
		<tr>
			<td colspan="2">${record.content }</td>
		</tr>
	</tbody>

 

2.컨트롤러

MemoController.java

@modelAttribute 저거 분명 심오한 뜻이 있었는데 지금 기억이 안나... 

아이거 로그인 처리된 사람만 들어오게 하는거....였던 거  같음!!!

기억나면 수정해야 겠다. 

그리고 get방식 post방식 다 받을 거라 method 속성도 지정 해 준거 잘 봐두자! 

이거도 이유 있었는데 지금 생각 안나니 나중에 수정할 거!!

뷰에서 쓸 "record" 잘 보고넘겨온 파람 map으로 저장하는 것도 잘 보기!!!

 

역시나 앞에 처리한거도 포함되어 있는 거임!!
@SessionAttributes("id")   //로그인 되어있는 사람만 들어오기!!!!
@Controller
@RequestMapping("/onememo/bbs")
public class MemoController {
	
	//서비스 주입  setter보단 필드 인젝션으로 주입하자!!!
	@Autowired
	private OneMemoService<OneMemoDTO> memoService;

	//상세보기
	@RequestMapping(value="/View.do",method = {RequestMethod.GET,RequestMethod.POST})
	public String view(
			@ModelAttribute("id") String id,
			@RequestParam Map map,
			Model model
			) {
		//서비스 호출		
		OneMemoDTO record=memoService.selectOne(map);
		//데이터저장
		model.addAttribute("record",record);		
		//뷰정보 반환
		return "onememo10/bbs/View";
	}
}

selectOne 구현하러 고

 

3.서비스

OneMemoServiceImpl.java 

오 여긴 로직이 좀 있다!! 

보여지는 글 들 줄바꿈을 해 줘야하는 로직!

@Override
public OneMemoDTO selectOne(Map map) {
    OneMemoDTO record=dao.findRecordByNo(map);
    //줄바꿈 처리
    record.setContent(record.getContent().replace("\r\n","<br/>"));	
    return record;
}

 

4.DAO+mapper

 

OneMemoDAO.java

기존에하던 프로그래밍 순서에 
나. 번만 하면 됨 commit도 불필요
databaseConfig에 빈으로 입력해논 SqlSessionTemples 사용 할 것

@Repository
public class OneMemoDAO {	

	@Autowired // 주입 받음
	private SqlSessionTemplate template;	
	
    public OneMemoDTO findRecordByNo(Map map) {		
	return template.selectOne("memoFindRecordByNo",map);
}

 

아이고 그럼 빈으로등록 해야 겠구나

DatabaseConfig.java

@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory ) {
    return new SqlSessionTemplate(sqlSessionFactory);
}

++ 마지막 매퍼등록 !!

+ mapper

linecomments.xml

<select id="memoFindRecordByNo" parameterType="Map" resultMap="memoDtoResult">
    SELECT o.*,name
    FROM onememo o JOIN member m ON o.id=m.id
    WHERE no=#{no}
</select>

이러면 view도 끝! 

이길 바람....

역시  아니였어... 마지막 매퍼 보면 

못보던게 있지 resutMap이라고....

흐아아아앙 어려운디..

 

매퍼파일 위에 코드를 추가해야 resutMap을 사용 할 수 있음

우선내용설명하신거 붙여넣고.... 이해 될 때까지 읽어봐야지 ..정리할거가 많으니까오늘은 넘긴다...

resultMap사용시 column속성 필수:ibatis와 다른점 
레코드를 조회하는 모든 select태그에서 사용할 수 있다 
 상세보기에 적용:글번호에 따른 모든 한줄 댓글도 가져오기위해 collection태그 사용
 type:DTO계열 즉 SELECT한 쿼리 결과를 담을 자바빈 객체
 id: select 요소의 resultMap속성에 설정해줄 식별자 

(여기서 부터 resulmap 시작)

<resultMap type="memoDto" id="memoDtoResult">

property :자바빈(OneMemoDTO)의 속성명
column: 테이블의 컬럼(조회(SELECT)결과의 컬럼명들 의미)

<result property="no" column="no"/>
<result property="title" column="title"/>
<result property="content" column="content"/>
<result property="postDate" column="pastDate"/>
<result property="id" column="id"/>
<result property="name" column="name"/>
<result property="commentCount" column="commentCount"/>

1:N관계 매핑용
column: 조인조건의 컬럼명 (ON onememo.no = linecomments.no)
select: select태그의 id 속성값(쿼리문은 조인문)
javaType : OneMemoDTO의 자식레코드(LineCommentDTO)를 담을 컬렉션 타입
ofType : 자식의 DTO타입
property: 댓글 목록을 담을 OneMemoDTO속성명

	<collection property="comments" column="no" select="onememo.mybatis.mapper.linecomments.commentListsByNo" javaType="List" ofType="commentDto" />
   </resultMap>

이거 뜻 후려치면

comments에다가 담을겨 no로 조인하고 list타입으로 저장할거, 근데 list타입의 요소는 commentDto타입이다 !!라는 뜻임!!

 

++ configuration.xml에다가 별칭설정한것도 있엇음 ㅠㅠㅠ

<typeAliases>
    <typeAlias type="com.kosmo.springapp.onememo.service.LineCommentDTO" alias="commentDto"/>
</typeAliases>
<mappers>
	<mapper resource="onememo/mybatis/mapper/linecomments.xml"/>
</mappers>

+ Recent posts