1.重定向:跳转页面

设置重定向,让其跳转到主页面 target.html

重定向是浏览器的行为,response下面的方法

当代码进入LoginServlet资源后,跳转到target.html目标网页

响应.getParameter(“name”)

响应.sendRedirect(“目标页面”)

login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="LoginServlet" method="post">
  9. 姓名:<input type="text" name="user"><br>
  10. 密码:<input type="password" name="pwd"><br>
  11. <input type="submit" name="登录">
  12. </form>
  13. </body>
  14. </html>

target.html 目标

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. 我是主页
  9. <!-- window.history.back() 返回上一个历史页面 -->
  10. <button onclick="window.history.back()">返回</button>
  11. </body>
  12. </html>

LoginServlet.java

  1. package com.qfedu.a_redirect; /**
  2. * @author wodexinhuai
  3. * @create 2022-05-07-14:18
  4. */
  5. import javax.servlet.*;
  6. import javax.servlet.http.*;
  7. import javax.servlet.annotation.*;
  8. import java.io.IOException;
  9. @WebServlet("/LoginServlet")
  10. public class LoginServlet extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. doPost(request, response);
  14. }
  15. @Override
  16. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17. request.setCharacterEncoding("utf-8");//post中文乱码解决方案
  18. String user = request.getParameter("user");
  19. String pwd = request.getParameter("pwd");
  20. System.out.println(user + ":" + pwd);
  21. //设置重定向,让其跳转到主页面 target.html
  22. //重定向是浏览器的行为,response下面的方法
  23. //当代码进入LoginServlet资源后,
  24. response.sendRedirect("target.html");
  25. // response.sendRedirect("http://www.baidu.com");
  26. }
  27. }

2.转发:请求资源a,显示转发资源b

转发是服务器的行为 request请求

请求的test1的资源,显示的是转发后的资源(Test2)

Test1

  1. package com.qfedu.b_zhuanfa; /**
  2. * @author wodexinhuai
  3. * @create 2022-05-07-14:37
  4. */
  5. import javax.servlet.*;
  6. import javax.servlet.http.*;
  7. import javax.servlet.annotation.*;
  8. import java.io.IOException;
  9. @WebServlet(name = "Test1Servlet", value = "/Test1Servlet")
  10. public class Test1Servlet extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. doPost(request, response);
  14. }
  15. @Override
  16. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17. System.out.println("用户请求Test1Servlet资源");
  18. //转发会带着数据(request对象)到另外一个资源中
  19. //request带有数据 键值对 name:呼叫博儿
  20. request.setAttribute("name","呼叫博儿");
  21. //转发是服务器的行为
  22. request.getRequestDispatcher("Test2Servlet").forward(request,response);
  23. }
  24. }

Test2

  1. package com.qfedu.b_zhuanfa; /**
  2. * @author wodexinhuai
  3. * @create 2022-05-07-14:41
  4. */
  5. import javax.servlet.*;
  6. import javax.servlet.http.*;
  7. import javax.servlet.annotation.*;
  8. import java.io.IOException;
  9. @WebServlet(name = "Test2Servlet", value = "/Test2Servlet")
  10. public class Test2Servlet extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. doPost(request, response);
  14. }
  15. @Override
  16. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17. //把Test1Servlet里面转发到Test2Servlet里面的数据取出来
  18. //通过键取出来 在Test1中键是name
  19. Object name = request.getAttribute("name");
  20. response.setContentType("text/html;charset=utf-8");
  21. response.getWriter().append((String)name);
  22. }
  23. }

3.url的匹配原则【重点】

url对于服务器开发很重要,因为要通过url来访问资源

URL:统一资源定位符

用户在浏览器中申请的资源

http://localhost:8080/day45_507a/Test1Servlet

精准匹配

用注解写法,是精准匹配

  1. value = "/Test1Servlet"

模糊匹配

value = “*.do” 以.do结尾的 都可以访问到这个资源

value = “/*” 写任何资源都可以匹配到这个资源

4.ServletContext对象,资源共享【重点】

可以实现资源和资源之间的共享,但仅限于servlet和jsp

Context1
  1. package com.qfedu.d_servletcontext; /**
  2. * @author wodexinhuai
  3. * @create 2022-05-07-15:47
  4. */
  5. import javax.servlet.*;
  6. import javax.servlet.http.*;
  7. import javax.servlet.annotation.*;
  8. import java.io.IOException;
  9. @WebServlet(name = "ServletContext1", value = "/text1")
  10. public class ServletContext1 extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. doPost(request, response);
  14. }
  15. @Override
  16. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17. //获取当前上下文对象
  18. ServletContext servletContext = request.getServletContext();
  19. //给当前上下文对象设置值
  20. servletContext.setAttribute("name","海贼王onepiece");
  21. Object name = servletContext.getAttribute("name");
  22. response.setContentType("text/html;charset=utf-8");
  23. response.getWriter().append("共享的数据" + name);
  24. response.getWriter().append("<br>");//浏览器换行
  25. //上下文Context对象的几个方法
  26. //获取当前项目的实际路径
  27. String realPath = servletContext.getRealPath("/");
  28. response.getWriter().append(realPath);
  29. response.getWriter().append("<br>");//浏览器换行
  30. //获取服务器的信息
  31. String serverInfo = servletContext.getServerInfo();
  32. response.getWriter().append(serverInfo);
  33. response.getWriter().append("<br>");//浏览器换行
  34. //获取当前项目的根路径
  35. String contextPath = servletContext.getContextPath();
  36. response.getWriter().append(contextPath);
  37. }
  38. }

