1.Servlet编程中常见网页错误
404错误 : 访问不存在
一般都是路径出错.
405错误 : 请求方法不允许
- 使用访问的方法有误
- 只书写了接受Get方法的代码.却使用POST方法访问.
- 代码中忘记注释super()方法也会返回405
- 因为源码是直接返回405的
这里展示的两段代码都会引发上图的405.
1.首先看源码中忘记删除super.doGet()方法.
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "TestErrorServlet", value = "/testerr")
public class TestErrorServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//代码中忘记注释super()方法
super.doGet(request, response);
}
}
2.下述中代码只书写了doPost请求的方法.但是通过浏览器访问默认是GET方法.
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "TestErrorServlet", value = "/testerr")
public class TestErrorServlet extends HttpServlet {
//只书写了doPost方法,但是浏览器默认访问GET方法.
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("test");
}
}
500错误 : 代码中抛异常
代码中抛异常未被处理.异常抛到了Tomcat,Tomcat直接返回500
doGet中除零异常代码.除零异常未捕获会向上抛出.
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "TestErrorServlet", value = "/testerr")
public class TestErrorServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//除零异常未捕获向上抛出
System.out.println(5 / 0);
}
}
空白页面 : 一般是正常访问
一般是正常访问.但是代码中没有给页面返回数据.
代码中什么都没有书写,前端就什么也没有接收到.但是没有错误.
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "TestErrorServlet", value = "/testerr")
public class TestErrorServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
无法访问 : 网络不通(TCP的层次是不通的)
可能是Tomcat没有启动 或者启动失败了.(比如Tomcat端口被占用,启动失败)
2.关于GET和POST的请求常见构造方式.
- GET请求
- 1.直接在地址栏里输入URL
- 2.通过a标签跳转
- 3.通过img/link/script…
- 4.通过form表单 method=get
- 5.ajax,type指定为get
- POST请求
- 1.通过form表单 method=post
- 2.通过ajax,type指定为POST
3.常用类的关键API介绍
HttpServlet
我们写 Servlet 代码的时候, 首先第一步就是先创建类, 这个类就要继承自 HttpServlet.那我们来看看这个类.
方法名称 | 调用时机 |
---|---|
init | 在 HttpServlet 实例化之后被调用一次 |
destory | 在 HttpServlet 实例不再使用的时候调用一次 |
service | 收到 HTTP 请求的时候调用 |
doGet | 收到 GET 请求的时候调用(由 service 方法调用) |
doPost | 收到 POST 请求的时候调用(由 service 方法调用) |
doPut/doDelete/doOptions/… | 收到其他请求的时候调用(由 service 方法调用) |
编写代码来观察HttpServlet的方法.
- 代码详情
- 继承HttpServlet类
- 重写继承类的方法
- 使用@WebServlet注解
- name : 类名
- value : 填写路径
- 这里填写的路径对应到地址栏的路径
- 这里填写的路径必须有 / .硬性规定.( value = “/hello” )
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "helloServlet", value = "/hello")
public class HelloServlet extends HttpServlet {
private String message;
public void init() {
message = "Hello World!";
System.out.println("会在HttpServlet实例化时调用一次");
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
//设置返回数据的类型
response.setContentType("text/html");
System.out.println("在收到GET请求的时候调用");
// Hello
//获取流对象用于给页面返回数据
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("在收到POST请求的时候调用");
}
public void destroy() {
System.out.println("会在HttpServlet销毁时会调用");
}
}
- 访问页面.观察控制台.
- 可以看到控制台的输出符合预期.
- init 初始化时调用
- doGet 收到请求时调用
- doPost 未收到请求,不调用
- destroy 未主动销毁,不调用