免费网站建设下载/2023上海又出现疫情了
目录
- HttpServletRequest
- HttpServletRequest 类的作用
- HttpServletRequest 类的常用方法
- 如何获取请求参数
- GET 请求的中文乱码解决
- POST 请求的中文乱码解决
- 请求的转发
- base 标签的作用
- Web 中的相对路径和绝对路径
- web 中 / 斜杠的不同意义
- HttpServletResponse
- HttpServletResponse 类的作用
- 两个输出流的说明
- 往客户端回传数据,并且解决乱码问题
- 请求重定向
- 方式一
- 方式二
HttpServletRequest
HttpServletRequest 类的作用
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中,然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。
HttpServletRequest 类的常用方法
- getRequestURI() 获取请求的资源路径
- getRequestURL() 获取请求的统一资源定位符(绝对路径)
- getRemoteHost() 获取客户端的 ip 地址
在IDEA中,使用localhost访问时,得到的客户端 ip 地址是 ==>> 127.0.0.1;使用真实 ip 访问时,得到的客户端 ip 地址是真实的客户端 ip 地址。
- getHeader() 获取请求头
- getParameter() 获取请求的参数
- getParameterValues() 获取请求的参数(多个值的时候使用)
- getMethod() 获取请求的方式 GET 或 POST
- setAttribute(key, value); 设置域数据
- getAttribute(key); 获取域数据
- getRequestDispatcher() 获取请求转发对象
常用 API 示例代码:
public class RequestAPIServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// getRequestURI() 获取请求的资源路径System.out.println("URI => " + req.getRequestURI());
// getRequestURL() 获取请求的统一资源定位符(绝对路径)System.out.println("URL =>" + req.getRequestURL());
// getRemoteHost() 获取客户端的 ip 地址System.out.println("客户端 ip => " + req.getRemoteHost());
// getHeader() 获取请求头System.out.println("请求头User-Agent ==>> " + req.getHeader("User-Agent"));}
}
如何获取请求参数
form.html代码示例
<body><form action="http://localhost:8080/07_servlet/parameterServlet" method="get">用户名:<input type="text" name="username"/><br/>密码:<input type="password" name="password"/><br/>兴趣爱好:<input type="checkbox" name="hobby" value="cpp"/>C++<input type="checkbox" name="hobby" value="java"/>Java<input type="checkbox" name="hobby" value="js"/>JavaScript<br/><input type="submit"/></form></body>
java代码示例:
public class ParameterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求参数String username = req.getParameter("username");String password = req.getParameter("password");String[] hobby = req.getParameterValues("hobby");System.out.println("用户名:" + username);System.out.println("密码:" + password);// 将数组转换为列表System.out.println("兴趣爱好:" + Arrays.asList(hobby));}
}
GET 请求的中文乱码解决
// 获取请求参数String username = req.getParameter("username");//1. 先以 iso8859-1 进行编码//2. 再以 UTF-8 进行解码username = new String(username.getBytes("iso-8859-1"),"UTF-8");
POST 请求的中文乱码解决
// 设置请求体的字符集为UTF-8,从而解决中文乱码问题req.setCharacterEncoding("UTF-8");
请求的转发
请求转发是指服务器收到请求后,从一个资源跳转到另一个资源的操作。
请求转发图解:
Servlet1 代码:
public class Servlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");System.out.println("在 Servlet1(柜台1)中查看参数(材料) : " + username);// 给材料盖章,并传递到 Servlet2(柜台2)中去查看req.setAttribute("key1","柜台1的章");// 接下来问路:Servlet2(柜台2)怎么走//请求转发必须要以斜杠 / 开头, / 斜杠表示地址为:http://ip:port/工程名/,映射到 IDEA 代码的web目录RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");// 走向 Servlet2(柜台2)requestDispatcher.forward(req,resp);}
}
Servlet2 代码:
public class Servlet2 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求的参数(办事的材料)并查看String username = req.getParameter("username");System.out.println("在 Servlet2(柜台2) 中查看参数(材料):" + username);// 查看 柜台1 是否有盖章Object key1 = req.getAttribute("key1");System.out.println("柜台1是否有盖章:" + key1);// 处理自己的业务System.out.println("Servlet2 处理自己的业务");}
}
base 标签的作用
Web 中的相对路径和绝对路径
在 JavaWeb 中,路径分为相对路径和绝对路径两种:
相对路径:
. 当前目录
… 上一级目录
资源名 当前目录/资源名
绝对路径:
htttp://ip:port/工程路径/资源路径
web 中 / 斜杠的不同意义
在 web 中 / 斜杠 是一种绝对路径。
/ 斜杠 如果被浏览器解析,得到的地址是: http://op:port
/ 斜杠 如果被服务器解析,得到的地址是:http://ip:port/工程路径
HttpServletResponse
HttpServletResponse 类的作用
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用。
HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息, 我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
两个输出流的说明
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个!!!
往客户端回传数据,并且解决乱码问题
public class ResponseIOServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 它会同时设置服务器和客户端都是用UTF-8字符集,还设置了响应头// 此方法一定要在获取流对象之前调用才有效resp.setContentType("text/html; charset=UTF-8");// 往客户端回传 字符串 数据PrintWriter writer = resp.getWriter();writer.write("李是神魔恋");}
}
请求重定向
客户端给服务器发请求,然后服务器告诉客户端说:我给你地址,你去新地址访问,叫请求重定向(因为之前的地址可能已经被废弃)
方式一
response1:
public class Response1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("Response1 来过");//设置响应状态码302,表示重定向resp.setStatus(302);resp.setHeader("location","http://localhost:8080/07_servlet/response2");}
}
response2:
public class Response2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("response2's result!");}
}
方式二
public class Response1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendRedirect("http://localhost:8080");}
}