输出:
共享的数据海贼王onepiece
E:\idea_workspace\day45_507a\out\artifacts\day45_507a_war_exploded
Apache Tomcat/9.0.33
/day45_507a

Context2
  1. package com.qfedu.d_servletcontext; /**
  2. * @author wodexinhuai
  3. * @create 2022-05-07-15:47
  4. */
  5. import javax.servlet.*;
  6. import javax.servlet.http.*;
  7. import javax.servlet.annotation.*;
  8. import java.io.IOException;
  9. @WebServlet(name = "ServletContext2", value = "/text2")
  10. public class ServletContext2 extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. doPost(request, response);
  14. }
  15. @Override
  16. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17. //获取上下文对象
  18. ServletContext servletContext = request.getServletContext();
  19. //取值
  20. Object name = servletContext.getAttribute("name");
  21. response.setContentType("text/html;charset=utf-8");
  22. response.getWriter().append("这个是共享的数据" + name);
  23. }
  24. }

先访问资源text1,之后输出:这个是共享的数据海贼王onepiece

如果没有先访问设置值之后,输出:这个是共享的数据null

5.request的一些方法

  1. package com.qfedu.e_request; /**
  2. * @author wodexinhuai
  3. * @create 2022-05-07-16:06
  4. */
  5. import javax.servlet.*;
  6. import javax.servlet.http.*;
  7. import javax.servlet.annotation.*;
  8. import java.io.IOException;
  9. import java.util.Arrays;
  10. import java.util.Map;
  11. import java.util.Set;
  12. @WebServlet(name = "RequestServlet", value = "/RequestServlet")
  13. public class RequestServlet extends HttpServlet {
  14. @Override
  15. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  16. response.setContentType("text/html;charset=utf-8");
  17. //获取当前的请求方式
  18. String method = request.getMethod();
  19. response.getWriter().append(method);//get
  20. response.getWriter().append("<br>");//浏览器换行
  21. //获取当前的完整的url 返回值是StringBuffer
  22. StringBuffer requestURL = request.getRequestURL();
  23. response.getWriter().append(requestURL);
  24. response.getWriter().append("<br>");//浏览器换行
  25. //获取url的已备份 uri 统一资源的标识符 返回值是String
  26. String requestURI = request.getRequestURI();
  27. response.getWriter().append(requestURI);
  28. response.getWriter().append("<br>");//浏览器换行
  29. //获取请求参数
  30. String queryString = request.getQueryString();
  31. response.getWriter().append(queryString);
  32. response.getWriter().append("<br>");//浏览器换行
  33. //获取请求的参数,以map集合展示的
  34. Map<String, String[]> parameterMap = request.getParameterMap();
  35. Set<Map.Entry<String,String[]>> set = parameterMap.entrySet();
  36. for (Map.Entry<String, String[]> stringEntry : set) {
  37. response.getWriter().append(stringEntry.getKey());//获取键
  38. response.getWriter().append(Arrays.toString(stringEntry.getValue()));//获取值
  39. }
  40. response.getWriter().append("<br>");//浏览器换行
  41. }
  42. @Override
  43. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  44. doGet(request, response);
  45. }
  46. }

http://localhost:8080/day45_507a/RequestServlet?user=boer&pwd=123

  1. 输出:
  2. GET
  3. http://localhost:8080/day45_507a/RequestServlet
  4. /day45_507a/RequestServlet
  5. user=boer&pwd=123
  6. user[boer]pwd[123]

获取访问的主机信息

  1. package com.qfedu.e_request; /**
  2. * @author wodexinhuai
  3. * @create 2022-05-07-16:21
  4. */
  5. import javax.servlet.*;
  6. import javax.servlet.http.*;
  7. import javax.servlet.annotation.*;
  8. import java.io.IOException;
  9. @WebServlet(name = "RequestServlet2", value = "/RequestServlet2")
  10. public class RequestServlet2 extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13. //获取访问我的网站的的ip地址
  14. String remoteAddr = request.getRemoteAddr();
  15. System.out.println(remoteAddr);
  16. //获取访问我的网站的的主机地址
  17. String remoteHost = request.getRemoteHost();
  18. System.out.println(remoteHost);
  19. //获取访问我的网站的的主机端口
  20. int remotePort = request.getRemotePort();
  21. System.out.println(remotePort);
  22. response.setContentType("text/html;charset=utf-8");
  23. response.getWriter().append("呼叫博儿");
  24. }
  25. @Override
  26. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  27. doGet(request, response);
  28. }
  29. }

用同一局域网的电脑或者手机访问:

192.168.2.232:8080/day45_507a/RequestServlet2

会显示访问的电脑的ip地址和端口号

6.response的一些方法

  1. package com.qfedu.f_response; /**
  2. * @author wodexinhuai
  3. * @create 2022-05-07-16:36
  4. */
  5. import javax.servlet.*;
  6. import javax.servlet.http.*;
  7. import javax.servlet.annotation.*;
  8. import java.io.IOException;
  9. import java.io.PrintWriter;
  10. @WebServlet(name = "ResponseServlet", value = "/ResponseServlet")
  11. public class ResponseServlet extends HttpServlet {
  12. @Override
  13. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14. //设置响应乱码
  15. response.setContentType("text/html;charset=utf-8");
  16. //打印字符流 并写到浏览器上
  17. PrintWriter writer = response.getWriter();
  18. writer.append("博儿");
  19. writer.write("is a dog");
  20. }
  21. @Override
  22. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  23. doGet(request, response);
  24. }
  25. }