目录
浏览器中输入URL并回车,直到看到网页内容,期间发生了什么?
为什么需要动态资源
在某些资源路径固定的情况下,我们需要对应不同的环境、条件,产生不同的内容。
如:各个网站的个人中心页面,博客详情页;
Servlet
Servlet 就是 Tomcat 这个 HTTP 服务器提供给 Java 的一组 API, 来完成构建动态页面这个任务。
大体的开发流程
- 通过继承HTTPServlet抽象类,完成我们自己的类(每个都是一个独立的Web资源)
- 重写其中的一些方法(get、post、...),输出资源内容的过程
- 把动态资源和路径建立绑定关系:可以通过web.xml,或者使用Java中的注解语法完成@WebServlet。
整个过程都需要遵守标准,否则Tomcat不认。
不需要自己实例化HTTPServlet对象(Tomcat内部在实例化);
也不会调用我们写好的get、post方法(Tomcat内部会在合适的时机去调用);
HTTP请求<->HttpServletRequest(这里的方法以getXXX为主)
HttpServletResponse<->HTTP响应(这里的方法以setXXX为主)
通过web.xml实现绑定:
package com.wh.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
//1、声明这个类是一个web资源,via让类继承HTTPServlet这个抽象类
//2、看我们的动态资源支持那些HTTP方法(支持get方法via重写doGet方法)
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//3、读取request对象中的信息(都是来自HTTP请求中的信息)
//4、根据当下的条件
//5、准备相应数据 , 通过填写response对象来做到
//设置状态码是201
resp.setStatus(201);
//字符集编码
resp.setContentType("text/plain;charset=utf-8");
PrintWriter writer=resp.getWriter();
writer.printf("你好世界");
//通过web.xml实现绑定
}
}
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="false">
<servlet>
<servlet-name>MyFirstServlet</servlet-name>
<servlet-class>com.wh.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyFirstServlet</servlet-name>
<!-- ServletPath -->
<url-pattern>/first</url-pattern>
</servlet-mapping>
</web-app>
状态码:
使用Java中的注解语法完成@WebServlet:
package com.wh.servlet;
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注解修饰类,来实现绑定
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setStatus(202);
resp.setContentType("text/css");
resp.setContentType("text/plain;charset=utf-8");
PrintWriter writer=resp.getWriter();
writer.printf("你好中国");
}
}
- 通过继承HTTPServlet,表示这个类已经是一个有效的Web资源(动态)了。
- 重写doGet方法,表示这个资源支持HTTP的 GET方法访问。隐含着:其他的HTTP方法,是不支持的,如果非要使用别的方法(非405)访问这个资源,会405。