新建一个类ServletTest实现Servlet并重写方法
public class ServletTest implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
(1)init方法:默认情况下,servlet被第一次访问时调用,只调用一次
(2)service方法:每次请求Servlet都会被调用
(3)destroy:在内存释放或服务器关闭的时候调用
(4)getServletInfo:获取Servlet信息
(5)ServletConfig:获取ServletConfig对象
体系结构:
因为每次重写太麻烦,并且常用的方法只有service,因此直接继承HttpServlet简化操作
package servletDemo.request;
import javax.servlet.*;
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("/demo4")
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post...");
}
}
url配置:在浏览器中填写/demo1或/demo2都可以访问
Request:获取请求数据
Response:设置响应数据
package servletDemo.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.BufferedReader;
import java.io.IOException;
@WebServlet("/demo5")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取方法
String method = req.getMethod();
System.out.println(method);
//2.获取虚拟路径--/tomcatDemo
String contextPath = req.getContextPath();
System.out.println(contextPath);
//3.获取URL资源路径--http://localhost:8080/tomcatDemo/demo5
StringBuffer url = req.getRequestURL();
System.out.println(url);
//4.获取uri--统一资源标识符
String uri = req.getRequestURI();
System.out.println(uri);
//5.获取请求参数
String queryString = req.getQueryString();
System.out.println(queryString);
//6. 获取请求头--浏览器的版本信息
String header = req.getHeader("user-agent");
System.out.println(header);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取post请求体:请求参数
//1.获取字符输入流
BufferedReader br = req.getReader();
//2.读取数据
String s = br.readLine();
System.out.println(s);
}
}
通用方式获取请求参数:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/tomcatDemo/demo6" method="post">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="checkbox" name="hobby" value="1">游泳
<input type="checkbox" name="hobby" value="2">健身<br>
<input type="submit">
</form>
</body>
</html>
package servletDemo.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.BufferedReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Map;
@WebServlet("/demo6")
public class RequestDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取所有参数的map集合
Map<String, String[]> map = req.getParameterMap();
for (String key : map.keySet()) {
// username:zhangsan
System.out.print(key + ":");
//获取值
String[] values = map.get(key);
for (String value : values) {
System.out.print(value + " ");
}
System.out.println();
}
System.out.println("--------");
//2.根据key获取参数值,数组
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.print(hobby + " ");
}
//3.根据key获取单个值
String username = req.getParameter("username");
String password = req.getParameter("password");
//解决 中文乱码
username = new String(username.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
System.out.println("username:" + username);
System.out.println("password:" + password);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决post中文乱码
req.setCharacterEncoding("UTF-8");
this.doGet(req, resp);
}
}
结果为:
解决中文乱码问题:
get:
new String(username.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
post:
req.setCharacterEncoding("UTF-8");
请求转发:
//请求转发语句,其中“req4”是需要转发的新地址,只需要修改它就ok
req.getRequestDispatcher("req4").forward(req, resp);
重定向:
package servletDemo;
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;
public class ResponseDemo1 {
@WebServlet("/resp1")
public class RequestDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
resp.setStatus(302);
resp.setHeader("Location", "/tomcat/resp2");
*/
//简化方式:
System.out.println("resp1......");
//"/tomcatDemo/resp2":重定向新地址
resp.sendRedirect("/tomcatDemo/resp2");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
}
response响应字符数据:
package servletDemo;
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;
public class ResponseDemo3 {
@WebServlet("/resp3")
public class RequestDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("resp3");
//设置编码格式和HTML
resp.setContentType("text/html; charset=utf-8");
//获取字符输出流
PrintWriter writer = resp.getWriter();
writer.write("好的呢");
writer.write("<h2>hello<h2>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
}
response响应字节数据:
package servletDemo;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseDemo4 {
@WebServlet("/resp4")
public class RequestDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.读取文件
FileInputStream fis = new FileInputStream("d://a.html");
//2.获取response字节输出流
ServletOutputStream os = resp.getOutputStream();
//3.完成流的copy
byte[] buff = new byte[1024];
int len = 0;
while ((len = fis.read(buff)) != -1) {
os.write(buff, 0, len);
}
fis.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
}