<返回更多

JAVA-Servlet忘记实现HttpServlet接口处理

2022-06-06    跟xi哥学开发
加入收藏

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();
        }
    }
}
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>