Servlet的API中包含了许多内容,但我们主要就下面三个类来学习:
前面我们在编写第一个Servlet程序时,就使用到了这个类,下面罗列出的是该类中常用的方法:
在实际开发中,更多情况下,我们是重写doxxx方法,下面就使用代码简单演示这些方法的使用:
首先使用url构造get请求:
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;@WebServlet("/HttpServlet")
public class ServletDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("doGet!");}
}
post请求的构造除了可以通过form表单来实现以外,还有其他的构造方式,这里我们首先使用ajax的方式来构造:
在webapp目录下创建html文件(必须在此路径下,否则会出现404错误),写入下面代码:
Document
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;@WebServlet("/HttpServlet")
public class ServletDemo2 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("doPost");}@Overrideprotected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("doPut");}@Overrideprotected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("doDelete");}
}
运行结果:
使用ajax构造请求的方法固然可行,但也略显繁琐,下面我们尝试借助第三方工具来更加方便快捷地构造请求;
PostMan是一个常用的用于构造http请求的工具,我们可以直接通过官网来下载,官网地址https://www.postman.com/
安装完成以后打开界面如下:
通过选择界面左边不同的方法,就可以使用postman就可以轻松构造各种请求了
HttpServlet这个类主要就是涉及到上面几个方法的应用,下面是有关于HttpServlet的生命周期;
HttpServlet的生命周期,实际也就是在于在什么样的时机调用什么样的方法,具体的解答如下:
首次使用,调用init方法,生命周期的开始;
每次收到请求,调用service方法,在service方法内部根据请求的具体方法来决定调用哪一个doxxx方法;
调用destroy方法销毁对象,生命周期的结束;
HttpServletRequest主要就是封装了http请求的对象,
它会按照http协议将http请求进行解析,下面是它的常见方法;
简单使用代码演示上面方法的使用:
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;@WebServlet("/HttpServletRequest")
public class ServletDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//指定字符的编码方式resp.setContentType("text/html;charset=utf-8");resp.getWriter().write("你好!"+" ");//返回请求的名称和版本号resp.getWriter().write(req.getProtocol()+" ");//返回请求的http方法的名称resp.getWriter().write(req.getMethod()+" ");//资源定位符resp.getWriter().write(req.getRequestURI()+" ");//请求上下文的URI部分resp.getWriter().write(req.getContextPath()+" ");//返回路径后的请求URL中的查询字符串,没有就返回nullresp.getWriter().write(req.getQueryString()+" ");//返回请求主体中使用的字符编码的名称resp.getWriter().write(req.getCharacterEncoding()+" ");}
}
运行结果:
我们可以使用Fidder抓包工具来查验我们代码的运行结果与实际情况:
请求部分:
响应部分:
由于GET请求中的参数一般是通过query string来传递给服务器的,下面我们尝试使用代码来获取GET请求中的参数:
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;@WebServlet("/queryString")
public class QueryString extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");String id=req.getParameter("id");String num=req.getParameter("num");resp.getWriter().write("id="+id+" num="+num);}
}
此时使用浏览器构造URL请求时,需要在路径后面手动为我们代码中的参数设置值(在未设置的情况下默认返回null),下面是运行结果:
如果是post请求,就可以通过body向服务器传参,而body中的数据格式有多种定义方式,像from表单、JSON格式、或使用第三方库等;
下面首先是使用from表单进行构造:
首先是后端代码:
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;@WebServlet("/PostFrom")
public class PostParameter extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");String id=req.getParameter("id");String num=req.getParameter("num");resp.getWriter().write("id="+id+" num="+num);}
}
构造的from表单必须在webapp目录下:
, initial-scale=1.0">Document
运行结果:
点击提交之后跳转到如下界面:
在构造from表单时,需要注意:
action部分必须与后端注解中的内容保持一致,否则会出现404错误;
method部分必须与后端重写的方法一致;
name部分的key必须与后端的设置一致;
前后端的约定必须遵守,只有两者相互配合,代码才可以正常运行;
抓包结果如下:
请求部分:
响应部分;
除了使用上面表单的方式来构造,我们还可以使用json格式来构造post请求,这里的构造方式的选择也有多种,像使用ajax构造,当然也可以使用第三方工具Postman来构造,这里我们通过第三方库来进行这一操作,当然,提供JSON处理的第三方库也有多种,我们选择jackson即可;
jackson的下载依然是使用Maven中央仓库https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind来完成,这里的版本可以任意选择;
同样是放在标签 < dependencies>< /dependencies>中,首次下载时标红属于正常现象,点击刷新按钮下载即可;
然后我们就可以借助jackson中的方法来直接处理json格式的请求了:
import com.fasterxml.jackson.databind.ObjectMapper;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;//首先需要构造一个类,这里类的属性的名字必须与json中的key保持一致
class Student{//这里的属性必须是public或提供公开的getter方法public int id;public int num;
}
@WebServlet("/JsonServlet")
public class JsonServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//使用该对象从请求的body中进行读取,并解析ObjectMapper objectMapper=new ObjectMapper();//通过使用readValue()方法把json字符串转为java 对象Student student=objectMapper.readValue(req.getInputStream(),Student.class);resp.getWriter().write(student.id+" "+student.num);}
}
readValue()方法把json字符串转为java 对象,这里第一个参数是一个String或者InputStream,第二个参数是转换的结果对应的java对象;
writeValue()方法是把java对象转成json字符串;
HttpServletResponse对象主要就是接收来自服务器的响应数据,其核心方法主要有下面这些:
简单使用代码来演示重点方法的实现:
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;@WebServlet("/status")
public class ServletDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//手动设置状态码resp.setStatus(405);}
}
设置结果:
通过设置http响应报头中的Refresh字段,实现自动刷新操作:
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;@WebServlet("/refresh")
public class RefreshServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setHeader("Refresh","1");resp.getWriter().write(System.currentTimeMillis()+"");}
}
重定向实现,自动跳转到新页面:
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;
@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendRedirect("http://www.baidu.com");}
}
具体的代码运行结果大家可以自行尝试;
至此,servlet相关的重点3个API就介绍完毕了啦~
上一篇:漫画:什么是外部排序?
下一篇:【Python】正则表达式re库