model.addAttribute()和request.setAttribute()有什么区别?

request.setAttribute()

属于页面之间的传值,从a.jsp到b.jsp一次传递,之后这个request就会失去他的作用范围,再传就要重新设一个request.setAttribute()。(使用session.setAttribute()会在一个过程中始终保持这个值)

注:javascript与jsp中不能相互传值,因为javascript运行在客户端,jsp运行在服务器端。若想使他们能够相互传参数,可以在jsp页面中设置一个hidden属性的控件,用它的value来传递所需的数值。

1、把js直接写在了JSP页面,所以能获取到。如果单独把JS抽离出来是不可能获取到的。前者服务端解析能或许到,后者客户端解析获取不到。

2、js里是在客户端执行的,不能直接获取,因为EL表达式是在服务器的时候被解析的,所以可以获取到。一个是客户端的东西,一个是服务器端的东西。

3、jsp能取到,那是因为他本身就是servlet。js不可能有方法直接获取到HttpServletRequest里面的属性值。

4、setAttribute是服务器行为,到了客户端就无效了,也谈不上如何用。除非你在jsp的时候就写到js变量里,或者使用ajax请求你需要的数据。

下面是 setAttribute()的源码以及注解:

/**
     * Stores an attribute in this request.
     * Attributes are reset between requests.  This method is most
     * often used in conjunction with {@link RequestDispatcher}.
     *
     * 

Attribute names should follow the same conventions as * package names. Names beginning with java.*, * javax.*, and com.sun.*, are * reserved for use by Sun Microsystems. *
If the object passed in is null, the effect is the same as * calling {@link #removeAttribute}. *
It is warned that when the request is dispatched from the * servlet resides in a different web application by * RequestDispatcher, the object set by this method * may not be correctly retrieved in the caller servlet. * * @param name a String specifying * the name of the attribute * * @param o the Object to be stored * */ public void setAttribute(String name, Object o);

model.addAttribute()

该方法的作用跟request.setAttribute()的本质一样,就是为了给JSP页面传值。

下面是addAttribute()的源码以及注解:

   /**
	 * Add the supplied attribute under the supplied name.
	 * @param attributeName the name of the model attribute (never {@code null})
	 * @param attributeValue the model attribute value (can be {@code null})
	 */
	Model addAttribute(String attributeName, Object attributeValue);

其他文章里面有提到,这两个方法的输出的值不一样,可参考:

https://blog.csdn.net/csdn1115698735/article/details/82426553

也有提到两个方法设置的值的数量也不一样,可参考:

https://blog.csdn.net/qq_32187411/article/details/53735240

 

 

你可能感兴趣的:(日常小知识)