삭제할 땐 특정 인덱스 번호를 넣어줘
?: get방식에서 파라메터를 의미
<td>${stat.index }</td>
<td>${todo}</td>
<!-- REMOVE라는 요청주소로 IDX라는 파라메터 이름으로 값으로 전송, POST로 명시되지않았으니까 GET방식-->
<td><a href="remove?idx=${stat.index }">삭제</a></td>
doGet방식으로 이미 하나를 처리하고 있었는데 요청 주소 하나 더 추가하고 싶을 땐?
if문이나 switch문이용해서 uri구해서 처리하기
밑에 처럼
String uri = req.getRequestURI();
String ctx = req.getContextPath();
String addr = uri.substring(ctx.length());
System.out.println(addr);
if(addr.equals("/")) {
} else {
}
컨트롤러에 왓다 -> 모델을 사용할거다 -> 모델 객체화는 get방식 위에 올려놓고 할거임
msg를 보내면 alert로 "정상적으로 삭제되었습니다"를 듸우는
여러 사람이 원본을 사용하던 중 값을 수정하거나 하면 안되니까 -> vector 사용함
내가 사용하고 있을 때
서버오류뜰 때, 8005나 8080을 이미 사용중이라고 뜰 때
에 들어가서 port를 8006이나 8081로 바꾸거나
컴퓨터 껐다 켜기
글 작성, 수정같은거 할 땐 post로 ! (url에 안타나니까, 나타나면 너무 길어지잖아)
오류 찾기 꿀tip
맨 위로 올라가서 맨 오른쪽을 봐라
//wrtie라는 이름으로 3개의 파라메터가 날라가는지부터 확인
객체화하면서 들어갈 내용을 넣어줄 수 있다고
필드에는 이것만 들어갈거야 라고 지정해주는거임(여러개 지정해주니까 유연한거임)
제너릭 : 데이터 타입을 강제화하는거 , 마음대로 바꿀 수 있다(객체화할 때 바꾸면 된대)
클래스를 객체화한다음에 그걸 ArrayList의 매개변수에 넣어
여기서 수정 부분 코드리뷰
- list.jsp
<tr>
<td>${stat.index}</td>
<td>
<input type="text" name="todo" value = "${todo}"/>
</td>
<td>
<button onclick = "update(${stat.index }, this)">수정</button>
</td>
<td>
<a href="remove?idx=${stat.index }">삭제</a>
</td>
</tr>
//중략
<script>
function update(idx, elem) { //idx라는 이름으로 ${stat.index } 값을 가져온 것
console.log(idx, elem);
var val = $(elem).closest('tr').find('input[name="todo"]').val();
console.log(idx,val);
location.href = 'update?idx='+idx+ '&todo='+val;
}
</script>
버튼태그에 onclick 속성을 이용하여 update이벤트를 걸어주었다. 인자값으로는 el태그를 걸어 가져온 stat의 index값과 this 값을 넣어줬다.
update 함수를 보면 매개변수 값으로 idx와 elem을 가지고 있다. 그래서 우린 idx 이름으로 el태그를 건 stat의 index값을 가져왔고 elem이라는 이름으로는 this를 가져왔다
이 elem이라는 객체의 한마디로 버튼 태그의 가장 가까운 tr의 자식객체중 name이 todo인 input 태그의 값을 가져와서 val 이라는 변수에 넣어줬습니다. 이 값은 저희가 수정한 값이 되는데요
location 객체의 href 속성을 통해 이동할 주소를 넣어줬습니다. 그래서 저희는 update 페이지로 이동하면서 idx의 값은 idx로 todo의 값은 val에 넣어 함께 이동했습니다
그래서 update 페이지로 이동을 해보면
- VectorController.java
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
dual(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
dual(req,resp);
}
//get으로도 올 수 있고 post로도 올 수 있는 애들은 이 메서드에서 처리해서 코드 중복을 줄일 거임
private void dual(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
VectorModel model = new VectorModel();
String uri = req.getRequestURI();
String ctx = req.getContextPath();
String addr = uri.substring(ctx.length());
System.out.println(addr);
//여기로
if( addr.equals("/")) {
RequestDispatcher dis = req.getRequestDispatcher("list.jsp");
req.setAttribute("list", model.getList());
dis.forward(req, resp);
}
if(addr.equals("/update")) {
String idx = req.getParameter("idx");
String todo = req.getParameter("todo");
model.listUpdate(idx,todo);
resp.sendRedirect(ctx); //여기에서
}
get으로도 올 수 있고 post로도 올 수 있는 애들이 있으면 중복코드가 생긴다 이를 방지하기 위해 dual 메서드를 호출하고 이 안에서 if문과 uri를 통해 요청한 페이지를 구분하면서 로직을 처리한다. 만약 addr이 /update와 같다면 location.href = 'update?idx='+idx+ '&todo='+val; 이 값을 받기 위해 idx와 todo를 getParameter를 통해 가져온 후 변수에 넣어줍니다
이후 model클래스의 listUpdate 메서드를 통해 매개변수값으로 idx와 todo를 넣어주고 resp.sendRedirect(ctx); response객체의 sendRedirect 속성을 통해 ctx, 즉 주소값이 "/"인 페이지로 이동합니다.이후 list.jsp로 이동하는데 request객체의 속성을 list라는 이름으로 model.getlist() 메서드 값을 저장해줍니다. model.getlist()메서드로 이동하면
- VectorModel.java
package kr.co.web.model;
import java.util.Vector;
public class VectorModel {
private static Vector<String> vector = new Vector<String>();
//private 걸어서 이제 이 객체의 메서드를 통해서만 접근 가능-> 캡슐화
//private 이유 : 원본영역에 저장하려고 왜? static을 걸지않으면 복사본이 계속 만들어
public void listAdd(String todo) {
vector.add(todo);
}
public Vector<String> getList(){
return vector;
}
public void listRemove(int idx) {
String value = vector.remove(idx);
System.out.println("removed : " + value);
}
public void listUpdate(String idx, String todo) {
vector.set(Integer.parseInt(idx), todo); //(대상인덱스, 바꿀 값) : 이전 값
}
여기서 getList 메서드를 보면 return값으로 vector를 주고있음 그럼 이 vector값은 다시 controller로 이동해서 "list"라는 이름으로 저장이 되고 그게 dis객체의 forward 속성을 통해 list.jsp로 다시 보내지고 있음