您当前的位置: 首页 >  servlet

Charge8

暂无认证

  • 4浏览

    0关注

    447博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Servlet 请求转发与URL重定向

Charge8 发布时间:2018-12-16 21:37:14 ,浏览量:4

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

              超链接:超链接

              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~

关注
打赏
1664721914
查看更多评论
立即登录/注册

微信扫码登录

0.0381s