Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(1) - 기본 세팅하기
Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(1) - 기본 세팅하기
이제 클라이언트의 요청과 응답을 받을 컨트롤러 서블릿을 만든다.
-UsersController.java
ackage com.cos.blog.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.cos.blog.action.Action;
import com.cos.blog.action.user.UsersJoinAction;
import com.cos.blog.action.user.UsersJoinProcAction;
//http://localhost:8000/blog/user
@WebServlet("/user")
public class UsersController extends HttpServlet {
private static final long serialVersionUID = 1L;
private final static String TAG="UsersController : ";
public UsersController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//http://localhost:8000/blog/user?cmd=join
String cmd=request.getParameter("cmd");
System.out.println(TAG+"router : "+cmd);
Action action=router(cmd);
action.execute(request, response);
}
public Action router(String cmd) {
if(cmd.equals("join")) {
return new UsersJoinAction();
}else if(cmd.equals("joinProc")) {
//회원가입 진행 후 -> index.jsp 이동
return new UsersJoinProcAction();
}else if(cmd.equals("update")) {
//회원 수정 페이지 이동(세션에 user object를 가지고 있을 예정)
}else if(cmd.equals("updateProc")) {
//회원 수정 진행 -> index 이동
}else if(cmd.equals("delete")) {
//회원 삭제 진행 후 -> 로그아웃 -> index.jsp
}else if(cmd.equals("login")) {
//회원 로그인 페이지로 이동
}else if(cmd.equals("loginProc")) {
//로그인 수행 -> 세션 등록 -> index.jsp
}
return null;
}
}
요청 받는 모든 것을 일단 프로세스로 보낸다. 프로세스에서 라우터로 보내서 받은 쿼리문(cmd= ???) 에 따라 다른 곳으로 이동시키는 코드를 작성할 것이다.
그 전에, 라우터에서 모든 일을 해결하면 라우터가 점점 라우터로서의 역할이 희미해진다. 그렇기 때문에 라우터는 연결통로의 역할만 하고, 역할은 action 에서 해결하도록 한다.
그런데 액션에서 역할을 하려면, 요청과 응답을 반드시 받아야 하는 공통점이 있다. 이것을 공통적으로 코드를 줄이고 효율성을 높이기 위해 action 인터페이스를 만든다.
-Action.java
package com.cos.blog.action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Action {
public void execute(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException;
}
이제 인터페이스를 상속해서 회원가입 페이지를 띄우는 코드를 보자.
-UsersJoinAction.java
package com.cos.blog.action.user;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.cos.blog.action.Action;
public class UsersJoinAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher dis=request.getRequestDispatcher("user/join.jsp");
dis.forward(request, response);
}
}
인터페이스를 상속받은 클래스는 요청과 응답을 필수적으로 받게 되고, 회원가입 페이지로 가게 된다.
또, 회원가입 페이지로 가고 싶다는 요청뿐만 아니라, 입력받은 값을 DB에 넣고 회원가입의 성패 여부, 또 성공했다면 홈페이지로 돌려줄 코드도 필요하다. 회원가입을 진행하는 코드를 보자.
-UsersJoinProcAction.java
package com.cos.blog.action.user;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.User;
import com.cos.blog.action.Action;
import com.cos.blog.model.RoleType;
import com.cos.blog.model.Users;
import com.cos.blog.repository.UsersRepository;
import com.cos.blog.util.Script;
public class UsersJoinProcAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//0. 유효성 검사
if(
request.getParameter("username").equals("")||
request.getParameter("username")==null||
request.getParameter("password").equals("")||
request.getParameter("password")==null||
request.getParameter("email").equals("")||
request.getParameter("email")==null||
request.getParameter("address").equals("")||
request.getParameter("address")==null
) {
return ;
}
//1. 파라메터 받기(x-www-form-urlencoded mime type -> key = value)
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
String address=request.getParameter("address");
String userRole=RoleType.USER.toString();
//2. User 오브젝트 변환
Users user=Users.builder()
.username(username)
.password(password)
.address(address)
.email(email)
.userRole(userRole)
.build();
//3. DB 연결 - Repository save 호출
UsersRepository usersRepository=UsersRepository.getInstance();
int result=usersRepository.save(user);
//4. index.jsp 페이지 이동
if(result==1) {
RequestDispatcher dis=request.getRequestDispatcher("index.jsp");
}else {
Script.back("회원가입에 실패하셨습니다.", response);
}
}
}
먼저 유효성 검사를 한다. 값이 비어있으면 회원가입을 실패할 수 있도록.
그리고 입력받은 값을 key=vaule으로 받아서 bulider(이것도 lombok의 기능이다.)을 이용해 모델에 값을 채워넣는다.
그리고 아까 입력한, DB에 연결해 줄 클래스를 호출하고, 호출한 클래스 속의 sava 함수를 이용해 데이터베이스에 값을 넣는다.
대신 주의할 점이 있다.
다른 페이지로 갈 때, 절대 redirect로 돌아가도록 하지 않도록 한다. 돌아가게 될 경우 이 같은 경우는 내가 어떤 경로에 어떤 파일을 넣어두었는지 그대로 노출되게 되므로, 위험하다.
또, 회원가입이 실패했을 때 다음과 같은 코드를 쓰는 것이 좋다.
-Script.java
package com.cos.blog.util;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
public class Script {
public static void back(String msg, HttpServletResponse response) {
try {
PrintWriter out=response.getWriter();
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
out.println("<script>");
out.println("alert('"+msg+".');");
out.println("history.back();");
out.println("</script>");
}catch (Exception e) {
// TODO: handle exception
}
}
}
history.back 함수를 사용해서 돌아가면 입력한 정보가 그대로 돌아가게 되지만, 재요청을 하게 될 경우 입력한 값이 남지 않기 때문에 불편한 코드가 된다.
이제 save 함수를 수정해보자.
-UsersResponsitory.java
public int save(Users user) {
final String SQL="insert into users (id,username,password,email,address,userrole,createdate) values(USER_SEQ.nextval,?,?,?,?,?,sysdate) ";
try {
conn=DBConn.getConnection();
pstmt = conn.prepareStatement(SQL);
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
pstmt.setString(3, user.getEmail());
pstmt.setString(4, user.getAddress());
pstmt.setString(5, user.getUserRole());
return pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
System.out.println(TAG+"save : "+e.getMessage());
}finally {
DBConn.close(conn, pstmt);
}
return -1;
}
postman을 통해 결과값이 들어가는 것을 확인하면,
결과가 데이터베이스에 깔끔하게 들어가는 것을 확인할 수 있다.
Next --
Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(3) - 부트스트랩을 이용한 웹 폼 만들기
'JSP' 카테고리의 다른 글
Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(4) - 로그인 하기 (0) | 2020.05.29 |
---|---|
Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(3) - 부트스트랩을 이용한 웹 폼 만들기 (0) | 2020.05.29 |
Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(1) - 기본 세팅하기 (0) | 2020.05.28 |
1. JSP지시어 (0) | 2020.05.27 |
Forwarding (0) | 2020.05.27 |