Web组件(Servlet/JSP)的交互:Web组件之间的跳转,数据共享。
1、Web组件之间的跳转方式有:
1)请求转发 forword
HttpServletRequest对象调用getRequestDispatcher(path)方法,path指定转发到的目标地址
getRequestDispatcher方法返回的RequestDispatcher对象调用forward(request, response)方法实现最终的转发动作。
即:req.getRequestDispatcher("/login.jsp").forward(req, resp);
2)URL重定向 redirect
HttpServletResponse对象调用sendRedirect(path);path指重定向的目标地址。
即:resp.sendRedirect(req.getContextPath() +"/index.jsp");
2、请求转发与URL重定向的区别
1)请求转发
请求转发是一种服务器跳转行为
浏览器地址栏不发生改变,而且只发送1次请求,
共享同一个请求中的数据,最终响应给浏览器的内容有最后一个Servlet资源决定
Path路径指相对路径(“/”表示WEB应用根目录)
请求转发不能跨域访问,只能跳转当前应用中的资源
请求转发可以访问WEB-INF目录下的资源
2)URL重定向
URL重定向是一种客户端跳转行为
浏览器地址栏发生改变,URL重定向发送2次请求
不能共享请求中的数据(由于是两次独立的请求),最终响应给浏览器的内容有最后一个Servlet资源决定
Path路径指绝对路径(“/”表示站点根目录)
URL重定向能跨域访问,可以访问其他应用中的资源
URL重定向不能访问WEB-INF目录下的资源
3、请求转发与URL重定向,如何选择
必须使用请求转发 forword:需要共享请求中的数据,或者访问WEB-INF目录下的资源
必须使用RL重定向 redirect:需要跨域访问,避免表单的重复提交。
其他情况,任选
二、中文乱码问题https://blog.csdn.net/qq_42402854/article/details/82825941
三、绝对路径与相对路径建议原则:尽量使用绝对路径,避免相对路径.
http://127.0.0.1:8080/myservlet/login
1、绝对路径和相对路径的本质在于 "/" 代表 "根目录" 时的实际位置不同
浏览器认为:根目录指站点根目录(域名根目录,服务器根目录),即 http://127.0.0.1:8080/
web项目认为:根目录指WEB应用根目录(域名根目录 + 项目名),即 http://127.0.0.1:8080/myservlet/
2、在项目中,如何正确使用 "/"
1)"/" 被理解为站点根目录
jsp中的:
超链接:超链接
form表单:
js引用:
防止不出错, “/” 最好使用 ${pageContext.request.contextPath} 或者 替换
Servlet里:
重定向:resp.sendRedirect(req.getContextPath() +"/index.jsp");
2)"/"被理解为WEB应用根目录
Servlet里的:
请求转发: req.getRequestDispatcher("/login.jsp").forward(req, resp);
web.xml里的servlet-mapping中的url映射:
UserController
/login.jsp
简单demo
登录页面
用户名:
密 码:
public class LoginServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得登录的账号和密码
String username = req.getParameter("username");
String password = req.getParameter("password");
if(username.equals("admin") && password.equals("admin123")){//登录成功
//重定向到index.jsp
//resp.sendRedirect("/myservlet/index.jsp");
resp.sendRedirect(req.getContextPath() +"/index.jsp"); //推荐使用
}else{//登录失败
//请求转发到login.jsp
req.getRequestDispatcher("/login.jsp").forward(req, resp);
}
}
}
ends~