s1.请求转发:
* 请求转发通过HttpServletRequest对象获取请求转发器的实现 * 请求转发是服务器内部的行为,对客户端是隐蔽的 * 客户端只是发送了一次请求,客户端地址栏不变 * 服务端只产生了一对请求和响应对象,这一对请求和响应对象会继续传递给下一个资源 * 因为全程只有一个HttpServletRequest对象,所以请求参数可以传递,请求域中的数据可以传递 * 请求转发可以转发给其他serlvet动态资源,也可以转发给一些静态资源以实现页面跳转 * 请求转发可以转发给WEB-INF下受保护的资源 * 请求转发不能转发到本项目以外的外部资源 比如转发给:http://www.baidu.com
代码示例:
@WebServlet("/setvletb")
public class servlet2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//
String user = req.getParameter("user");
System.out.println(user);
System.out.println("servlet2执行了");
}
}
@WebServlet("/setvleta")
public class servlet1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求转发器
//转发到另一个服务器
RequestDispatcher servlet2 = req.getRequestDispatcher("setvletb");
//转发到其他静态资源
//RequestDispatcher requestDispatcher = req.getRequestDispatcher("a.html");
//让请求转发器做出转发动作
/*
* 请求转发相对路径处理方式和前端相同
*
* 绝对路径:
* 请求转发的绝对路径不需要加项目上下文
* req.getRequestDispatcher("/servlet2").forward(req,resp);
**/
//req.getRequestDispatcher("/servlet2").forward(req,resp);
servlet2.forward(req,resp);
}
}
servlet重定向:
* 1.响应重定向通过HttpServletResponse的sendRedirect方法实现 * 2.响应重定向是服务器端通过302响应码和路径,告诉客户端自己去找其他资源,是在服务器提示下的,客户端的行为 * 3.客户端至少发送了两次请求,客户端地址栏是变化的 * 4.服务器产生了多对请求和响应对象,且请求和响应对象不会传递给下一个资源 * 5.因为全程产生了多个HttpServletResponse对象,所以请求参数不可以传递,请求域中的数据也不可以传递 * 6.重定向可以是其他servlet动态资源,也可以是一些静态资源以实现页面跳转 * 7.重定向不可以访问WEN-INF下受保护的资源 * 8.重定向可以访问到本项目之外的 外部资源 * * 重点:同样实现了页面跳转,优先使用重定向
代码示例:
@WebServlet("/servletA")
public class servletA extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servletA执行了");
//响应重定向
//resp.sendRedirect("servletB"); //这个方法,设置了响应状态码为302,响应location头信息为servletB
//这里的路径设置和前端的相同
//同样可以跳转到视图资源
resp.sendRedirect("a.html");
}
}
@WebServlet("/servletB")
public class servletB extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servletB执行了");
}
}
设置serlvet请求数据的编码格式及响应时的编码数据格式:
1.设置serlvet请求数据的编码格式
@WebServlet("/servletResponse")
public class testResponse extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置接受请求数据的数据格式,更适用于post,
req.setCharacterEncoding("UTF-8");
}
}
设置serlvet响应时的编码数据格式:
@WebServlet("/servletResponse")
public class testResponse extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应体的数据编码格式,一般建议写下面的 两步,第一步设置响应体的数据编码格式,第二步设置客户端解析时的数据编码格式
//设置响应体的数据编码格式
resp.setCharacterEncoding("UTF-8");
//设置客户端解析时的数据格式
resp.setContentType("text/html;character=UTF-8");
resp.getWriter().write("你好,世界");
}
}
相对路径和绝对路径设置
相对路径:不以/开头 首先获取当前访问资源的路径:http://localhost:8080/demo3/a.html 当前资源所在路径是:http://localhost:8080/demo3/ 当前资源的路径是:a.html 目标资源的相对路径:image/a.jpg 所以这里在访问目标资源路径是,就是上面的当前资源所在路径+目标资源路径
代码示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
this is page a
<br>
<!-- 这里使用的是相对路径:不以/开头
首先获取当前访问资源的路径:http://localhost:8080/demo3/a.html
当前资源所在路径是:http://localhost:8080/demo3/
当前资源的路径是:a.html
目标资源的相对路径:image/a.jpg
所以这里在访问目标资源路径是,就是上面的当前资源所在路径+目标资源路径
-->
<img src="image/a.jpg">
</body>
</html>
绝对路径:
始终以固定的出发点去寻找目标资源,和当前资源所在路径没有关系 语法:以/开头 优点:目标资源路径下的写法不会受当前资源路径的路径所影响,始终是固定的写法 缺点:绝对路径要补充项目的上下文,这个上下文是会改变的 解决措施1: 可以在head->base->href设置公共前缀,设置之后,可以把相对路径变为绝对路径
代码示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
this is page a
<br>
<!--这里使用绝对路径
始终以固定的出发点去寻找目标资源,和当前资源所在路径没有关系
语法:以/开头
优点:目标资源路径下的写法不会受当前资源路径的路径所影响,始终是固定的写法
缺点:绝对路径要补充项目的上下文,这个上下文是会改变的
解决措施1:
可以在head->base->href设置公共前缀,设置之后,可以把相对路径变为绝对路径
-->
<br>
<img src="/demo3/image/b.jpg"/>
</body>
</html>
通过在head->base->href设置公共前缀,设置之后,可以把相对路径变为绝对路径
代码示例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 这里设置路径的公共前缀-->
<base href="/demo3/">
</head>
<body>
this is page a
<br>
<!--这里使用绝对路径
始终以固定的出发点去寻找目标资源,和当前资源所在路径没有关系
语法:以/开头
优点:目标资源路径下的写法不会受当前资源路径的路径所影响,始终是固定的写法
缺点:绝对路径要补充项目的上下文,这个上下文是会改变的
解决措施1:
可以在head->base->href设置公共前缀,设置之后,可以把相对路径变为绝对路径
所以这里的访问路径就是:http://localhost:8080/demo3/image/b.jpg
把相对路径变成了绝对路径
-->
<img src="image/b.jpg">
</body>
</html>