一、servlet简介
(1)概述
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,简单来说,就是一个java类,是javweb的规范之一(接口),也是三大组件之一(serlvet,listener,filter),它属于动态资源。servlet的作用是处理请求,服务器会把接收到的请求交给servlet来处理,在servlet通常需要:
接收请求数据、 处理请求、 完成响应。
(2)架构
(3)servlet执行原理
① 当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
② 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
③ 如果有,则在找到对应的<servlet-class>全类名
④ tomcat会将字节码文件加载进内存,并且创建其对象
⑤ 调用其方法(4)Servlet 生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程
① Servlet 通过调用 init () 方法进行初始化
② Servlet 调用 service() 方法来处理客户端的请求
③ Servlet 通过调用 destroy() 方法终止(结束)
④ 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的
public class HelloServlet implements Servlet { prvate ServletConfig config; Public void destory(); public ServletConfig getServletConfig(){ return config; } public void init(ServletConfig config)throws ServletException{ this.config=config; System.out.println("初始化!"); } Public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException{ PrintWriter out = res.getWrite(); out.println("Hello world"); out.close(); } public void destroy() { super.destroy(); System.out.println("释放资源!"); }
二、servlet的使用
(1)实现servlet
① 实现javax.servlet.Servlet接口;
② 继承javax.servlet.GenericServlet类;
③ 继承javax.servlet.http.HttpServlet类
(2)2种配置方式
① 注解 @webServlet("/路径")
② web.xml中进行配置<servlet> <servlet-name>xxx</servlet-name> <servlet-class>com.zking.AServlet</servlet-class></servlet> <servlet-mapping> <servlet-name>xxx</servlet-name> <url-pattern>/xxx.do</url-pattern> </servlet-mapping>
(3)JSP中的内置对象对应Servlet中的什么对象
| jsp内置对象 | servlet中java对象 | 获取 | | ----------- | ------------------- | ----------------------- | | request | HttpServletRequest | service方法中的req参数 | | response | HttpServletResponse | service方法中的resp参数 | | session | HttpSession | req.getSession() | | exception | Throwable | | | page | this | this | | pageContext | PageContext | | | application | ServletContext | getServletContext() | | config | ServletConfig | getServletConfig() | | out | JspWriter | resp.getWriter() |
(4)设置编码
request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8");
(5) 如何在serlvet中获取到当前项目的绝对路径注:这里的绝对路径指的是基于项目的根目录而不是基于磁盘。
String path = this.getServletConfig().getServletContext().getContextPath(); /项目名称 path+"/index.jsp"
(6)Servlet接口的使用
public interface Servlet{ public void init(servletConfig config) throws ServletException; public ServletConfig getServletConfig(); public void service(ServletRequest req, ServletResponse resp) throws ServletException,IOException; public String getServletInfo(); public void destory(); }
(7)Servletconfig对象常用方法
| 返回值 | 方法名 | 说明 | | ------------------ | ----------------------------- | ------------------------ | | String | getInitParameter(String name) | 根据参数名称获取参数的值 | | Enumeratin<String> | getInitParameterNames() | 根据所有参数名称的枚举 | | String | getSevletName() | 获取servlet的名称 | | ServletContext | getServletContext() | 获取servletContext对象 |
ServletConfig的配置方式
① 在<servlet>标签种,通过<init-param>标签来配置。有两个子标签:
② <param-name>:代表初始化参数的key。
③ <param-value>: 代表初始化参数的value(8) ServletContext对象常用方法
| 返回值 | 方法名 | 说明 | | ------------------- | -------------------------------------- | -------------------------------------- | | void | setAttribute(String name,Object value) | 向域对象中存储数据 | | Object | getAttribute(String name) | 通过名称获取域对象中的数据 | | void | removeAttribute(String name) | 通过名称移除域对象中的数据 | | Enumeration<String> | getAttributeNames() | 获取域对象中所有数据的名称 | | String | getSevletContextName() | 获取servletContext的名称 | | String | getContextPath() | 获取当前应用的访问虚拟目录 | | String | getServletInfo() | 获取服务器名称和版本信息 | | String | getInitParameter(String name) | 根据名称获取全局配置的值 | | Enumeration<String> | getInitParameters() | 获取全局配置的所有名称 | | String | getRealPath(String path) | 根据虚拟目录获取应用部署额磁盘绝对路径 |
ServletContext配置方式
ServletContext不像ServletConfig接口在Servlet标签里配置,而是针对于整个应用的配置,也叫全局的初始化参数;
在<web-APP>标签中,通过<context-param>标签来配置,有两个子标签:
① <param-name>: 代表全局初始化参数的key。
② <param-value>: 代表全局初始化参数的value。
(9)doGet() 方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }
(10)doPost() 方法
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }
三、案例
使用表单的POST 方法实例
① 布局
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <form action="HelloForm" method="POST"> 名字:<input type="text" name="first_name"> <br /> 姓氏:<input type="text" name="last_name" /> <input type="submit" value="提交" /> </form> </body> </html>
② 使用
// 导入必需的 java 库 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // 扩展 HttpServlet 类 public class HelloForm extends HttpServlet { // 处理 GET 方法请求的方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应内容类型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String title = "Using GET Method to Read Form Data"; String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<ul>\n" + " <li><b>名字</b>:" + request.getParameter("first_name") + "\n" + " <li><b>姓氏</b>:" + request.getParameter("last_name") + "\n" + "</ul>\n" + "</body></html>"); } // 处理 POST 方法请求的方法 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }