> 文章列表 > Servlet API

Servlet API

Servlet API

目录

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构造重定向的响应


1.HttpServlet

方法名称 调用时机
init 实例化后被调用一次
destroy 实例不使用时,调用一次
service 收到HTTP请求调用
doGet

收到 GET 请求的时候调用(由 service 方法调用)

doPost

收到 POST 请求的时候调用(由 service 方法调用)

doPut/doDelete/doOptions/...

收到其他请求的时候调用(由 service 方法调用)

 1.doGet

@WebServlet("/method")
public class MethodServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf8");resp.getWriter().write("Get响应");}
}

2.doPost

test.html

请求是相对路径,不用加/    

方法是post,路径是method1,得到body

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>$.ajax({type:'post',url:'method1',success:function(body){console.log(body);}});</script>
</body>
</html>

 MethodServlet1.java

contentType:让服务器告诉浏览器它发送的数据属于什么文件类型

@WebServlet("/method1")
public class MethodServlet1 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=utf8");resp.getWriter().write("post响应");}
}

Fiddler捕获到两个页面

2.HttpServletRequest

通过Socket API读取HTTP请求(字符串),按照HTTP协议把字符串解析成HttpServletPequest对象

2.1方法

方法 描述
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 对象.

2.2打印请求信息

创建stringBuilder对象,把api得到的结果存入,

通过write()方法,输出到页面

@WebServlet("/showRequest")
public class showRequest extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//调用API,把得到的结果组织到html中,作为响应的body//把api执行的结果,放入stringbuilder中StringBuilder stringBuilder=new StringBuilder();stringBuilder.append("<h3>首行部分</h3>");stringBuilder.append(req.getProtocol());//协议名称和版本号stringBuilder.append("<br>");stringBuilder.append(req.getMethod());//请求的方法stringBuilder.append("<br>");stringBuilder.append(req.getRequestURI());//返回第一行查询的字符串stringBuilder.append("<br>");stringBuilder.append(req.getContextPath());//第一级路径stringBuilder.append("<br>");stringBuilder.append(req.getQueryString());//完整字符串stringBuilder.append("<br>");stringBuilder.append("<h3>header部分</h3>");Enumeration<String> headerNames=req.getHeaderNames();//keywhile(headerNames.hasMoreElements()){String headerName=headerNames.nextElement();String headerValue=req.getHeader(headerName);//valuestringBuilder.append(headerName+" : "+headerValue+"<br>");}resp.setContentType("text/html;charset=utf8");resp.getWriter().write(stringBuilder.toString());}
}

 

 2.3获取GET请求的参数

在输入网址时,输入信息

用getParameter()得到信息,输出

@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//预期浏览器传来一个形如这样的请求:/getParameter?userId=123&classId=456String 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

 2.4post请求body格式

1.x-www-form-urlencoded

前端代码:

a.form表单

b.postman

前端请求:

action中写的是相对路径

点击submit后,会跳转到action中写的路径(后端代码的页面)

<form action="postGetParameter" method="post"><input type="text" name="userId"><input type="text" name="classId"><input type="submit" value="提交"></form>

后端代码:

@WebServlet("/postGetParameter")
public class postGetParameterServlet extends HttpServlet {@Overrideprotected 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,页面显示信息

2.json

形式:

{

  userId:zhang,

  classId:123;

}

用第三方库处理json格式==>Jackson

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.7</version>
</dependency>

前端代码:通过js构造body为json的格式请求

1.得到信息(userId,classId,submit)

2.编写点击按钮:

使用ajax:

写入:type,url,contentType,data(设置成json的格式),回调函数

<input type="text" id="userId"><input type="text" id="classId"><input type="button" value="提交" id="submit"><!-- 要构造一个json格式的请求,不能使用form表单,要用ajax --><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>let userIdInput=document.querySelector('#userId');let classIdInput=document.querySelector('#classId');let button=document.querySelector('#submit');button.onclick=function(){$.ajax({type:'post',url:'postJson',contentType:'application/json',data:JSON.stringify({userId:userIdInput.value,classId:classIdInput.value}),success:function(body){console.log(body);}});}</script>

后端代码:

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();@Overrideprotected 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);}
}

 

3.HttpServletResponse

Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式, 转成一个字符串, 并通过Socket 写回给浏览器.

3.1方法

方法 描述

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 中写入二进制格式数据.

3.2设置状态码

响应码:服务器返回的状态码,只是告诉浏览器当前响应的状态,不影响浏览器显示body

@WebServlet("/status")
public class StatusServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setStatus(404);resp.getWriter().write("hello");}
}

 3.3自动刷新

@WebServlet("/autoRefresh")
public class autoRefresh extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setHeader("Refresh","1");resp.getWriter().write("timeStamp"+System.currentTimeMillis());}
}

 

 

3.4构造重定向的响应

@WebServlet("/RedirectServlet")
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendRedirect("https://www.bilibili.com/");}
}