getAttribute()和getParameter()的区别

334
HttpServletRequest类中,getAttribute()方法和getParameter()方法有什么区别?

1
你是在哪个类/包/API中?你有尝试阅读相关方法的JavaDocs吗? - Andrew Thompson
6
相关问题:Servlets是如何工作的?实例化、会话变量和多线程?回答:Servlet是运行在Web服务器上的Java程序,用于处理HTTP请求并返回响应。Servlet可以被实例化为单个对象,并由容器管理其生命周期。Servlet中的会话变量可以持久保存用户会话信息,而请求范围和应用程序范围变量则分别用于在单个请求和整个应用程序中共享数据。Servlet容器通常使用多线程来同时处理多个请求,因此开发人员需要确保Servlet本身是线程安全的,以避免并发访问导致的问题。 - BalusC
属性仅适用于HTTP请求,有助于Servlet之间的协作。 - bytefish
10个回答

375
  • getParameter() 返回 HTTP 请求参数,这些参数是从客户端传递到服务器的。例如 http://example.com/servlet?parameter=1。只能返回 String 类型。

  • getAttribute() 仅用于服务器端 - 在同一请求内填充请求属性,您可以在其中使用该属性。例如 - 您在 servlet 中设置一个属性,并从 JSP 中读取它。可以用于任何对象,而不仅仅是字符串。


5
当您在jsp页面中使用${attrName}这样的内容时,我猜想这些属性是通过request.getSession().setAttribute()设置的? - ha9u63a7
由于请求属性存储在服务器端,我是否可以为跨服务器的 POST-重定向-获取请求设置请求属性? 我希望通过重定向请求中的属性将信息从一个服务器发送到另一个JSF服务器。目前,我能够通过POST请求发送。 - user2918640
在这种情况下,“Parameter”似乎是“查询字符串”的同义词。 - BTRUE

59

一般而言,参数是一个字符串值,最常见的应用场景是客户端向服务器发送数据(例如表单提交),然后从servlet request中获取。但这个规则有一个例外,即ServletContext初始参数,它们是在web.xml中配置的字符串参数,并存在于服务器上。

属性是一个服务器变量,存在于指定的作用域内,即:

  • application,在整个应用程序的生命周期内都可用
  • session,在会话的生命周期内都可用
  • request,仅在请求的生命周期内可用
  • page(仅适用于JSP),仅在当前JSP页面中可用

通常,参数是一个字符串值。除了字符串,我们还可以发送什么? - mfaani
与request.setAttribute相似,这里的对象是指编程中的对象。 - A B

53

request.getParameter()

使用 request.getParameter() 提取请求参数(即通过提交 html 表单发送的数据)。request.getParameter() 总是返回一个 String 类型值,该数据来自客户端。

request.getAttribute()

使用 request.getAttribute() 获取在服务器端添加到请求范围中的对象,例如使用 request.setAttribute()。您可以在此处添加任何类型的对象,例如 Strings、自定义对象等。您将属性添加到请求中,并将请求转发到另一个资源,客户端不知道这一点。因此,处理此任务的所有代码通常会在 JSP/servlet 中。您可以使用 request.setAttribute() 添加额外信息,并将当前请求转发/重定向到另一个资源。

例如,考虑 first.jsp:

//First Page : first.jsp
<%@ page import="java.util.*" import="java.io.*"%>
<% request.setAttribute("PAGE", "first.jsp");%>
<jsp:forward page="/second.jsp"/>

和 second.jsp:

<%@ page import="java.util.*" import="java.io.*"%>
From Which Page : <%=request.getAttribute("PAGE")%><br>
Data From Client : <%=request.getParameter("CLIENT")%>

从您的浏览器中运行first.jsp?CLIENT=you,并在您的浏览器上输出

From Which Page : *first.jsp*
Data From Client : you
< p > getAttribute()getParameter()之间的基本区别在于,第一个方法提取一个(序列化的)Java对象,而第二个方法提供一个字符串值。对于这两种情况,都会给出一个名称,以便查找并提取其值(无论是字符串还是Java Bean)。


