亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

3.7Servlet忘記實現HttpServlet接口處理【理解】

出現情況

在寫Servlet時,忘記了實現HttpServlet接口

導致結果

在反射創建對象后,強轉成HttpServlet時,會報類型轉換異常

解決方案

在反射創建對象后,強轉成HttpServlet前,進行判斷如果有實現HttpServlet接口,就進行強轉否則拋出一個異常

public class PropertiesParseServletConfig implements ParseServletConfig {
    @Override
    public void parse() {
        try {
            //1.讀取配置文件中的數據
            Properties properties = new Properties();
            FileReader fr = new FileReader("http‐dynamic‐server/webApp/config/servlet‐info.properties");
            properties.load(fr);
            fr.close();
            //2.獲取集合中servlet‐info的屬性值
            String properValue = (String) properties.get("servlet‐info");
            // uri,全類名;uri,全類名
            //3.解析
            String[] split = properValue.split(";");
            for (String servletInfo : split) {
                String[] servletInfoArr = servletInfo.split(",");
                String uri = servletInfoArr[0];
                String servletName = servletInfoArr[1];
                //我們需要通過servletName(全類名)來創建他的對象
                Class clazz = Class.forName(servletName);
                //獲取該類所實現的所有的接口信息,得到的是一個數組
                Class[] interfaces = clazz.getInterfaces();
                //定義一個boolean類型的變量
                boolean flag =  false;
                //遍歷數組
                for (Class clazzInfo : interfaces) {
                    //判斷當前所遍歷的接口的字節碼對象是否和HttpServlet的字節碼文件對象相同
                    if(clazzInfo == HttpServlet.class){
                        //如果相同,就需要更改flag值.結束循環
                        flag = true;
                        break;
                    }
                }
                if(flag){
                    //true就表示當前的類已經實現了HttpServlet接口
                    HttpServlet httpServlet = (HttpServlet) clazz.newInstance();
                    //4.將uri和httpServlet添加到map集合中
                    ServletConcurrentHashMap.map.put(uri,httpServlet);
                }else{
                    //false就表示當前的類還沒有實現HttpServlet接口
                    throw new NotImplementsHttpServletException(clazz.getName() + "Not
Implements HttpServlet");
                }
            }
        } catch (NotImplementsHttpServletException e) {
            e.printStackTrace();
        }catch (Exception e) {
            System.out.println("解析數據異常.....");
            e.printStackTrace();
        }
    }
}

3.8響應404【理解】

出現情況

客戶端瀏覽器請求了一個服務器中不存在的動態資源

導致結果

服務器中代碼出現異常,程序停止

解決方案

如果請求的動態資源不存在,服務器根據請求的uri找到對應的Servlet時為null,繼續調用方法會出現異常增加一個非空的判斷,如果不為null,則繼續處理請求,調用方法如果為null,則響應404

public class DynamicResourceProcess {
    //執行指定動態資源的service方法
    //參數一
    //由于后期可能根據用戶請求的uri做出相應的處理.
    //參數二
    //要給用戶響應數據,那么就需要使用到httpResponse.
    public void process(HttpRequest httpRequest,HttpResponse httpResponse){
        //獲取請求的uri
        String requestURI = httpRequest.getRequestURI();
        //根據請求的uri到map集合中直接找到對應的servlet的對象
        HttpServlet httpServlet = ServletConcurrentHashMap.map.get(requestURI);
        if(httpServlet != null){
            //調用service方法對請求進行處理并響應
            httpServlet.service(httpRequest,httpResponse);
        }else{
            //瀏覽器請求的動態資源不存在
            //響應404
            response404(httpResponse);
        }
    }
    //瀏覽器請求動態資源不存在,響應404的方法
    private void response404(HttpResponse httpResponse) {
        try {
            //準備響應行
            String responseLine = "HTTP/1.1 404 NOT FOUNDrn";
            //準備響應頭
            String responseHeader = "Content‐Type: text/html;charset=UTF‐8rn";
            //準備響應空行
            String emptyLine = "rn";
            //拼接在一起
            String result = responseLine + responseHeader + emptyLine;
            //把響應行,響應頭,響應空行去響應給瀏覽器
            SelectionKey selectionKey = httpResponse.getSelectionKey();
            SocketChannel channel = (SocketChannel) selectionKey.channel();
           ByteBuffer byteBuffer1 = ByteBuffer.wrap(result.getBytes());
            channel.write(byteBuffer1);
            //給瀏覽器 響應 響應體內容
            ByteBuffer byteBuffer2 = ByteBuffer.wrap("404 NOT FOUND....".getBytes());
            channel.write(byteBuffer2);
            //釋放資源
            channel.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

分享到:
標簽:HttpServlet
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定