一、Servlet继承结构
顶级servlet接口—>genericServlet抽象类(重写除service外的方法)—>HttpServlet类(重写service方法)—>自定义servlet类
二、Servlet生命周期
在一个应用程序中,每种Servlet类型只能有一个实例,而控制制Servlet实例化时机的是loadOnStratup参数,此参数为-1时在第一次请求时实例化,为其他正整数时Tomcat(Servlet容器)根据从小到大的顺序在服务启动时实例化
三、ServletConfig与ServletContext
ServletConfig对象与ServletContext对象都是用来存储信息的(键值对)
1.ServletConfig对象
每个Servlet对象都有一个自己的ServletConfig对象,可以在通过xml或注解配置
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>com.atguigu.servlet.Servlet1</servlet-class>
<!--配置servlet的初始化参数-->
<init-param>
<param-name>keya</param-name>
<param-value>valueA</param-value>
</init-param>
<init-param>
<param-name>keyb</param-name>
<param-value>valueb</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
@WebServlet(
urlPatterns ="/serlvet1",
initParams ={@WebInitparam(name="key2a",value ="value2a"),@WebInitParam(name="key2b",value ="value2b")}
)
在service方法中读取ServletConfig信息:
ServletConfig servletConfig =getServletConfig();
String keya =servletConfig.getInitParameter("keya");
System.out.println("keya:"+keya);
2.ServletContext对象
对于每一个应用程序,Servlet容器会创建一个ServletContext对象,这个对象中封装了上下文(应用程序)的环境详情
//在xml中配置
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
<context-param>
<param-name>username</param-name>
<param-value>zhangsan</param-value>
</context-param>
在service方法中获取ServletContext:
ServletContext servletContext =getServletContext();
ServletContext的其他API:
ServletContext servletContext = getServletContext();
// 返回资源的磁盘路径(绝对路径)
String realPath = servletContext.getRealPath("资源在web目录中的路径(如:/image/img1.png)");
// 资源的工程目录(iead中的目录)为"C:\IdeaProjects\myapp\web\image\img1.png"
// 返回值为 "C:\IdeaProjects\myapp\out\artifacts\myapp_war_exploded\image\img1.png"
// 获取项目的上下文路径(Javaweb项目的访问路径)(动态获取,防止项目名称变更时路径错误)
// 如果web应用部署在URL http://localhost:8080/myapp/ 上,那么 getContextPath 将返回 "/myapp"
String contextPath = servletContext.getContextPath();
同时,ServletContext也是三大域对象之一的应用域,与之相关的API如下:
// 向域中存储/修改数据
servletContext.setAttribute("kaya","valuea");
// 根据键查询
String kaya = (String)servletContext.getAttribute("ka");
// 删除
servletContext.removeAttribute("ka");
四、HttpServletRequest与HttpServletResponse
HttpServletRequest与HttpServletResponse是servlet对请求报文和响应报文的封装,由Servlet容器完成,无需我们手动处理,只需要了解相关API即可
1.HttpServletRequest
通过getXXX方法可以获得请求头内的信息
req.getMethod();//获取请求方式
req.getProtocol();//获取请求协议及版本
req.getRequestURI();//获取请求的uri | 项目内的资源路径
req.getRequestURL());//获取请求的url | 项目内资源的完成的路径
req.getLocalPort();//本应用容器的端口号 8080
req.getServerPort();//客户端发请求时使用的端口号
req.getRemotePort();//客户端软件的端口号
最常用的是获取请求头的请求参数
// 根据键获取值
String username = req.getParameter("username");
string userPwd = req.getParameter("userPwd");
// 获取数组参数(对应前端多选框等)
String[]hobbies = req.getParameterValues("hobby");
同时,HttpServletRequest也是三大域对象之一的请求域,与之相关的API如下:
// 向域中存储/修改数据
req.setAttribute("kaya","valuea");
// 根据键查询
String kaya = (String)req.getAttribute("ka");
// 删除
req.removeAttribute("ka");
注意:setAttribute
设置的属性仅在服务器端可见,不能直接发送给客户端。
2.HttpServletResponse
可以设置响应报文的响应状态码、响应头等信息
resp.setStatus(200); // 设置响应状态码
resp.setHeader("aaa","vaLuea"); // 在响应体中添加键值对信息
//resp,setHeader("Content-Type","text/htmL"); // 设置响应头
resp.setContentType("text/html"); // 简化写法
String info ="<h1>hello</h1>";
//resp.setHeader("Content-Length","1234"); // 设置响应体的(字节)长度
resp.setContentLength(info.getBytes().length); // 简化写法