<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                Servlet技術應用核心節點訓練 1.掌握HttpServlet中的主要方法 2.掌握HttpRequest,HttpResponse的應用 3.掌握ServletConfig對象和ServletContext對象的概念 #### **2.1、Servlet簡介** Servlet就是sun公司開發動態web的一門技術 Sun在這些API中提供一個接口叫做:Servlet,如果你想開發一個Servlet程序,只需要完成兩個小 步驟: * 編寫一個類,實現Servlet接口 * 把開發好的Java類部署到web服務器中。 **把實現了Servlet接口的Java程序叫做Servlet** #### **2.2、HelloServlet** Serlvet接口Sun公司有兩個默認的實現類:HttpServlet,GenericServlet 1.構建一個普通的Maven項目,刪掉里面的src目錄,以后我們的學習就在這個項目里面建立Moudel;這個空的工程就是Maven主工程; 2.關于Maven父子工程的理解: 父項目中會有 ``` ? ?<modules> ? ? ? ?<module>servlet-01</module> ? ?</modules> ``` 子項目會有 ``` ? ?<parent> ? ? ? ?<artifactId>javaweb-02-servlet</artifactId> ? ? ? ?<groupId>com.kuang</groupId> ? ? ? ?<version>1.0-SNAPSHOT</version> ? ?</parent> ``` 父項目中的java子項目可以直接使用 ``` son extends father ``` 3. Maven環境優化 >1. 修改web.xml為最新的 >2. 將maven的結構搭建完整 4. 編寫一個Servlet程序 ![](http://h.yiniuedu.com/823ed61f764521450a8dc9efd0a4066d) >1. 編寫一個普通類 >2. 實現Servlet接口,這里我們直接繼承HttpServlet ``` public class HelloServlet extends HttpServlet { ? ?//由于get或者post只是請求實現的不同的方式,可以相互調用,業務邏輯都一樣; ? ?@Override ? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ? ? ? ?//ServletOutputStream outputStream = resp.getOutputStream(); ? ? ? ?PrintWriter writer = resp.getWriter(); //響應流 ? ? ? ?writer.print("Hello,Serlvet"); ? } ? ?@Override ? ?protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ? ? ? ?doGet(req, resp); ? } } ``` 5. 編寫Servlet的映射 為什么需要映射:我們寫的是JAVA程序,但是要通過瀏覽器訪問,而瀏覽器需要連接web服務器, 所以我們需要再web服務中注冊我們寫的Servlet,還需給他一個瀏覽器能夠訪問的路徑; ``` ? ?<!--注冊Servlet--> ? ?<servlet> ? ? ? ?<servlet-name>hello</servlet-name> ? ? ? ?<servlet-class>com.kuang.servlet.HelloServlet</servlet-class> ? ?</servlet> ? ?<!--Servlet的請求路徑--> ? ?<servlet-mapping> ? ? ? ?<servlet-name>hello</servlet-name> ? ? ? ?<url-pattern>/hello</url-pattern> ? ?</servlet-mapping> ``` 6. 配置Tomcat 注意:配置項目發布的路徑就可以了 7. 啟動測試,OK! #### **2.3、Servlet原理** Servlet是由Web服務器調用,web服務器在收到瀏覽器請求之后,會: ![](http://h.yiniuedu.com/dd0c0c654f2ead7e40a3001c3944712d) #### **2.4、Mapping問題** 1.一個Servlet可以指定一個映射路 ``` ? ?<servlet-mapping> ? ? ? ?<servlet-name>hello</servlet-name> ? ? ? ?<url-pattern>/hello</url-pattern> ? ?</servlet-mapping> ``` 2. 一個Servlet可以指定多個映射路徑 ``` ? ?<servlet-mapping> ? ? ? ?<servlet-name>hello</servlet-name> ? ? ? ?<url-pattern>/hello</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-mapping> ? ? ? ?<servlet-name>hello</servlet-name> ? ? ? ?<url-pattern>/hello4</url-pattern> ? ?</servlet-mapping> ? ?<servlet-mapping> ? ? ? ?<servlet-name>hello</servlet-name> ? ? ? ?<url-pattern>/hello5</url-pattern> ? ?</servlet-mapping> ``` 3. 一個Servlet可以指定通用映射路徑 ``` ? ?<servlet-mapping> ? ? ? ?<servlet-name>hello</servlet-name> ? ? ? ?<url-pattern>/hello/*</url-pattern> ? ?</servlet-mapping> ``` 4. 默認請求路徑 ``` ? ?<!--默認請求路徑--> ? ?<servlet-mapping> ? ? ? ?<servlet-name>hello</servlet-name> ? ? ? ?<url-pattern>/*</url-pattern> ? ?</servlet-mapping> ``` 5. 指定一些后綴或者前綴等等…. ``` <!--可以自定義后綴實現請求映射 ? ?注意點,*前面不能加項目映射的路徑 ? ?hello/sajdlkajda.qinjiang ? ?--> <servlet-mapping> ? ?<servlet-name>hello</servlet-name> ? ?<url-pattern>*.qinjiang</url-pattern> </servlet-mapping> ``` 6. 優先級問題 指定了固有的映射路徑優先級最高,如果找不到就會走默認的處理請求; ``` <!--404--> <servlet> ? ?<servlet-name>error</servlet-name> ? ?<servlet-class>com.kuang.servlet.ErrorServlet</servlet-class> </servlet> <servlet-mapping> ? ?<servlet-name>error</servlet-name> ? ?<url-pattern>/*</url-pattern> </servlet-mapping> ``` #### **2.5、ServletContext** web容器在啟動的時候,它會為每個web程序都創建一個對應的ServletContext對象,它代表了當前的 web應用; **1、共享數據** 我在這個Servlet中保存的數據,可以在另外一個servlet中拿到; ``` public class HelloServlet extends HttpServlet { ? ?@Override ? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ? ? ? ?//this.getInitParameter() ? 初始化參數 ? ? ? ?//this.getServletConfig() ? Servlet配置 ? ? ? ?//this.getServletContext() Servlet上下文 ? ? ? ?ServletContext context = this.getServletContext(); ? ? ? ? String username = "秦疆"; //數據 ? ? ? ?context.setAttribute("username",username); //將一個數據保存在了 ServletContext中,名字為:username 。值 username } } ``` ``` public class GetServlet extends HttpServlet { ? ?@Override ? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ? ? ? ?ServletContext context = this.getServletContext(); ? ? ? ?String username = (String) context.getAttribute("username"); ? ? ? ?resp.setContentType("text/html"); ? ? ? ?resp.setCharacterEncoding("utf-8"); ? ? ? ?resp.getWriter().print("名字"+username); } ? ?@Override ? ?protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ? ? ? ?doGet(req, resp); ? } } ``` ``` ? ?<servlet> ? ? ? ?<servlet-name>hello</servlet-name> ? ? ? ?<servlet-class>com.kuang.servlet.HelloServlet</servlet-class> ? ?</servlet> ? ?<servlet-mapping> ? ? ? ?<servlet-name>hello</servlet-name> ? ? ? ?<url-pattern>/hello</url-pattern> ? ?</servlet-mapping> ``` ``` ? ?<servlet> ? ? ? ?<servlet-name>getc</servlet-name> ? ? ? ?<servlet-class>com.kuang.servlet.GetServlet</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> ``` ``` protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ? ?ServletContext context = this.getServletContext(); ? ?String url = context.getInitParameter("url"); ? ?resp.getWriter().print(url); } ``` **3、請求轉發** ``` @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ? ?ServletContext context = this.getServletContext(); ? ?System.out.println("進入了ServletDemo04"); ? ?//RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //轉發的請求路徑 ? ?//requestDispatcher.forward(req,resp); //調用forward實現請求轉發; ? ?context.getRequestDispatcher("/gp").forward(req,resp); } ``` ![](http://h.yiniuedu.com/149b412b4e385a0f4c590ce9aab80986) **4、讀取資源文件** Properties * 在java目錄下新建properties * 在resources目錄下新建properties 發現:都被打包到了同一個路徑下:classes,我們俗稱這個路徑為classpath: 思路:需要一個文件流; ``` username=root12312 password=zxczxczxc ``` ``` public class ServletDemo05 extends HttpServlet { ? ?@Override ? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ? ? ? ?InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/kuang/servlet/aa.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); ? } } ``` 訪問測試即可ok; #### **2.6、HttpServletResponse** web服務器接收到客戶端的http請求,針對這個請求,分別創建一個代表請求的HttpServletRequest對 象,代表響應的一個HttpServletResponse; 如果要獲取客戶端請求過來的參數:找HttpServletRequest 如果要給客戶端響應一些信息:找HttpServletResponse **1、簡單分類** 負責向瀏覽器發送數據的方法 ``` ServletOutputStream getOutputStream() throws IOException; PrintWriter getWriter() throws IOException; ``` 負責向瀏覽器發送響應頭的方法 ``` void setCharacterEncoding(String var1); void setContentLength(int var1); void setContentLengthLong(long var1); void setContentType(String var1); void setDateHeader(String var1,long var2); void addDateHeader(String var1,long var2); void setHeader(String var1,String var2); void addHeader(String var1,String var2); void setIntHeader(String var1,int var2); void addIntHeader(String var1,int var2); ``` 響應的狀態碼 ``` ? ?int SC_CONTINUE = 100; ? ?int SC_SWITCHING_PROTOCOLS = 101; ? ?int SC_OK = 200; ? ?int SC_CREATED = 201; ? ?int SC_ACCEPTED = 202; ? ?int SC_NON_AUTHORITATIVE_INFORMATION = 203; ? ?int SC_NO_CONTENT = 204; ? ?int SC_RESET_CONTENT = 205; ? ?int SC_PARTIAL_CONTENT = 206; ? ?int SC_MULTIPLE_CHOICES = 300; ? ?int SC_MOVED_PERMANENTLY = 301; ? ?int SC_MOVED_TEMPORARILY = 302; ? ?int SC_FOUND = 302; ? ?int SC_SEE_OTHER = 303; ? ?int SC_NOT_MODIFIED = 304; ? ?int SC_USE_PROXY = 305; ? ?int SC_TEMPORARY_REDIRECT = 307; ? ?int SC_BAD_REQUEST = 400; ? ?int SC_UNAUTHORIZED = 401; ? ?int SC_PAYMENT_REQUIRED = 402; ? ?int SC_FORBIDDEN = 403; ? ?int SC_NOT_FOUND = 404; ? ?int SC_METHOD_NOT_ALLOWED = 405; ? ?int SC_NOT_ACCEPTABLE = 406; ? ?int SC_PROXY_AUTHENTICATION_REQUIRED = 407; ? ?int SC_REQUEST_TIMEOUT = 408; ? ?int SC_CONFLICT = 409; ? ?int SC_GONE = 410; ? ?int SC_LENGTH_REQUIRED = 411; ? ?int SC_PRECONDITION_FAILED = 412; ? ?int SC_REQUEST_ENTITY_TOO_LARGE = 413; ? ?int SC_REQUEST_URI_TOO_LONG = 414; ? ?int SC_UNSUPPORTED_MEDIA_TYPE = 415; ? ?int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416; ? ?int SC_EXPECTATION_FAILED = 417; ? ?int SC_INTERNAL_SERVER_ERROR = 500; ? ?int SC_NOT_IMPLEMENTED = 501; ? ?int SC_BAD_GATEWAY = 502; ? ?int SC_SERVICE_UNAVAILABLE = 503; ? ?int SC_GATEWAY_TIMEOUT = 504; ? ?int SC_HTTP_VERSION_NOT_SUPPORTED = 505; ``` **2、下載文件** 1. 向瀏覽器輸出消息 (一直在講,就不說了) 2. 下載文件 >1. 要獲取下載文件的路徑 >2. 下載的文件名是啥? >3. 設置想辦法讓瀏覽器能夠支持下載我們需要的東西 >4. 獲取下載文件的輸入流 >5. 創建緩沖區 >6. 獲取OutputStream對象 >7. 將FileOutputStream流寫入到bu?er緩沖區 >8. 使用OutputStream將緩沖區中的數據輸出到客戶端! ``` @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ? ?// 1. 要獲取下載文件的路徑 ? ?String realPath = "F:\\班級管理\\西開【19525】\\2、代碼\\JavaWeb\\javaweb-02-servlet\\response\\target\\classes\\秦疆.png"; ? ?System.out.println("下載文件的路徑:"+realPath); ? ?// 2. 下載的文件名是啥? ? ?String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); ? ?// 3. 設置想辦法讓瀏覽器能夠支持(Content-Disposition)下載我們需要的東西,中文文件 名URLEncoder.encode編碼,否則有可能亂碼 ? ?resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8")); ? ?// 4. 獲取下載文件的輸入流 ? ?FileInputStream in = new FileInputStream(realPath); ? ?// 5. 創建緩沖區 ? ?int len = 0; ? ?byte[] buffer = new byte[1024]; ? ?// 6. 獲取OutputStream對象 ? ?ServletOutputStream out = resp.getOutputStream(); ? ?// 7. 將FileOutputStream流寫入到buffer緩沖區,使用OutputStream將緩沖區中的數據 輸出到客戶端! ? ?while ((len=in.read(buffer))>0){ ? ? ? ?out.write(buffer,0,len); ? } ? ?in.close(); ? ?out.close(); } ``` **3、驗證碼功能** 驗證怎么來的? 前端實現 后端實現,需要用到 Java 的圖片類,生產一個圖片 ``` package com.kuang.servlet; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; public class ImageServlet extends HttpServlet { ? ?@Override ? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ? ? ? ?//如何讓瀏覽器3秒自動刷新一次; ? ? ? ?resp.setHeader("refresh","3"); ? ? ? ?//在內存中創建一個圖片 ? ? ? ?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、實現重定向** ![](http://h.yiniuedu.com/352dc2f56deff0cba7cccced24580a82) B一個web資源收到客戶端A請求后,B他會通知A客戶端去訪問另外一個web資源C,這個過程叫重定向 常見場景: * 用戶登錄 ``` void sendRedirect(String var1) throws IOException; ``` 測試: ``` @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ? ?/* ? ? ? ?resp.setHeader("Location","/r/img"); ? ? ? ?resp.setStatus(302); ? ? ? ? */ ? ?resp.sendRedirect("/r/img");//重定向 } ``` 面試題:請你聊聊重定向和轉發的區別? 相同點 頁面都會實現跳轉 不同點 請求轉發的時候,url不會產生變化 重定向時候,url地址欄會發生變化; ![](http://h.yiniuedu.com/88b3cee80df1fbd0e5360cf10c228b0e) **5、簡單實現登錄重定向** ``` <%--這里提交的路徑,需要尋找到項目的路徑--%> <%--${pageContext.request.contextPath}代表當前的項目--%> <form action="${pageContext.request.contextPath}/login" method="get"> ? 用戶名:<input type="text" name="username"> <br> ? 密碼:<input type="password" name="password"> <br> ? ?<input type="submit"> </form> ? ?@Override ? ?protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ? ? ? ?//處理請求 ? ? ? ?String username = req.getParameter("username"); ? ? ? ?String password = req.getParameter("password"); ? ? ? ?System.out.println(username+":"+password); ? ? ? ?//重定向時候一定要注意,路徑問題,否則404; ? ? ? ?resp.sendRedirect("/r/success.jsp"); ? } ``` ``` ?<servlet> ? ?<servlet-name>requset</servlet-name> ? ?<servlet-class>com.kuang.servlet.RequestTest</servlet-class> ?</servlet> ?<servlet-mapping> ? ?<servlet-name>requset</servlet-name> ? ?<url-pattern>/login</url-pattern> ?</servlet-mapping> ``` ``` <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> ? ?<title>Title</title> </head> <body> <h1>Success</h1> </body> </html> ``` #### **2.7、HttpServletRequest** HttpServletRequest代表客戶端的請求,用戶通過Http協議訪問服務器,HTTP請求中的所有信息會被封 裝到HttpServletRequest,通過這個HttpServletRequest的方法,獲得客戶端的所有信息; ![](http://h.yiniuedu.com/16e72dfd0e4611064df1961437f2ae9c) **獲取參數,請求轉發** ![](http://h.yiniuedu.com/d5ec209f3b58c936c1a64831e74eef12) ``` @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ? ?req.setCharacterEncoding("utf-8"); ? ?resp.setCharacterEncoding("utf-8"); ? ?String username = req.getParameter("username"); ? ?String password = req.getParameter("password"); ? ?String[] hobbys = req.getParameterValues("hobbys"); ? ?System.out.println("============================="); ? ?//后臺接收中文亂碼問題 ? ?System.out.println(username); ? ?System.out.println(password); ? ?System.out.println(Arrays.toString(hobbys)); ? ?System.out.println("============================="); ? ?System.out.println(req.getContextPath()); ? ?//通過請求轉發 ? ?//這里的 / 代表當前的web應用 ? ?req.getRequestDispatcher("/success.jsp").forward(req,resp); } ``` 面試題:請你聊聊重定向和轉發的區別? 相同點 * 頁面都會實現跳轉 不同點 * 請求轉發的時候,url不會產生變化 307 * 重定向時候,url地址欄會發生變化; 302
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看