1.重定向:跳转页面
设置重定向,让其跳转到主页面 target.html
重定向是浏览器的行为,response下面的方法
当代码进入LoginServlet资源后,跳转到target.html目标网页
响应.getParameter(“name”)
响应.sendRedirect(“目标页面”)
login.html
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><form action="LoginServlet" method="post">姓名:<input type="text" name="user"><br>密码:<input type="password" name="pwd"><br><input type="submit" name="登录"></form></body></html>
target.html 目标
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body>我是主页<!-- window.history.back() 返回上一个历史页面 --><button onclick="window.history.back()">返回</button></body></html>
LoginServlet.java
package com.qfedu.a_redirect; /*** @author wodexinhuai* @create 2022-05-07-14:18*/import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet("/LoginServlet")public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");//post中文乱码解决方案String user = request.getParameter("user");String pwd = request.getParameter("pwd");System.out.println(user + ":" + pwd);//设置重定向,让其跳转到主页面 target.html//重定向是浏览器的行为,response下面的方法//当代码进入LoginServlet资源后,response.sendRedirect("target.html");// response.sendRedirect("http://www.baidu.com");}}
2.转发:请求资源a,显示转发资源b
转发是服务器的行为 request请求
请求的test1的资源,显示的是转发后的资源(Test2)
Test1
package com.qfedu.b_zhuanfa; /*** @author wodexinhuai* @create 2022-05-07-14:37*/import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet(name = "Test1Servlet", value = "/Test1Servlet")public class Test1Servlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("用户请求Test1Servlet资源");//转发会带着数据(request对象)到另外一个资源中//request带有数据 键值对 name:呼叫博儿request.setAttribute("name","呼叫博儿");//转发是服务器的行为request.getRequestDispatcher("Test2Servlet").forward(request,response);}}
Test2
package com.qfedu.b_zhuanfa; /*** @author wodexinhuai* @create 2022-05-07-14:41*/import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet(name = "Test2Servlet", value = "/Test2Servlet")public class Test2Servlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//把Test1Servlet里面转发到Test2Servlet里面的数据取出来//通过键取出来 在Test1中键是nameObject name = request.getAttribute("name");response.setContentType("text/html;charset=utf-8");response.getWriter().append((String)name);}}
3.url的匹配原则【重点】
url对于服务器开发很重要,因为要通过url来访问资源
URL:统一资源定位符
用户在浏览器中申请的资源
http://localhost:8080/day45_507a/Test1Servlet
精准匹配
用注解写法,是精准匹配
value = "/Test1Servlet"
模糊匹配
value = “*.do” 以.do结尾的 都可以访问到这个资源
value = “/*” 写任何资源都可以匹配到这个资源
4.ServletContext对象,资源共享【重点】
可以实现资源和资源之间的共享,但仅限于servlet和jsp
Context1
package com.qfedu.d_servletcontext; /*** @author wodexinhuai* @create 2022-05-07-15:47*/import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet(name = "ServletContext1", value = "/text1")public class ServletContext1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取当前上下文对象ServletContext servletContext = request.getServletContext();//给当前上下文对象设置值servletContext.setAttribute("name","海贼王onepiece");Object name = servletContext.getAttribute("name");response.setContentType("text/html;charset=utf-8");response.getWriter().append("共享的数据" + name);response.getWriter().append("<br>");//浏览器换行//上下文Context对象的几个方法//获取当前项目的实际路径String realPath = servletContext.getRealPath("/");response.getWriter().append(realPath);response.getWriter().append("<br>");//浏览器换行//获取服务器的信息String serverInfo = servletContext.getServerInfo();response.getWriter().append(serverInfo);response.getWriter().append("<br>");//浏览器换行//获取当前项目的根路径String contextPath = servletContext.getContextPath();response.getWriter().append(contextPath);}}
输出:
共享的数据海贼王onepiece
E:\idea_workspace\day45_507a\out\artifacts\day45_507a_war_exploded
Apache Tomcat/9.0.33
/day45_507a
Context2
package com.qfedu.d_servletcontext; /*** @author wodexinhuai* @create 2022-05-07-15:47*/import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet(name = "ServletContext2", value = "/text2")public class ServletContext2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取上下文对象ServletContext servletContext = request.getServletContext();//取值Object name = servletContext.getAttribute("name");response.setContentType("text/html;charset=utf-8");response.getWriter().append("这个是共享的数据" + name);}}
先访问资源text1,之后输出:这个是共享的数据海贼王onepiece
如果没有先访问设置值之后,输出:这个是共享的数据null
5.request的一些方法
package com.qfedu.e_request; /*** @author wodexinhuai* @create 2022-05-07-16:06*/import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;import java.util.Arrays;import java.util.Map;import java.util.Set;@WebServlet(name = "RequestServlet", value = "/RequestServlet")public class RequestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");//获取当前的请求方式String method = request.getMethod();response.getWriter().append(method);//getresponse.getWriter().append("<br>");//浏览器换行//获取当前的完整的url 返回值是StringBufferStringBuffer requestURL = request.getRequestURL();response.getWriter().append(requestURL);response.getWriter().append("<br>");//浏览器换行//获取url的已备份 uri 统一资源的标识符 返回值是StringString requestURI = request.getRequestURI();response.getWriter().append(requestURI);response.getWriter().append("<br>");//浏览器换行//获取请求参数String queryString = request.getQueryString();response.getWriter().append(queryString);response.getWriter().append("<br>");//浏览器换行//获取请求的参数,以map集合展示的Map<String, String[]> parameterMap = request.getParameterMap();Set<Map.Entry<String,String[]>> set = parameterMap.entrySet();for (Map.Entry<String, String[]> stringEntry : set) {response.getWriter().append(stringEntry.getKey());//获取键response.getWriter().append(Arrays.toString(stringEntry.getValue()));//获取值}response.getWriter().append("<br>");//浏览器换行}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
http://localhost:8080/day45_507a/RequestServlet?user=boer&pwd=123
输出:GEThttp://localhost:8080/day45_507a/RequestServlet/day45_507a/RequestServletuser=boer&pwd=123user[boer]pwd[123]
获取访问的主机信息
package com.qfedu.e_request; /*** @author wodexinhuai* @create 2022-05-07-16:21*/import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;@WebServlet(name = "RequestServlet2", value = "/RequestServlet2")public class RequestServlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取访问我的网站的的ip地址String remoteAddr = request.getRemoteAddr();System.out.println(remoteAddr);//获取访问我的网站的的主机地址String remoteHost = request.getRemoteHost();System.out.println(remoteHost);//获取访问我的网站的的主机端口int remotePort = request.getRemotePort();System.out.println(remotePort);response.setContentType("text/html;charset=utf-8");response.getWriter().append("呼叫博儿");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
用同一局域网的电脑或者手机访问:
192.168.2.232:8080/day45_507a/RequestServlet2
会显示访问的电脑的ip地址和端口号
6.response的一些方法
package com.qfedu.f_response; /*** @author wodexinhuai* @create 2022-05-07-16:36*/import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;import java.io.PrintWriter;@WebServlet(name = "ResponseServlet", value = "/ResponseServlet")public class ResponseServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置响应乱码response.setContentType("text/html;charset=utf-8");//打印字符流 并写到浏览器上PrintWriter writer = response.getWriter();writer.append("博儿");writer.write("is a dog");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
