Servlet 请求转发与URL重定向

一、Web组件的交互

          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中的:

              超链接:<a href="/a.jsp">超链接</a>

              form表单:<form action="/a.jsp">

              js引用:<script type="text/javascript" src="${pageContext.request.contextPath}/static/js/jquery-3.3.1.min.js"></script>

              防止不出错, “/” 最好使用 ${pageContext.request.contextPath} 或者 <%=resquest.getContextPath()>替换

         Servlet里:

                   重定向:resp.sendRedirect(req.getContextPath() +"/index.jsp");         

      2)"/"被理解为WEB应用根目录

             Servlet里的:

                   请求转发:  req.getRequestDispatcher("/login.jsp").forward(req, resp);

             web.xml里的servlet-mapping中的url映射:

<servlet-mapping>
    <servlet-name>UserController</servlet-name>
    <url-pattern>/login.jsp</url-pattern>
</servlet-mapping>

简单demo

    <h4>登录页面</h4>
    <form action="<%=request.getContextPath() %>/login" method="post">
    	用户名: <input type="text" name="username"/><br/>
    	密   码: <input type="password" name="password"/><br/>
    	<input type="submit" value="登录"/>
    </form>
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~

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值