f) base 标签的作用
演示
在web下创建a/b/c.html
c.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- base标签设置页面相对路径工作时参照的地址 href 属性就是参照的地址值 --> <base href="http://localhost:8080/07_servlet/a/b/"> </head> <body> 这是a下的b下的c.html页面<br/> <a href="../../index.html">跳回首页</a><br/> </body> </html>
在web下创建index.html
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> 这是web下的index.html<br/> <a href="a/b/c.html">a/b/c.html</a><br/> <a href="http://localhost:8080/07_servlet/forwardC">请求转发:a/b/c.html</a><br/> </body> </html>
在src/com.servlet下创建类ForwardC
ForwardC
package com.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ForwardC extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("经过了ForwardC程序"); req.getRequestDispatcher("/a/b/c.html").forward(req,resp); } }
在web.xml配置
<servlet> <servlet-name>ForwardC</servlet-name> <servlet-class>com.servlet.ForwardC</servlet-class> </servlet> <servlet-mapping> <servlet-name>ForwardC</servlet-name> <url-pattern>/forwardC</url-pattern> </servlet-mapping>
g) Web中的相对路径和绝对路径
在javaWeb中,路径分为相对路径和绝对路径两种:
相对路径是:
. 表示当前目录
. . 表示上一级目录
资源名 表示当前目录/资源名
绝对路径:
htp://ip:port/工程路径/资源路径
h) web 中 / 斜杠的不同意义
在web中 / 斜杠是一种绝对路径。
/斜杠如果被浏览器解析,得到的地址是http://ip:port
<a> href="/">斜杠</a>
/斜杠如果被服务器解析,得到的地址是:http://ip:port/工程路径
1、<url-pattern>/servlet1</url-pattern>
2、 servletContext.getRealPath("/"); 3、 request.getRequestDispatcher("/");
特殊情况:
response. sendRedict("/");
把斜杠发送给浏览器解析。得到http://ip:port/
2. HttpServletResponse类
a)HttpServletResponse类的作用
HttpServetResponse类和HtpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个Response对象传 递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息,
我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置
b)两个输出流的说明。
字节流 getOutputstream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个。
使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。
c) 如何往客户端回传数据
d)响应的乱码解决
要求:往客户端回传数据
package com.servlet; import javax.servlet.ServletException; 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 ResponseIOServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 要求:往客户端回传 字符串 数据。 // resp.getWriter(); // resp.getOutputStream(); //响应的乱码解决方案一(不推荐) // System.out.println(resp.getCharacterEncoding());//默认ISO-8859-1 // //设置服务器字符集UTF-8 // resp.setCharacterEncoding("UTF-8"); // //通过响应头,设置浏览器也使用UTF-8字符集//默认GBK // resp.setHeader("Content-Type","test/html;charset=UTf-8"); //响应的乱码解决方案二(推荐) //它会同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头 //此方法一定要在获取流对象之前才有效 resp.setContentType("test/html;charset=UTF-8"); System.out.println(resp.getCharacterEncoding()); PrintWriter writer = resp.getWriter(); // writer.write("response's context"); writer.write("我很帅"); } }
e) 请求重定向
请求重定向,是指客户端给服务器放请求,然后服务器告诉客户端说。我给你一个新地址。你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)。
代码演示
Response1
package com.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class Response1 extends HttpServlet { @Override protected 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"); //请求重定向实现方案二(推荐) resp.sendRedirect("http://localhost:8080/07_servlet/response2"); } }
Response2
package com.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class Response2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("response2'result"); } }
web.xml
<servlet> <servlet-name>Response1</servlet-name> <servlet-class>com.servlet.Response1</servlet-class> </servlet> <servlet-mapping> <servlet-name>Response1</servlet-name> <url-pattern>/response1</url-pattern> </servlet-mapping> <servlet> <servlet-name>Response2</servlet-name> <servlet-class>com.servlet.Response2</servlet-class> </servlet> <servlet-mapping> <servlet-name>Response2</servlet-name> <url-pattern>/response2</url-pattern> </servlet-mapping>