MVC 구조 (1) JSP + Servlet + JDBC 구 조 를 구축 하 는 웹 프로젝트

26015 단어
프로젝트 소개
간단 한 자바 웹 프로젝트 는 MVC 구 조 를 통 해 사용자 와 데이터 의 상호작용 을 실현 하 는 효과 로 요약 할 수 있다.한편, 자바 웹 프로젝트 의 MVC 구 조 는 이미 매우 성숙 하여 최초의 servlet + jsp + jdbc 에서 SSH 프레임 워 크 에 이 르 기 까지 현재 매우 유행 하 는 SSM 프레임 워 크 입 니 다.본 고 는 JSP 를 V (view) 층 으로, servlet 를 C (controller) 층 으로, JDBC 를 M (model) 층 으로 하여 원시 자바 웹 프로젝트 를 구축 하고 체험 하고 자 한다.
프로젝트 구 조 를 구축 하 다.
  • 1.http://blog.csdn.net/lk7688535/article/details/77480148말 했 듯 이 Maven 을 사용 하여 웹 프로젝트 를 구축 하 는 토대 에서 우리 의 프로젝트 개발 을 시작 합 니 다.
  • 2. servlet 의 jar 가방 을 도입 하여http://maven.aliyun.comservlet 와 my sql - jdbc 를 검색 하여 dependency 를 pom. xml 로 복사 합 니 다.
  • < dependency>
     < groupId>javax.servletgroupId>
     <artifactId>javax.servlet-apiartifactId>
      <version>4.0.0version>
     dependency>
    
     <dependency>
      <groupId>mysqlgroupId>
      <artifactId>mysql-connector-javaartifactId>
      <version>5.1.10version>
    dependency>
  • 3. main / java 에서 com. leetech. action, com. leetech. dao, com. leetech. service, com. leetech. bean, com. leetech. util 다섯 개의 가방 을 만 듭 니 다.action 패 키 지 는 사용자 가 요청 한 servlet 류, service 패 키 지 는 업무 처리 논리, bean 패 키 지 는 자바 bean, dao 패 키 지 는 jdbc 와 데이터 베 이 스 를 저장 하 는 상호작용, util 은 도구 류 파일 을 저장 합 니 다.

  • 프론트 에서 백 스테이지 까지
    로그 인 요청 실현
  • 4. jsp 페이지 를 작성 하고 그 안에 form 폼 을 넣 어 사용자 의 요청 을 백 엔 드 로 처리 합 니 다.
  • class="form-signin" role="form" action="userLoginAction" method="post"> type="text" name="username" class="form-control" placeholder=" " required autofocus /> type="password" name="password" class="form-control" placeholder=" " required />
  • 5. servlet 류 를 써 서 로그 인 요청 을 처리 합 니 다. 이 servlet 류 는 추상 적 인 HttpServlet 류 를 계승 해 야 합 니 다.

  • 이 클래스 에서 ctrl + o 를 두 번 누 르 면 부모 클래스 (HttpServlet) 의 속성 과 방법 을 볼 수 있 습 니 다.
    단축 키 alt + shift + s 를 통 해 Override / Implement Methods 를 선택 하면 부모 클래스 의 방법 을 선택 하여 재 작성 하거나 실현 할 수 있 습 니 다.
    일반적으로 doGet, doPost, service, init 와 destroy 방법 을 다시 쓸 수 있 습 니 다.
    service 방법 은 인터페이스 에 있 는 방법 입 니 다. servlet 용 기 는 모든 요청 을 이 방법 으로 보 냅 니 다. 이 방법 은 http 요청 을 doXXX 방법 으로 전송 하 는 것 입 니 다. 이 방법 을 다시 불 러 오 면 기본 동작 이 덮어 쓰 이 고 퍼 가기 작업 을 하지 않 습 니 다!
    현재 클 라 이언 트 가 pos 든 get 으로 이 servlet 을 요청 하 든 service 방법 은 service 방법 만 실행 할 수 있 고 doPost 나 doGet 방법 을 실행 하지 않 습 니 다.
    get 한자 의 전 삼 에 사용 할 수 없습니다.
        private static final long serialVersionUID = 1L;
        public UserLoginAction(){
            System.out.println("LoginServlet    ");
        }
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("servlet doGet");
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("servlet doPost");
        }
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            System.out.println("  servlet service");
            req.setCharacterEncoding("utf-8"); 
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            System.out.println("            "+username+password);
            //req.getRequestDispatcher("/subinfo.jsp").forward(req, resp);
             resp.sendRedirect("/MavenWeb/subinfo.jsp");
        }
        @Override
        public void init() throws ServletException {
            System.out.println("servlet   ");
        }
        @Override
        public void destroy() {
            System.out.println("servlet   ");
        }

    처리 요청 의 마지막 코드:
        //req.getRequestDispatcher("/subinfo.jsp").forward(req, resp);
         resp.sendRedirect("/MavenWeb/subinfo.jsp");

    요청 을 처리 한 후 점프 하 는 방식 은 두 가지 가 있 습 니 다. redirect (리 셋) 와 forward (리 트 윗) 입 니 다.
    redirect: 서버 가 request 를 받 은 후 클 라 이언 트 브 라 우 저 에 상태 헤더 요청 을 보 냅 니 다. 두 번 의 요청 에 해당 합 니 다. 페이지 를 모든 페이지 로 옮 길 수 있 습 니 다. 이 웹 응용 에 국한 되 지 않 습 니 다.
    forward: 이 웹 애플 리 케 이 션 의 페이지 로 만 이동 할 수 있 습 니 다. 점프 후 브 라 우 저 주소 표시 줄 은 변 하지 않 습 니 다. 퍼 가기 요청, 즉 앞 뒤 페이지 에서 하나의 request 를 공유 하 는 것 은 서버 에서 실 행 됩 니 다.
    6. 이 servlet 를 웹. xml 에 등록 합 니 다.
    <servlet>
        <servlet-name>loginServletservlet-name>
        <servlet-class>com.leetech.action.UserLoginActionservlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>loginServletservlet-name>
        <url-pattern>/userLoginActionurl-pattern>
    servlet-mapping>

    servlet 3.0 은 주 해 를 제공 합 니 다. servlet 클래스 에 직접 쓸 수 있 습 니 다.
    @WebServlet("/userSubinfoAction")
    public class UserLoginAction extends HttpServlet{...}
    //  :
    @WebServlet(name="loginAction",urlPatterns="/userSubinfoAction")
  • 7. servlet 3.0 파일 업로드
  • 초기 servlet 에 서 는 파일 업로드 가 지원 되 지 않 습 니 다. comons - fileUpload 와 comons - io 의 jar 패키지 가 필요 합 니 다. servlet 3.0 버 전 은 파일 업로드 기능 을 통합 하 였 습 니 다. 절 차 는 다음 과 같 습 니 다. (1) jsp 의 form 태그 가입
    enctype=”multipart/form-data”
    (2) 폼 에 업로드 파일 요 소 를 추가 합 니 다.
    "photoFile" type="file" id="inputfile" class="col-sm-4">
    

    (3) servlet 클래스 를 등록 할 때의 설정: 주 해 를 통 해 등록 하면 클래스 에 @ MultipartConfig 를 추가 하고 xml 를 통 해 등록 하면 servlet 탭 에 가입 해 야 합 니 다.
     <multipart-config>multipart-config>  

    두 설정 모두 파일 의 기본 업로드 경로, 단일 파일 의 최대 값, 모든 파일 의 최대 값 등 속성 을 설정 할 수 있 습 니 다.(4) servlet 클래스 는 업 로드 된 파일 을 받 아 저장 합 니 다.
    //               :
    Part part = req.getPart("photoFile");
    part.write( "F:/picture.png");
    //                
    part.getSize();//    
    part.getContentType();//    
    part.getHeader("content-disposition");//form-data; name="photoFile"; filename="mavenWeb     .png"

    배경 에서 데이터베이스 까지
    사용자 등록 실현
  • 8. 전단 에 사용자 정 보 를 기입 한다.
  •     <form class="form-horizontal" enctype="multipart/form-data"  role="form" action="userSubinfoAction" method="post">
         <div class="form-group">
            <label for="inputName" class="col-sm-2 control-label">  label>
            <div class="col-sm-4">
                <input name="name" type="text" class="form-control" id="inputName" placeholder="       ">
            div>
        div>
         <div class="form-group">
             <label for="inputName" class="col-sm-2 control-label">  label>
                <label class="radio-inline">
            <input type="radio" name="sex"  value="man" checked>  
        label>
        <label class="radio-inline">
            <input type="radio" name="sex"   value="woman">  
        label>
            div>
        <div class="form-group">
            <label  class="col-sm-2 control-label">  label>
            <select class=" col-sm-4" name="country">
                <option>  option>
                <option>  option>
                <option>  option>
                <option>  option>
                <option>  option>
            select>
        div>
    
          <div class="form-group">
            <label class="col-sm-2 control-label" for="inputfile">    label>
            <input name="photoFile" type="file" id="inputfile" class="col-sm-4">
        div>
            <button class="btn btn-lg btn-warning btn-block" type="submit">  button>
        form>
    
    
  • 9. Servlet 은 전단 에서 제출 한 정 보 를 가 져 옵 니 다
  • @WebServlet("/userSubinfoAction")
    @MultipartConfig
    public class UserSubinfoAction extends HttpServlet{
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            String savePath = req.getServletContext().getRealPath("/WEB-INF/uploadFile");
            System.out.println(savePath);
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
            Part part = req.getPart("photoFile");
            String header = part.getHeader("content-disposition");
            System.out.println(header);
            part.write("F:/s.png");
            User user = new User();
            user.setUserName(req.getParameter("name"));
            user.setSex(req.getParameter("sex"));
            user.setCountry(req.getParameter("country"));
            user.setPhotoFile("F:/s.png");
            new UserService().subInfo(user);
        }
    }
  • 10. 데 이 터 를 업무 층 에 제출 하여 처리 합 니 다.
  • new UserService().subInfo(user);
    

    서비스 층 에 새 UserService 클래스 를 만 들 면 제출 한 데 이 터 를 처리 할 수 있 습 니 다.
    public class UserService {
            public void subInfo(User user){
                new UserDao().savaUser(user);
            }
    }
    
  • 11. 데 이 터 를 dao 층 에 제출 하여 데이터 베이스 와 상호작용 을 하 는 데 사용 합 니 다.
  • new UserDao().savaUser(user);
    

    dao 층 에 새 UserDao 클래스 를 만 들 고 방법 에서 데이터베이스 와 데이터 상호작용 을 하 는 데 사용 합 니 다.
        public void savaUser(User user){
            Connection conn = DBConnect.getConn();
    
            String sql = "insert into user (username,sex,country,photo_file) values(?,?,?,?)";
            PreparedStatement pstmt;
            try {
                pstmt = (PreparedStatement) conn.prepareStatement(sql);
                pstmt.setString(1, user.getUserName());
                pstmt.setString(2, user.getSex());
                pstmt.setString(3, user.getCountry());
                pstmt.setString(4, user.getCountry());
               int i = pstmt.executeUpdate();
             if(i==1){
                 System.out.println("    ");
             }else System.out.println("  ");
                pstmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    DBConnect 클래스:
    public class DBConnect {
        public static Connection getConn() {
            String driver = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://localhost:3306/MavenWeb";
            String username = "root";
            String password = "root";
            Connection conn = null;
            try {
                Class.forName(driver); //classLoader,      
                conn = (Connection) DriverManager.getConnection(url, username, password);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return conn;
        }
    }
    

    전체 등 록 된 업무 절 차 는 지금까지 실현 되 었 습 니 다. 주로 프레임 워 크 를 신속하게 구축 하기 위해 기록 하고 작은 tips 도 삽입 되 었 습 니 다. 이번 기록 은 여기까지 입 니 다.
    tips:
    어떤 게 get 방식 인가요?
    form 기본 제출 방식
    어떤 게 포스트 방식 인가요?
    form 에 method = "post" 를 표시 할 때 ajax 가 post 방식 을 지정 할 때
    others
    doGet () 또는 doPost () 를 실행 하기 전에 service () 를 먼저 실행 합 니 다.
    service () 방법 으로 판단 합 니 다. doGet () 을 호출 해 야 합 니까? doPost () 를 호출 해 야 합 니까?
    Serlvet 는 하나의 인 스 턴 스 입 니 다. (init 와 구조 방법 은 한 번 만 실 행 됩 니 다)

    좋은 웹페이지 즐겨찾기