servlet
Servlet 客户端 HTTP 请求
客户端Request常见报头
当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息
是作为 HTTP 请求的头的一部分进行传输的。
操作 HTTP Request头的方法
下面的方法可用在 Servlet 程序中读取 HTTP 头。这些方法通过 HttpServletRequest 对象使用:
举例
核心方法使用1-基本方法使用:
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;
import java.io.PrintWriter;
@WebServlet("/index")
public class HelloServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String method = request.getMethod();//返回请求的 HTTP 方法的名称
String encoding = request.getCharacterEncoding();//返回请求主体中使用的字符编 码的名称
String url = request.getContextPath();//返回指示请求上下文的请求 URI 部分
String contentType = request.getContentType();//返回请求主体的 MIME 类型,如 果不知道类型则返回 null
String title = "HTTP Function Test!";
String docType = "<!doctype html>\n";
out.println(docType + "<html>\n" +
"<head><title>" +title+ "</title></head>\n" +
"<body>"+
"<h3> Method: " +method+ "</h3>" +
"<h3> encoding: " +encoding+ "</h3>" +
"<h3> url: " +url+ "</h3>" +
"<h3> contentType: " +contentType+ "</h3>" +
"</body>"+
"</html>");
System.out.println("访问");
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
doGet(request,response);
System.out.println("da访问");
}
}
访问结果
核心方法使用2-表单
先编写我们基本的index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="index" method="GET">
<!--先使用GET-->
first_name:<input type="text" name="first_name">
<br />
last_name:<input type="text" name="last_name" />
<input type="submit" value="submit" />
</form>
</body>
</html>
编写处理Servlet逻辑
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;
import java.io.PrintWriter;
@WebServlet("/index")
public class HelloServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String method = request.getMethod();//返回请求的 HTTP 方法的名称
String first_name = request.getParameter("first_name");
String last_name = request.getParameter("last_name");
String title = "HTTP Function Test!";
String docType = "<!doctype html>\n";
out.println(docType + "<html>\n" +
"<head><title>" +
title+
"</title></head>\n" +
"<body>"+ "<h3> method: " +method+
"</h3>" +
"<h3> first_name: " +
first_name+ "</h3>" +
"<h3> last_name: " +last_name+
"</h3>" + "</body>"+ "</html>");
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
doGet(request,response);
System.out.println("da访问");
}
}
验证结果
先填写参数
改成POST请求,修改index.html
结果,可以说明post请求比get请求更私密了,正文传参没有返回到url中。
核心方法使用3-获取HTTP Request头部信息
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;
import java.io.PrintWriter;
import java.util.Enumeration;
@WebServlet("/index")
public class HelloServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "HTTP Header Request";
String docType = "<!doctype html\">\n";
out.println(docType + "<html>\n" +
"<head><title>" + title +
"</title></head>\n" +
"<body>\n" + "<h1 align=\"center\">" + title +
"</h1>\n" +
"<table width=\"100%\" border=\"2\" align=\"center\">\n" + "<tr>\n" +
"<th>Header name</th><th>Header value</th>\n" +
"</tr>\n");
Enumeration headerNames = request.getHeaderNames();//返回一个枚举,包含在该请 求中包含的所有的头名。
while (headerNames.hasMoreElements()) {
String paramName = (String) headerNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n");
String paramValue = request.getHeader(paramName);//以字符串形式返回指定 的请求头的值
out.println("<td> " + paramValue + "</td></tr>\n");
}
out.println("</table>\n</body></html>");
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
doGet(request,response);
System.out.println("da访问");
}
}
结果
Servlet 服务器 HTTP 响应
服务器端Response常见报头
操作HTTP Response头的方法
举例:
核心方法使用-自动刷新页面
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;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.Enumeration;
import java.util.GregorianCalendar;
@WebServlet("/index")
public class HelloServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
// 设置刷新自动加载时间为 1 秒
response.setIntHeader("Refresh", 1);
// 设置一个带有给定的名称和整数值的响应报 头。
// 设置响应内容类型
response.setContentType("text/html");
// Get current time
Calendar calendar = new GregorianCalendar();//获取当前系统时间
String am_pm;
int hour = calendar.get(Calendar.HOUR);//获得时
int minute = calendar.get(Calendar.MINUTE);// 获得分
int second = calendar.get(Calendar.SECOND);//获得秒
if (calendar.get(Calendar.AM_PM) == 0) //判定是否是上午和下午
am_pm = "AM";
else
am_pm = "PM";
String CT = hour + ":" + minute + ":" + second + " " + am_pm;
PrintWriter out = response.getWriter();
String title = "auto refresh Header set";
String docType = "<!doctype html>\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title +
"</title></head>\n" +
"<body>\n" +
"<h1 align=\"center\">" +
title + "</h1>\n" +
"<p>current time: " + CT +
"</p>\n");
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
doGet(request,response);
}
}
结果
Http状态码
HTTP 状态码列表
设置 HTTP 状态代码的方法
下面的方法可用于在 Servlet 程序中设置 HTTP 状态码。这些方法通过 HttpServletResponse 对象可用。
代码示例
核心方法1-返回404错误
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;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.Enumeration;
import java.util.GregorianCalendar;
@WebServlet("/index")
public class HelloServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
// 设置错误代码和原因
response.sendError(404, "Not Found!!!" );
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
doGet(request,response);
}
}
核心方法2-重定向
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;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.Enumeration;
import java.util.GregorianCalendar;
@WebServlet("/index")
public class HelloServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
// 设置错误代码和原因
response.sendRedirect("https://www.baidu.com");
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
doGet(request,response);
}
}
结果就重定向到百度了。