servlet
一安装tomcat
https://tomcat.apache.org/
在官网中下载tomcat
配置环境变量在pathy中%JAVA_HOME%/bin
(注意放在第一个不然容易闪退)
IDEA集成Tomcat服务器
第一步
第二步
第三步
常用状态码介绍:
状态码 | 说明 |
---|---|
200 | 一切都OK> |
302/307 | 请求重定向(客户端行为,两次请求,地址栏发生改变) |
304 | 请求资源未发生变化,使用缓存 |
404 | 请求资源未找到 |
500 | 服务器错误 |
二编写servlet
1)编码步骤
第一步:前期准备-创建JavaWeb工程
第二步:编写一个普通类继承GenericServlet并重写service方法
第三步:在web.xml配置Servlet
public class FirstServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet的方法执行了");
}
}
<servlet>
<servlet-name>firstServlet</servlet-name>
<servlet-class>cn.xinzhi.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>firstServlet</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
启动程序:访问 localhost:8080/虚拟路径/first,最终执行了UserServlet的service方法
3 Servlet执行过程分析
我们通过浏览器发送请求,请求首先到达Tomcat服务器,由服务器解析请求URL,然后在部署的应用列表中找到我们的应用。接下来,在我们的应用中找应用里的web.xml配置文件,在web.xml中找到FirstServlet的配置,找到后执行service方法,最后由FirstServlet响应客户浏览器。
一句话总结执行过程:
浏览器——>Tomcat服务器——>我们的应用——>应用中的web.xml——>FirstServlet——>响应浏览器
4 Servlet的编写方式
第一种:实现Servlet接口,接口中的方法必须全部实现。 使用此种方式,表示接口中的所有方法在需求方面都有重写的必要。此种方式支持最大程度的自定义。
第二种:继承GenericServlet,service方法必须重写,其他方可根据需求,选择性重写。 使用此种方式,表示只在接收和响应客户端请求这方面有重写的需求,而其他方法可根据实际需求选择性重写,使我们的开发Servlet变得简单。但是,此种方式是和HTTP协议无关的。
第三种:继承HttpServlet,它是javax.servlet.http包下的一个抽象类,是GenericServlet的子类。如果我们选择继承HttpServlet时,只需要重写doGet和doPost方法,不要覆盖service方法。使用此种方式,表示我们的请求和响应需要和HTTP协议相关。也就是说,我们是通过HTTP协议来访问的。那么每次请求和响应都符合HTTP协议的规范。请求的方式就是HTTP协议所支持的方式(目前我们只知道GET和POST,而实际HTTP协议支持7种请求方式,GET POST PUT DELETE TRACE OPTIONS HEAD )。
5 servlet的生命周期
- 生命周期
# 被创建:执行init方法,只执行一次
– 在标签下配置
1. 第一次被访问时,创建
<load-on-startup>的值为负数,默认的是第一次访问的时候创建
2. 在服务器启动时,创建
<load-on-startup>的值为0或正整数,随着tomcat的启动创建
# 提供服务:执行service方法,执行多次
# 被销毁:执行destroy方法,只执行一次
– Servlet被销毁时执行。服务器关闭时,Servlet被销毁
– 只有服务器正常关闭时,才会执行destroy方法。
– destroy方法在Servlet被销毁之前执行,一般用于释放资源
# 注意事项:
Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
多个用户同时访问时,可能存在线程安全问题。
解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
6 服务器向浏览器写数据的步骤
- 服务器获取字符/字节输出流
- 输出数据
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>首页</TITLE>");
out.println("</HEAD>");
out.println(" <BODY>");
out.print("<p style='color: red'>");
out.print("这是个段落");
out.print("</p>");
out.println(" </BODY>");
out.println("</HTML>");
// flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满
out.flush();
out.close();