如何使用JSP从URL获取参数


192

在JSP中,如何从URL获取参数?

例如,我有一个www.somesite.com/Transaction_List.jsp?accountID=5
要获取的

URL5 。 是否有request.getAttribute(“ accountID”)之类的会话或类似内容?

Answers:


178

在GET请求中,请求参数取自查询字符串(URL上问号后面的数据)。例如,URL http://hostname.com?p1=v1&p2=v2包含两个请求参数--p1和p2。在POST请求中,请求参数既取自查询字符串,也取自编码在请求正文中的发布数据。

此示例演示如何在生成的输出中包括请求参数的值:

Hello <b><%= request.getParameter("name") %></b>!

如果使用URL访问页面:

http://hostname.com/mywebapp/mypage.jsp?name=John+Smith

结果输出将是:

Hello <b>John Smith</b>!

如果未在查询字符串上指定名称,则输出为:

Hello <b>null</b>!

本示例在脚本中使用查询参数的值:

<%
    if (request.getParameter("name") == null) {
        out.println("Please enter your name.");
    } else {
        out.println("Hello <b>"+request. getParameter("name")+"</b>!");
    }
%>

96
小脚本被认为是不良做法。
BalusC,2009年

13
不要忘记xmlEncode ..这当前容易受到反射xss的
侵害

4
-1用于XSS漏洞。如果我可以投票两次,则可以使用EL完成工作时,使用scriptlet也将为-1。严重的是,请勿这样做
Jules

如果存在更好的解决方案,建议使用scriptlet对代码质量有害。
Suketu Bhuta

2
关于“小脚本被认为是不良做法。”,请在另一个问题中查看此答案以寻求替代方案。
Pixelstix

242

关于隐式对象中的统一表达式语言,在Java EE 5教程中写道:

隐式对象

JSP表达式语言定义了一组隐式对象:

  • pageContext:JSP页面的上下文。提供对各种对象的访问,包括:
    • servletContext:JSP页面的servlet和同一应用程序中包含的所有Web组件的上下文。请参阅访问Web上下文。
    • session:客户端的会话对象。请参阅维护客户端状态。
    • request:触发​​JSP页面执行的请求。请参阅从请求获取信息
    • response:JSP页面返回的响应。请参阅构造响应。
  • 此外,还提供了几个隐式对象,这些对象可以轻松访问以下对象:
    • param:将请求参数名称映射到单个值
    • paramValues:将请求参数名称映射到值数组
    • header:将请求标头名称映射到单个值
    • headerValues:将请求标头名称映射到值数组
    • cookie:将Cookie名称映射到单个Cookie
    • initParam:将上下文初始化参数名称映射到单个值
  • 最后,有些对象允许访问使用作用域对象中描述的各种作用域变量。
    • pageScope:将页面范围的变量名称映射为其值
    • requestScope:将请求范围的变量名映射为其值
    • sessionScope:将会话范围的变量名映射为其值
    • applicationScope:将应用程序范围的变量名映射到它们的值

有趣的部分以粗体显示:)

因此,要回答您的问题,您应该可以这样访问它(使用EL):

${param.accountID}

或者,使用JSP脚本(不推荐):

<%
    String accountId = request.getParameter("accountID");
%>

要启用EL,您需要做些什么吗?我正在使用jboss6,当我使用$ {param.accountID}时,它被视为浏览器中的常规文本。
simgineer 2012年

@simgineer首先,文件必须是JSP,而不仅仅是纯HTML。阅读以下主题:表达式语言,不显示变量的值EL表达式在JBoss AS中4.2.2评估表达式语言在JSP不工作
informatik01

81

使用EL(JSP表达式语言):

${param.accountID}


1
这可以处理URL解码吗?
vikingsteve

@vikingsteve是的-Neil
McGuigan

2
但是它不能将重新编码处理为HTML / XML实体,这对于防止XSS是必需的。使用JSTL <c:out value="${param.accountID}" />来做到这一点。
Jules

21

如果我可以在这里添加评论...

<c:out value="${param.accountID}"></c:out>

对我不起作用(打印0)。

相反,这可以工作:

<c:out value="${param['accountID']}"></c:out>


值得注意的是:参数不仅包含URL查询参数,还包含更多的值(例如,模型图中的值)。如果您需要专门检查网址查询参数中是否包含值(例如,将作为表单提交的一部分提交),则可以查看$ {pageContext.request.queryString}-但它不会分解为像params这样的漂亮地图。
保罗



0

您想要删除带有其subject_id的主题记录的示例

@RequestMapping(value="subject_setup/delete/{subjectid}",method = RequestMethod.GET)
public ModelAndView delete(@PathVariable int subjectid) {
    subjectsDao.delete(subjectid);
    return new ModelAndView("redirect:/subject_setup");
}

该参数将用于查询的输入

public int delete(int subjectid) {
    String sql = "update tbl_subject set isdeleted= '1' where id = "+subjectid+"";
    return template.update(sql);
}

0

www.somesite.com/Transaction_List.jsp?accountID=5

为此,在java中URL有一个方法调用request.getParameter,如果要在此处强制转换为数字int,则对于将字符串值强制转换为string。因此,根据您的要求,只需复制到页面下面的行下方,

int  accountId =(int)request.getParameter("accountID");

您现在可以accountId在整个页面中使用此值。

accountId是参数的名称,您也可以使用此参数获得多个参数,但这不起作用。GET如果您点击了POST请求,它将仅与方法一起使用,否则它们将是一个错误。

希望这会有所帮助。


0

第1页:详细信息第2页:<%字符串id = request.getParameter(“ userid”);%> //现在您可以将id用于hsql详细产品的sql查询

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.