Servlet编程
引入servlet-api.jar包
servlet(小程序服务)是运行在Web服务器端的 Java应用程序
可以生成动态Web页面,属于客户端和服务器端 中间层
JSP底层就是一个Servlet
配置在web.xml中
认识Servlet
Java是面向对象的语言,任何Java代码都必须放到类中
但是,在JSP中写Java只需要<% %>括起来,没有类定义
因为:运行JSP时,服务器会将JSP编译为Java类,这个类就是Servlet。
Servlet是一种运行在Web服务器的Java应用程序
编写JSP相比于Servlet更加容易
所有学习Servlet是为了 了解底层细节
创建Servlet类
Servlet两个主要方法doPost(),doGet()
doGet和doPost方法是在客户端发起HTTP GET或POST请求时执行的
在HttpServlet源码中,给GET、POST、DELETE、PUT、OPTIONS、TRACE提交方法
都写了一个对应的方法,通过请求的URL判断
创建一个普通Java类
public class learnServlet extends HttpServlet{}
让其继承HttpServlet
原本HttpServlet中doPost方法
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求协议版本
String protocol = req.getProtocol();
// 定义不支持POST请求的错误消息
String msg = lStrings.getString("http.method_post_not_supported");
// 判断请求协议是否为HTTP/1.1
if (protocol.endsWith("1.1")) {
// 如果是HTTP/1.1,返回405 Method Not Allowed错误
resp.sendError(405, msg);
} else {
// 如果不是HTTP/1.1,返回400 Bad Request错误
resp.sendError(400, msg);
}
}
首先获取请求的协议版本,然后根据协议版本判断是否支持POST请求。如果协议版本是HTTP/1.1,则返回405 Method Not Allowed错误;否则返回400 Bad Request错误。
原本的doGet方法,和doPost一样
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
HttpServletRequest和HttpServletResponse对象是在客户端与服务器之间
进行HTTP请求和响应时传递的关键信息。
Request对象代表客户端发送到服务器的HTTP请求,封装了所有的请求信息。
包括请求的地址、请求参数、提交的数据、上传的文件,甚至客户端的IP和操作系统等
Response对象则代表服务器发送回客户端的HTTP响应,用于设置响应数据的方法
如设置响应头、设置响应状态码、写入响应体等 主要用于控制如何将数据发送回客户端。
重写get方法
public class learnServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset = gb2312");
PrintWriter out=resp.getWriter();
out.println("欢迎");
}
}
在web.xml中配置servlet
<servlet>
<servlet-name>WelcomeServlet</servlet-name>
<servlet-class>org.example.learnServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WelcomeServlet</servlet-name>
<url-pattern>/org/example/learnServlet</url-pattern>
</servlet-mapping>
其中,servlet-name随便取,两个servlet中name要一致
servlet-class是编写的Java类位置
url-pattern 将Servlet与特定的URL模式进行映射
当用户访问以/org/example/learnServlet
为路径的URL时
将会调用名为WelcomeServlet
的Servlet进行处理。
若存在多个用户同时访问该网址,不会等待
Servlet采用多线程机制
但是不要在Servlet中定义成员变量,除非是所有用户共享的
Servlet的生命周期
init()方法
HttpServlet中,第一次调用Servlet会创造一个实例
实例化过程会调用init()方法,所以可以将一些初始代码放入
一旦Servlet被初始化,init方法就不会再次执行
一个Servlet在服务器上最多只有一个实例
service()方法
当客户端发送请求时,服务器会开启一个线程
该线程会调用service()方法
该方法根据收到的请求类型,决定使用doGet()还是doPost()方法
destroy()方法
destroy方法是在Servlet生命周期结束时被调用的
通常是在服务器关闭或Servlet容器卸载Servlet时发生
若Servlet消亡之前还需要做一些操作,例如释放数据库连接
那就可以重写destroy()方法
所以可以在init方法中打开数据库,在destroy方法中关闭数据库
来保持数据库的持续连接
init() -》 service() -》 destroy()