1.request对象
是当客户端向服务器端发送请求时,服务器为本次请求创建request对象,并在调用Servlet的service方法时,将该对象传递给service方法。Request对象中封装了客户端发送过来的所有的请求数据。
①:doGet()方法接收request数据
- 编写html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="/SecondServlet/regist" method="get"> 用户名:<input type="text" name="username"/> 密码:<input type="text" name="password"/> <input type="submit" value="注册"> </form> </body> </html>
- 编写doGet()方法
@WebServlet("/regist") public class RegistServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println(username + " " + password); } }
②:doPost()方法接收request数据
- 编写html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="/SecondServlet/regist" method="post"> 用户名:<input type="text" name="username"/> 密码:<input type="text" name="password"/> <input type="submit" value="注册"> </form> </body> </html>
- 编写doPost()方法
@WebServlet("/regist") public class RegistServlet extends HttpServlet{ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println(username + " " + password + "dopost"); } }
③:请求乱码问题
由于request是接收来自用户的请求,服务器会根据编码格式将请求转换。服务器端默认的编码格式为ISO-8859-1(此编码不支持中文),而我们用户浏览器默认是utf-8的编码格式,所以往往会产生乱码。要想解决乱码问题,需要设置request当中的编码格式,告诉服务器以何种形式来解析数据。或者在接收到乱码以后,通过何种编码格式进行还原
方式一:
request.setCharacterEncoding("UTF-8");
该方法只针对POST有效(必须在接收数据之前设定)
方式二:
new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8"))
借助String对象的方法,该种方式对任何请求有效,都是通用的。
Tomcat8以后的get请求时不会出现乱码的。
④:转发请求【重点】
请求转发是一种服务器行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的url地址不会发生改变,得到相应后,服务器端会将请求发送给客户端,从始至终只有一个请求发出。
request.getRequestDispatcher(url).forward(request, response);
具体实现,定义两个servlet
/** * * @author lenovo * 请求转发跳转 * 可以让服务器端跳转到客户端(或者指定的(Servlet) * 特点: * 1.服务器端行为 * 2.地址栏不会发生改变 * 3.从始至终都是一个请求 * 4.request当中的数据在servlet程序中共享 */ @WebServlet(value="/s01") public class Servlet01 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println("s01="+username + " " + password); // 请求跳转到Servlet02 //req.getRequestDispatcher("s02").forward(req, resp); //请求发送到html页面 req.getRequestDispatcher("RegistServlet.html").forward(req, resp); } }
@WebServlet(value="/s02") public class Servlet02 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println("s02=" + username + " " + password); } }
运行起来我们发现s01和s02都会输出,且只是请求了一次
⑤:request作用域[重点]
request表示一个请求,只要发出一个请求就会创建一个request对象,他的作用域:仅在当前请求中有效。
用处:常用于服务器间同一请求不同页面之间的参数传递,常用于表单的控制值传递。
常用的方法
request.setAttribute(String name,Object value) | 设置域对象内容 |
request.getAttribute(String name) | 获取域对象内容 |
request.removeAttribute(String name) | 删除域对象内容 |
使用方式:给Servlet传值
@WebServlet("/s03") public class Servlet03 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("我是03"); req.setAttribute("user", "qcby"); req.setAttribute("age", 18); req.getRequestDispatcher("s04").forward(req, resp); } }
@WebServlet("/s04") public class Servlet04 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("我是04"); System.out.println(req.getAttribute("user")); System.out.println(req.getAttribute("age")); } }
访问:http://localhost:8080/SecondServlet/s03
②:响应乱码问题
浏览器与服务器传输中文数据会乱码,原因就是服务器响应数据默认采用iso8859-1码表,浏览器默认采用GBK码表,所以就会乱码。
要解决该乱码只能在服务器端告诉服务器使用一种能够支持中文的编码格式,比如UTF-8
response.setCharacterEncoding("UTF-8");
此时还只是完成了一半的工作,要保证数据的正确显示,还要指定客户端的编码方式
response.setHeader("content-type", "text/html;charset=UTF-8");
两端指定编码后,乱码就解决了,一句话:保证发送端和接收端的编码一致
以上两句话可以简化为一句话,同时指定客户端和服务器端
response.setContentType("text/html;charset=utf-8");
案例
@WebServlet(value="/s01") public class Servlet01 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html;charset=utf-8"); PrintWriter writer = response.getWriter(); writer.append("<h1>你好</h1>"); } }
@WebServlet(value="/s01") public class Servlet01 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html;charset=utf-8"); ServletOutputStream outputStream = response.getOutputStream(); outputStream.write("<h1>你好</h1>".getBytes()); } }
③:重定向
重定向是一种服务器指导,客户端行为。客户端发出第一个请求,被服务器接收处理后,服务器会给客户端一个响应(一个新的地址),当客户端接收到新的请求后,会立刻马上根据服务器发送来的地址发起第二次请求。服务器接收请求并完成响应,重定向完成。
从上述描述中可以看出重定向存在两次请求,并且是客户端行为
response.sendRedirect(url);
案例
@WebServlet("/s05") public class Servlet05 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("我是s05"); // 重定向到s06 response.sendRedirect("s06"); } }
@WebServlet("/s06") public class Servlet06 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("我是s06"); } }