J2EE中几个易混淆的点的不同!

以下内容为网页摘抄


URL和URI:

        

作者:daixinye
链接:https://www.zhihu.com/question/21950864/answer/154309494
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来。
拿人做例子,假设这个世界上所有人的名字都不能重复,那么名字就是URI的一个实例,通过名字这个字符串就可以标识出唯一的一个人。
现实当中名字当然是会重复的,所以身份证号才是URI,通过身份证号能让我们能且仅能确定一个人。
那统一资源定位符URL是什么呢。也拿人做例子然后跟HTTP的URL做类比,就可以有:

动物住址协议://地球/中国/浙江省/杭州市/西湖区/某大学/14号宿舍楼/525号寝/张三.人

可以看到,这个字符串同样标识出了唯一的一个人,起到了URI的作用,所以URL是URI的子集。URL是以描述人的位置来唯一确定一个人的。
在上文我们用身份证号也可以唯一确定一个人。对于这个在杭州的张三,我们也可以用:

身份证号:123456789

来标识他。
所以不论是用定位的方式还是用编号的方式,我们都可以唯一确定一个人,都是URl的一种实现,而URL就是用定位的方式实现的URI。

回到Web上,假设所有的Html文档都有唯一的编号,记作html:xxxxx,xxxxx是一串数字,即Html文档的身份证号码,这个能唯一标识一个Html文档,那么这个号码就是一个URI。
而URL则通过描述是哪个主机上哪个路径上的文件来唯一确定一个资源,也就是定位的方式来实现的URI。
对于现在网址我更倾向于叫它URL,毕竟它提供了资源的位置信息,如果有一天网址通过号码来标识变成了 741236985.html,那感觉叫成URI更为合适,不过这样子的话还得想办法找到这个资源咯…

response.sendRedirect() 和 dispatcher.forward(request,response):

        

Java Web开发中,采用MVC模式的时候,在控制器完成模型的调用之后会选择界面对用户响应,用常有两种方式:

1、通过response对象的sendRedirect方法。

2、通过RequestDispatcher对象的forward方法。

例如要跳转登录界面login.jsp,可以使用下面的两种方式:

1、使用response

response.sendRedirect(request.getContextPath()+"/main.jsp");     // 使用request.getContextPath()获取网站根目录

2、使用RequestDispatcher

RequestDispatcher rd = request.getRequestDispatcher("login.jsp");

rd.forward(request,response);

这两种方式有什么区别?什么情况下应该使用哪一种方式呢?

首先介绍两者的区别。

第一点区别,过程不同:第一种方式相当于浏览器接收到了响应之后又向服务器发送了一次请求,所以相当于两次请求。第二种方式相当于方法调用,在执行当前文件的过程中转向执行目标文件,两个文件(当前文件和目标文件)属于同一次请求,最本质的特点就是两次请求共享了reques对象和response对象。

第二点区别,地址栏不同:第一种方式下用户在浏览器地址栏中看到的是目标文件的地址,第二种方式下用户在浏览器地址栏中看到的是当前文件的地址。这一点也非常重要,后面介绍。

在使用的时候具体应如何选择呢?

如果两个文件的关系非常密切,则应该使用RequestDispatcher,如果两个文件没有直接的关联关系,则应该使用response的sendRedirect方法。什么样的关系算是关系密切,什么样的关系算是没有直接的关联关系呢?例如查询的控制器和查询的结果界面之间就应该算是关系密切,因为查询控制器处理完之后肯定要转向查询结果界面。再例如添加信息的控制器和查询控制器之间的关系就是没有直接关系,通常在添加信息之后会跳转到列表界面的控制器然后再跳转到列表界面,修改信息或者删除信息之后也可能会跳转到列表界面的控制器然后再跳转到列表界面。

下面是两个比较特殊的应用:

1、如果希望通过request把当前在控制器中获取的信息传递给目标文件(通过request.setAttribute和request.getAttribute),这时候应该选择RequestDispatcher。因为需要当前文件和目标文件共享request对象。通常用于查询。

2、对数据进行修改(包括删除和添加操作)的功能的控制器与之后的界面或者控制器应该采用response.sendRedirect方式。如果采用了RequestDiapatcher的forward方式,会产生严重错误。因为地址栏是修改信息的控制器,如果用户在刷新的时候,会重新发送一次对数据进行修改的请求,这不是用户想看到的结果。所以有同学在做添加功能的时候,每刷新一次就添加一条。

如何采用第二种方式,如何传递数据呢?有两种方式:

1、可以选择session,但是在第二个文件中一定要删除。

2、可以在请求字符串中编写,例如login.jsp?info="用户不存在!

 

为什么response.sendRedirect()不跳转,在其后加上return;就能够跳转了呢

response.sendRedirect是通过浏览器来做转向的,所以只有在整个页面处理完成后,才会有实际的动作。

Cookie和Session:

Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;

Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式

具体看一看这个博客:点击打开链接

猜你喜欢

转载自blog.csdn.net/qq_38016931/article/details/80033405
今日推荐