目录
1.HttpServlet
1.doGet
2.doPost
2.HttpServletRequest
2.1方法
2.2打印请求信息
2.3获取GET请求的参数
2.4post请求body格式
1.x-www-form-urlencoded
2.json
3.HttpServletResponse
3.1方法
3.2设置状态码
3.3自动刷新
3.4构造重定向的响应
方法名称 | 调用时机 |
init | 实例化后被调用一次 |
destroy | 实例不使用时,调用一次 |
service | 收到HTTP请求调用 |
doGet | 收到 GET 请求的时候调用(由 service 方法调用) |
doPost | 收到 POST 请求的时候调用(由 service 方法调用) |
doPut/doDelete/doOptions/... |
收到其他请求的时候调用(由 service 方法调用) |
@WebServlet("/method")
public class MethodServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write("Get响应");
}
}
test.html
请求是相对路径,不用加/
方法是post,路径是method1,得到body
Title
MethodServlet1.java
contentType:让服务器告诉浏览器它发送的数据属于什么文件类型
@WebServlet("/method1")
public class MethodServlet1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write("post响应");
}
}
Fiddler捕获到两个页面
通过Socket API读取HTTP请求(字符串),按照HTTP协议把字符串解析成HttpServletPequest对象
方法 | 描述 |
String getProtocol() | 返回请求协议的名称和版本 |
String getMethod() | 返回请求的方法 |
String getRequestURI() | 从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的URL 的一部分。 |
String getContextPath() | 返回第一级路径 |
String getQueryString() | 返回查询的字符串(完整的) |
Enumeratin getParameterNames() | 解析成键值对,key用enum方式表达 |
String getParameter(String name) | 解析成键值对,根据key返回value |
String[] getParameterValues(String name) | 返回请求参数的值,如果不存在返回null |
Enumeration getHeaderNames() |
请求报头解析成键值对,key用enum方式表达 |
String getHeader(Stringname) |
请求报头解析成键值对,根据key返回value |
String getCharacterEncoding() |
返回主体中使用字符编码的名称 |
String getContentType() |
返回请求主体的 MIME 类型,如果不知道类型则返回 null |
int getContentLength() |
以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回 -1。 |
InputStream getInputStream() |
用于读取请求的 body 内容. 返回一个 InputStream 对象. |
创建stringBuilder对象,把api得到的结果存入,
通过write()方法,输出到页面
@WebServlet("/showRequest")
public class showRequest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//调用API,把得到的结果组织到html中,作为响应的body
//把api执行的结果,放入stringbuilder中
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.append("首行部分
");
stringBuilder.append(req.getProtocol());//协议名称和版本号
stringBuilder.append("
");
stringBuilder.append(req.getMethod());//请求的方法
stringBuilder.append("
");
stringBuilder.append(req.getRequestURI());//返回第一行查询的字符串
stringBuilder.append("
");
stringBuilder.append(req.getContextPath());//第一级路径
stringBuilder.append("
");
stringBuilder.append(req.getQueryString());//完整字符串
stringBuilder.append("
");
stringBuilder.append("header部分
");
Enumeration headerNames=req.getHeaderNames();//key
while(headerNames.hasMoreElements()){
String headerName=headerNames.nextElement();
String headerValue=req.getHeader(headerName);//value
stringBuilder.append(headerName+" : "+headerValue+"
");
}
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write(stringBuilder.toString());
}
}
在输入网址时,输入信息
用getParameter()得到信息,输出
@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//预期浏览器传来一个形如这样的请求:/getParameter?userId=123&classId=456
String userId=req.getParameter("userId");
String classId=req.getParameter("classId");
resp.getWriter().write("userId"+userId+",classId="+classId);
}
网址: localhost:8080/4/getParameter?userId=10&classId=20
如果?后 没有信息,则都为null
前端代码:
a.form表单
b.postman
前端请求:
action中写的是相对路径
点击submit后,会跳转到action中写的路径(后端代码的页面)
后端代码:
@WebServlet("/postGetParameter")
public class postGetParameterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//假设前端传过来的参数是userId=10&classId=20
//服务器也通过req.getParameter来获取内容的
String userId=req.getParameter("userId");
String classId=req.getParameter("classId");
resp.getWriter().write("useId:"+userId+", classId:"+classId);
}
}
先登录test.html得到信息提交,转到postGetParameter,页面显示信息
形式:
{
userId:zhang,
classId:123;
}
用第三方库处理json格式==>Jackson
com.fasterxml.jackson.core
jackson-databind
2.12.7
前端代码:通过js构造body为json的格式请求
1.得到信息(userId,classId,submit)
2.编写点击按钮:
使用ajax:
写入:type,url,contentType,data(设置成json的格式),回调函数
后端代码:
1.创建User类
2.创建jackson核心对象
3.读取body的请求,使用objectMapper解析成user.class
readValue把json格式的对象,转换成java对象
4.输出信息
遍历键值对,得到每个key,把对应的value附到User属性中
class User{
public int userId;
public int classId;
}
@WebServlet("/postJson")
public class PostJsonServlet extends HttpServlet {
private ObjectMapper objectMapper=new ObjectMapper();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user=objectMapper.readValue(req.getInputStream(),User.class);
resp.getWriter().write("userId: " + user.userId + ", classId: " + user.classId);
}
}
Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式, 转成一个字符串, 并通过Socket 写回给浏览器.
方法 | 描述 |
void setStatus(int sc) |
设置响应码 |
void setHeader(String name,String value) |
设置有名称和值的header, name已有则覆盖旧的值 |
void addHeader(Stringname, String value) |
添加有名称和值的header,name已有,不覆盖新的值,添加新的键值对 |
void setContentType(Stringtype) |
设置响应的内容类型 |
void setCharacterEncoding(Stringcharset) |
设置字符编码 |
void sendRedirect(Stringlocation) |
用指定的重定向位置 URL 发送临时重定向响应到客户端 |
PrintWriter getWriter() |
往 body 中写入文本格式数据. |
OutputStream getOutputStream() |
往 body 中写入二进制格式数据. |
响应码:服务器返回的状态码,只是告诉浏览器当前响应的状态,不影响浏览器显示body
@WebServlet("/status")
public class StatusServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setStatus(404);
resp.getWriter().write("hello");
}
}
@WebServlet("/autoRefresh")
public class autoRefresh extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setHeader("Refresh","1");
resp.getWriter().write("timeStamp"+System.currentTimeMillis());
}
}
@WebServlet("/RedirectServlet")
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("https://www.bilibili.com/");
}
}