5
这是一个很好的例子。这应该成为被接受的答案。被接受的答案是正确的,但对于新手来说,一个例子可以阐明一切。谢谢。 - user5228393
很好的回答。也许值得补充的是,当你在服务器端拦截客户端请求并向请求附加一些额外信息时,属性的作用域就会发挥作用。 - nabster

28

重要的是要知道属性不是参数

属性的返回类型是一个Object,而参数的返回类型是一个String。在调用getAttribute(String name)方法时,请记住必须进行属性转换。

此外,没有特定于servlet的属性,也没有会话参数

本文是为了补充@Bozho的回答而撰写的,希望对其他人有所帮助。


11
getAttribute和getParameter的区别在于,getParameter将返回由HTML表单提交或包含在查询字符串中的参数的值。getAttribute返回您在请求中设置的对象,您唯一可以使用这个方法是与RequestDispatcher结合使用。您可以使用RequestDispatcher将请求转发到另一个资源(JSP / Servlet)。因此,在转发请求之前,您可以设置一个属性,该属性将在下一个资源中可用。

6

-getParameter() :

<html>
<body>
<form name="testForm" method="post" action="testJSP.jsp">
<input type="text" name="testParam" value="ClientParam">
<input type="submit">
</form>
</body>
</html>

    <html>
    <body>
    <%
    String sValue = request.getParameter("testParam");
    %>
    <%= sValue %>
    </body>
    </html>
request.getParameter("testParam")会获取名为“testParam”的输入框在表单中的值,该输入框的名称为“Client param”。然后它将打印出这个值,所以你应该在屏幕上看到“Client Param”。因此,request.getParameter()将检索客户端提交的值。您将在服务器端获得该值。
- getAttribute():request.getAttribute()是在服务器端完成的。您向请求添加属性,并将请求提交给另一个资源,客户端不知道此操作。因此,处理此操作的所有代码通常都在servlet中。getAttribute始终返回对象。

4

getParameter - 用于从客户端的HTML页面中获取所需的信息。

getAttribute - 用于获取在另一个或同一JSP或Servlet页面中设置的参数。

基本上,如果您正在从一个jsp/servlet转发或者只是进入另一个jsp/servlet,除非选择将它们放在对象中并使用set-attribute存储在会话变量中,否则没有办法获得所需信息。

使用getAttribute,您可以检索会话变量。


4

来自http://www.coderanch.com/t/361868/Servlets/java/request-getParameter-request-getAttribute

"参数"是从客户端发送到服务器的名称/值对 - 通常是从HTML表单中发送的。参数只能具有字符串值。有时(例如使用GET请求),您将直接将其编码到URL中(在“?”后,每个都以name=value的形式出现,并且每个对由&分隔)。其他时候,当使用POST等方法时,它们包含在请求的正文中。

"属性"是一种服务器本地存储机制 - 存储在作用域属性中的内容除非您明确使其发生,否则永远不会传输到服务器外部。属性具有字符串名称,但存储对象值。请注意,属性特定于Java(它们存储Java对象),而参数是平台无关的(它们只是由通用字节组成的格式化字符串)。

总共有四个属性范围:“页面”(仅适用于JSP和标记文件),“请求”(限于当前客户端请求,请求完成后销毁),“会话”(存储在客户端会话中,在会话终止后失效),“应用程序”(存在于所有组件中,可在应用程序的整个部署生命周期内进行访问)。

底线是:从客户端获取数据时,请使用参数;将对象存储在服务器上供应用程序内部使用时,请使用作用域属性。


4

当在jsp中传递参数时,您应该使用.getParameter()的另一种情况:

<jsp:forward page="destination.jsp">
    <jsp:param name="userName" value="hamid"/>
</jsp:forward>

destination.jsp 中,您可以像这样访问 userName:
request.getParameter("userName")

-8

getAttribute()getParameter()的基本区别在于返回类型。

java.lang.Object getAttribute(java.lang.String name)
java.lang.String getParameter(java.lang.String name)

2
你对此不正确。 - Bogdan M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接