유효성 검증은 주말에 수정해야 함... !!!!!
해당 블로그에 정보 남겨놨으니 까먹 지 말자!!
어제 만들어놓은 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">×</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>
'학원 > SPRING' 카테고리의 다른 글
12/15 65-1 [SPRING] 주말에 할 것 +delete/edit (1) | 2022.12.15 |
---|---|
12/14 64-2 [SPRING] 게시판(댓글처리)-수정해야함 (0) | 2022.12.14 |
12/13 63-1 [SPRING] 게시판(설정/회원여부/List) (0) | 2022.12.13 |
12/12 62-4 [SPRING] 게시판만들기 3 (환경설정-mybatis개념) (0) | 2022.12.13 |
12/12 62-3 [SPRING] Validation(내용변경) (0) | 2022.12.12 |