【发布时间】:2011-07-11 18:05:53
【问题描述】:
HttpServletRequest 类中的getAttribute() 和getParameter() 方法有什么区别?
【问题讨论】:
-
在什么类/包/API中?您是否尝试阅读 JavaDocs 以了解相关方法?
-
属性仅用于帮助 servlet 协同工作的 http 请求
HttpServletRequest 类中的getAttribute() 和getParameter() 方法有什么区别?
【问题讨论】:
getParameter() 返回 http 请求参数。那些从客户端传递到服务器的。例如http://example.com/servlet?parameter=1。只能返回String
getAttribute() 仅用于服务器端 - 您可以使用可在同一请求中使用的属性填充请求。例如 - 您在 servlet 中设置一个属性,然后从 JSP 中读取它。可用于任何对象,而不仅仅是字符串。
【讨论】:
${attrName}之类的东西时,这些是你使用request.getSession().setAttribute()设置的属性?
通常,参数是一个字符串值,最常见的是从客户端发送到服务器(例如表单帖子)并从servlet request 检索。令人沮丧的例外是ServletContext initial parameters,它们是在 web.xml 中配置并存在于服务器上的字符串参数。
属性是存在于指定范围内的服务器变量,即:
application,在整个应用程序的生命周期内都可用session,在会话期间可用request,仅在请求的生命周期内可用page(仅限 JSP),仅适用于当前 JSP 页面【讨论】:
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
getAttribute() 和getParameter() 的基本区别在于,第一种方法提取(序列化)Java 对象,而另一种方法提供 String 值。对于这两种情况,都会给出一个名称,以便可以查找和提取其值(无论是字符串还是 java bean)。
【讨论】:
了解属性不是参数至关重要。
属性的返回类型是Object,而参数的返回类型是String。调用getAttribute(String name) 方法时,请记住必须强制转换属性。
此外,没有特定于 servlet 的属性,也没有会话参数。
写这篇文章的目的是连接@Bozho 的回复,作为对其他人有用的附加信息。
【讨论】:
getAttribute 和 getParameter 之间的区别在于 getParameter 将返回由 HTML 表单提交或包含在查询字符串中的参数的值。 getAttribute 返回您在请求中设置的对象,您可以使用它的唯一方法是与 RequestDispatcher 结合使用。您使用 RequestDispatcher 将请求转发到另一个资源(JSP/Servlet)。因此,在您转发请求之前,您可以设置一个可用于下一个资源的属性。
【讨论】:
-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”的输入框的发布表单中获取值,即“客户端参数”。然后它将打印出来,因此您应该在屏幕上看到“客户端参数”。因此 request.getParameter() 将检索客户端已提交的值。您将在服务器端获取值。
-getAttribute() :
request.getAttribute(),这一切都在服务器端完成。您将属性添加到请求并将请求提交给另一个资源,客户端不知道这一点。所以所有处理这个的代码通常都在 servlets.getAttribute 中总是返回对象。
【讨论】:
getParameter - 用于从客户的 HTML 页面获取您需要的信息
getAttribute - 这用于获取先前在另一个或相同的 JSP 或 Servlet 页面中设置的参数。
基本上,如果您正在转发或只是从一个 jsp/servlet 到另一个 jsp/servlet,除非您选择将它们放在一个 Object 中并使用 set-attribute 存储在一个会话变量。
使用 getAttribute,您可以检索 Session 变量。
【讨论】:
来自http://www.coderanch.com/t/361868/Servlets/java/request-getParameter-request-getAttribute
“参数”是从客户端发送到服务器的名称/值对 - 通常,来自 HTML 表单。参数只能有字符串值。有时(例如使用 GET 请求)你会看到这些 直接编码到 URL 中(在 ? 之后,每个都在表单中 name=value,每对用 &) 分隔。其他时候,他们是 在使用 POST 等方法时包含在请求的正文中。
“属性”是一种服务器本地存储机制 - 没有存储任何内容 范围属性永远不会在服务器之外传输,除非您 明确地做到这一点。属性具有字符串名称,但存储 对象值。请注意,属性特定于 Java(它们存储 Java 对象),而参数是平台无关的(它们是 仅由通用字节组成的格式化字符串)。
共有四个属性范围:“页面”(用于JSP和标签 文件),“请求”(仅限于当前客户端的请求, 请求完成后销毁),“会话”(存储在 客户端的会话,会话终止后失效), “应用程序”(存在于所有组件在整个过程中访问 应用程序的已部署生命周期)。
底线是:从 客户端,在服务器上存储对象时使用范围属性 仅供您的应用在内部使用。
【讨论】:
另一种应该使用.getParameter()的情况是在jsp中使用参数转发时:
<jsp:forward page="destination.jsp">
<jsp:param name="userName" value="hamid"/>
</jsp:forward>
在destination.jsp,你可以像这样访问userName:
request.getParameter("userName")
【讨论】:
getAttribute() 和 getParameter() 的基本区别在于返回类型。
java.lang.Object getAttribute(java.lang.String name)
java.lang.String getParameter(java.lang.String name)
【讨论】: