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();
}
}
}