HttpServletRequest
类中,getAttribute()
方法和getParameter()
方法有什么区别?HttpServletRequest
类中,getAttribute()
方法和getParameter()
方法有什么区别?getParameter()
返回 HTTP 请求参数,这些参数是从客户端传递到服务器的。例如 http://example.com/servlet?parameter=1
。只能返回 String
类型。
getAttribute()
仅用于服务器端 - 在同一请求内填充请求属性,您可以在其中使用该属性。例如 - 您在 servlet 中设置一个属性,并从 JSP 中读取它。可以用于任何对象,而不仅仅是字符串。
${attrName}
这样的内容时,我猜想这些属性是通过request.getSession().setAttribute()
设置的? - ha9u63a7一般而言,参数是一个字符串值,最常见的应用场景是客户端向服务器发送数据(例如表单提交),然后从servlet request中获取。但这个规则有一个例外,即ServletContext初始参数,它们是在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
< p > getAttribute()
和getParameter()
之间的基本区别在于,第一个方法提取一个(序列化的)Java对象,而第二个方法提供一个字符串值。对于这两种情况,都会给出一个名称,以便查找并提取其值(无论是字符串还是Java Bean)。重要的是要知道属性不是参数。
属性的返回类型是一个Object,而参数的返回类型是一个String。在调用getAttribute(String name)
方法时,请记住必须进行属性转换。
此外,没有特定于servlet的属性,也没有会话参数。
本文是为了补充@Bozho的回答而撰写的,希望对其他人有所帮助。
-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()
将检索客户端提交的值。您将在服务器端获得该值。request.getAttribute()
是在服务器端完成的。您向请求添加属性,并将请求提交给另一个资源,客户端不知道此操作。因此,处理此操作的所有代码通常都在servlet中。getAttribute始终返回对象。getParameter
- 用于从客户端的HTML页面中获取所需的信息。
getAttribute
- 用于获取在另一个或同一JSP或Servlet页面中设置的参数。
基本上,如果您正在从一个jsp/servlet转发或者只是进入另一个jsp/servlet,除非选择将它们放在对象中并使用set-attribute存储在会话变量中,否则没有办法获得所需信息。
使用getAttribute,您可以检索会话变量。
来自http://www.coderanch.com/t/361868/Servlets/java/request-getParameter-request-getAttribute
"参数"是从客户端发送到服务器的名称/值对 - 通常是从HTML表单中发送的。参数只能具有字符串值。有时(例如使用GET请求),您将直接将其编码到URL中(在“?”后,每个都以name=value的形式出现,并且每个对由&分隔)。其他时候,当使用POST等方法时,它们包含在请求的正文中。
"属性"是一种服务器本地存储机制 - 存储在作用域属性中的内容除非您明确使其发生,否则永远不会传输到服务器外部。属性具有字符串名称,但存储对象值。请注意,属性特定于Java(它们存储Java对象),而参数是平台无关的(它们只是由通用字节组成的格式化字符串)。
总共有四个属性范围:“页面”(仅适用于JSP和标记文件),“请求”(限于当前客户端请求,请求完成后销毁),“会话”(存储在客户端会话中,在会话终止后失效),“应用程序”(存在于所有组件中,可在应用程序的整个部署生命周期内进行访问)。
底线是:从客户端获取数据时,请使用参数;将对象存储在服务器上供应用程序内部使用时,请使用作用域属性。
当在jsp中传递参数时,您应该使用.getParameter()
的另一种情况:
<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)