자바 웹 의 Servlet 에 대한 심도 있 는 설명

15130 단어 javawebservlet
Servlet
1 Servlet 소개
Servlet 은 Sun 회사 가 동적 웹 을 개발 하 는 기술 이다.
Sun 은 이 API 에서 Servlet 라 는 인 터 페 이 스 를 제공 합 니 다.Servlet 프로그램 을 개발 하려 면 두 가지 작은 절 차 를 밟 아야 합 니 다.
  • 클래스 를 작성 하여 Servlet 인터페이스
  • 를 실현 합 니 다.
  • 개 발 된 자바 류 를 웹 서버 에 배치 합 니 다.
  • Servlet 인 터 페 이 스 를 실현 하 는 자바 프로그램 을 Servlet 이 라 고 합 니 다.
    2 HelloServlet
    일반적인 Maven 프로젝트 를 만 들 고 src 디 렉 터 리 를 삭제 합 니 다.이 빈 프로젝트 가 Maven 메 인 프로젝트 입 니 다.
    Maven 부자 프로젝트 에 대한 이해:
    부모 항목 중 에
    
    <modules>
            <module>servlet-02</module>
        </modules>
    
    하위 항목 중 에
    
     <parent>
            <artifactId>javaweb-02-servlet</artifactId>
            <groupId>com.srx</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
    부모 항목 의 자바 하위 항목 을 직접 사용 할 수 있 습 니 다.
    
    son  extends father
    
    Maven 환경 최적화
  • 웹.xmd 를 최신 으로 수정
  • maven 의 구 조 를 완전 하 게 구축 했다.
  • Servlet 프로그램 만 들 기
    Servlet 맵 작성
    왜 맵 이 필요 합 니까?저 희 는 자바 프로그램 을 사용 하지만 브 라 우 저 를 통 해 방문 해 야 합 니 다.브 라 우 저 는 웹 서버 에 연결 해 야 합 니 다.그래서 저 희 는 웹 서비스 에 저희 가 쓴 Servlet 를 등록 하고 브 라 우 저 에 접근 할 수 있 는 경 로 를 제공 해 야 합 니 다.
    
    <!--      servlet-->
        <servlet>
            <servlet-name>hello</servlet-name>
            <servlet-class>com.srx.HellowServlet</servlet-class>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>hello</url-pattern>
        </servlet-mapping>
    
    Tomcat 설정
    메모:프로젝트 발표 경 로 를 설정 하면 됩 니 다.
    테스트 오 크 시작
    3 Servlet 원리
    servlet 는 웹 서버 에서 호출 됩 니 다.wev 서버 는 브 라 우 저 요청 을 받 은 후에 다음 과 같 습 니 다.

    4 Mapping 문제
    Servlet 에서 맵 경 로 를 지정 할 수 있 습 니 다.
    
    

    一个Servlet 可以指定多个映射路径

    
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello1</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello3</url-pattern>
    </servlet-mapping>
    
    Servlet 에서 일반적인 맵 경 로 를 지정 할 수 있 습 니 다.
    
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
    
    기본 요청 경로
    
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    
    접두사 나 접두사 등 을 지정 합 니 다.
    
    <!--              
          : *           
    
    -->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.abc</url-pattern>
    </servlet-mapping>
    
    
    우선 순위 문제
    고유 한 맵 경로 우선 순위 가 가장 높 습 니 다.찾 지 못 하면 기본 처리 요청 으로 갑 니 다.
    
     <!--404-->
        <servlet>
            <servlet-name>error</servlet-name>
            <servlet-class>com.srx.Error</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>error</servlet-name>
            <url-pattern>/*</url-pattern>
        </servlet-mapping>
    
    5 servletContext
    웹 용 기 는 시작 할 때 모든 웹 프로그램 에 해당 하 는 ServletContext 대상 을 만 듭 니 다.이것 은 현재 웹 응용 프로그램 을 대표 합 니 다.
    1.데이터 공유
    내 가 이 Servlet 에 저장 한 데 이 터 는 다른 servlet 에서 얻 을 수 있다.
    데 이 터 를 저장 하 는 클래스
    
    public class test extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            //this.getInitParameter(); //     
            //this.getServletContext(); // servlet    
            //this.getServletConfig();   servlet   
    
            ServletContext servletContext = this.getServletContext();
    
            String username="    ";
    
            //        ServletContext      uesrname     username
            servletContext.setAttribute("username",username);
    
            System.out.println("hello");
        }
    
    
    }
    
    출력 클래스
    
    public class show  extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext servletContext = this.getServletContext();
    
            resp.setContentType("text/html");
            resp.setCharacterEncoding("utf-8");
    
    
            String username = (String) servletContext.getAttribute("username");
    
            resp.getWriter().print("  :"+username);
    
        }
    }
    
    설정 파일
    
     <servlet>
             <servlet-name>test</servlet-name>
             <servlet-class>com.srx.test</servlet-class>
         </servlet>
    
       <servlet-mapping>
           <servlet-name>test</servlet-name>
           <url-pattern>/test</url-pattern>
       </servlet-mapping>
        
        <servlet>
            <servlet-name>getc</servlet-name>
            <servlet-class>com.srx.show</servlet-class>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>getc</servlet-name>
            <url-pattern>/getc</url-pattern>
        </servlet-mapping>
    
    테스트 접근 결과
    2.초기 화 매개 변수 가 져 오기
    
    <!--        web      -->
        <context-param>
          <param-name>url</param-name>
            <param-value>JDBC:mysql//localhost:3306/mybatis</param-value>
      </context-param>
    
    
    테스트 클래스
    
    public class context extends HttpServlet {
    
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext Context = this.getServletContext();
    
            String url = Context.getInitParameter("url");
    
           resp.getWriter().print(url);
        }
    }
    
    
    경로
    
     <servlet>
            <servlet-name>url</servlet-name>
            <servlet-class>com.srx.context</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>url</servlet-name>
            <url-pattern>/url</url-pattern>
        </servlet-mapping>
    
    3.리 트 윗 요청
    
    public class ServletDemo extends HttpServlet {
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("       ");
            ServletContext context = this.getServletContext();
    //        RequestDispatcher zf = context.getRequestDispatcher("zf");   //     
    //        zf.forward(req,resp);   //  forward        
    
            //  
            context.getRequestDispatcher("/getc").forward(req,resp);
    
    
        }
    }
    
    
        <servlet>
            <servlet-name>zzz</servlet-name>
            <servlet-class>com.srx.ServletDemo</servlet-class>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>zzz</servlet-name>
            <url-pattern>/zzz</url-pattern>
        </servlet-mapping>
    

    4.자원 파일 읽 기
    properties
  • 자바 디 렉 터 리 에 properties 새로 만 들 기
  • zairesource 디 렉 터 리 에 새 properties
  • 발견:같은 경로 로 포장 되 었 습 니 다.classes 우 리 는 이 경 로 를 classpath 라 고 부른다.
    아이디어:파일 흐름 이 필요 합 니 다.
    
    public class ServletDemo1 extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
            Properties prop = new Properties();
            prop.load(is);
            String user = prop.getProperty("username");
            String pwd = prop.getProperty("password");
    
            resp.getWriter().print(user+":"+pwd);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    
    반사
    
       <servlet>
            <servlet-name>bbb</servlet-name>
            <servlet-class>com.srx.ServletDemo1</servlet-class>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>bbb</servlet-name>
            <url-pattern>/bbb</url-pattern>
        </servlet-mapping>
    
    6、HttpServletResponse
    웹 서버 는 클 라 이언 트 의 http 요청 을 받 았 습 니 다.이 요청 에 대해 요청 을 대표 하 는 HttpServletRequest 대상 을 만 들 지 마 십시오.응답 하 는 HttpServletResponse 를 대표 합 니 다.
  • 클 라 이언 트 가 요청 한 인 자 를 가 져 오 면 httpServletRequest
  • 를 찾 습 니 다.
  • 클 라 이언 트 에 응답 하려 면 HttpServletResponse 를 찾 으 십시오.
  • 1 파일 다운로드
    브 라 우 저 에 정보 출력
    2 파일 다운로드
  • 다운로드 파일 을 가 져 올 경로
  • 다운로드 한 파일 이름 이 무엇 입 니까
  • 브 라 우 저가 우리 가 필요 로 하 는 것 을 다운로드 할 수 있 도록 방법 을 설정 합 니 다
  • 다운로드 파일 의 입력 흐름 가 져 오기
  • 버퍼 생 성
  • Output Stream 대상 획득
  • FileOutputStream 흐름 을 Buffer 버퍼 에 기록 합 니 다
  • OutputStream 을 사용 하여 버퍼 에 있 는 데 이 터 를 클 라 이언 트 에 출력 합 니 다.
  • 케이스
    
    public class FileServlet  extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //    -           
            String realPath = "D:\\      \\javaweb-02-servlet\\response\\target\\classes\\111.png";
            System.out.println("       "+realPath);
    //    -         
            String substring = realPath.substring(realPath.lastIndexOf("\\") + 1);
    //    -                      
            resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(substring,"utf-8"));
    //    -           
            FileInputStream in = new FileInputStream(realPath);
    //    -      
            int len = 0;
            byte[] buffer=new byte[1024];
    //    -   OutputStream  
            ServletOutputStream outputStream = resp.getOutputStream();
    //    -  FileOutputStream    Buffer      OutputStream              
            while ((len=in.read(buffer))>0){
                outputStream.write(buffer,0,len);
            }
            in.close();
            out.close();
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           doGet(req, resp);
        }
    }
    
    3.랜 덤 으로 리 셋 된 인증 코드 그림
    
    public class ImgServlet  extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            //    2     ;
            resp.setHeader("refresh","0.5");
    
            //          
            BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
            //    
            Graphics2D g = (Graphics2D) image.getGraphics();  // 
            //         
            g.setColor(Color.white);
            g.fillRect(0,0,80,20);
            //      
            g.setColor(Color.BLUE);
            g.setFont(new Font(null,Font.BOLD,20));
            g.drawString(makeNum(),0,20);
    
            //               
            resp.setContentType("image/jpeg");
            //      ,       
            resp.setDateHeader("expires",-1);
            resp.setHeader("Cache-Control","no-cache");
            resp.setHeader("Pragma","no-cache");
    
            //        
            ImageIO.write(image,"jpg", resp.getOutputStream());
        }
    
        private String makeNum() {
            Random random = new Random();
            String num=random.nextInt(9999999)+"";
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i <7-num.length(); i++) {
                sb.append("0");
            }
            num =sb.toString()+num;
             return  num;
        }
    
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    4.방향 을 바꾼다
    b.하나의 웹 자원 이 클 라 이언 트 a 의 요청 을 받 은 후에 b.그 는 a 클 라 이언 트 에 게 다른 웹 자원 c 를 방문 하 라 고 알 렸 다.이 과정 을 재 설정 이 라 고 한다.
    흔 한 장면:
    사용자 로그 인
    
    void sendRedirect(String var1) throws IOException;
    
    테스트:
    
    public class RedirectServlet  extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    //        //    
    //        resp.setHeader("Location","/rr/img");
    //        resp.setStatus(302);
    
            //   
            resp.sendRedirect("/rr/img");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    면접 문제:리 셋 과 리 트 윗 의 차 이 를 말씀 해 주 시 겠 어 요?
    같은 점:
  • 페이지 가 모두 점프 를 실현 합 니 다.
  • 다른 점:
  • 리 트 윗 을 요청 할 때 url 은 변 하지 않 습 니 다
  • 방향 을 바 꿀 때 url 주소 표시 줄 이 바 뀌 었 습 니 다.
  • 총결산
    자바 웹 의 Servlet 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 웹 의 Servlet 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기