抽时间总结一下web前端HTML代码段里面取值的一些方法。可能不全。也有可能有些描述不是很准确,欢迎补充和修正。
1. 前台往后台传值,通过提交表单,在后台有set,get方法,可以直接取到。如果通过request.getParameter(paramName) 去获取通过会报空指针异常。 其中request是HttpServletRequest的实例。解决的方法是,在后台action类里面定义request的get/set方法。其中get方法要这样写:
public HttpServletRequest getRequest() {
if (request == null)
request =ServletActionContext.getRequest();
return request;
}
这时,通过getRequest().getParameter(paramName)就可能成功的获取前台传过来的请求参数值。
顺便提一句,并不是前台提交表单的每个表单域都会生成请求参数的,而是有name属性的表单域才生成请求参数。如果有多个表单域有相同的name属性,则多个表单域只能生成一个请求参数,只是该参数有多个值。如果某个表单域设置了disabled=“disabled”,则该表单域不再生成请求参数。
2. 这样立马可以得到第一种前端页面取值的方法。对于表单内,属性有name的表单域,只要在后台有这个name属性的值一样的成员变量的get/set方法。该表单域的值就可以自动获取了。比如<input name=”ask” type=”text” value=””/>, 在后台action里面定义了一个成员变量ask,且有setAsk() 和getAsk()方法,<inputname=”ask” type=”text” />的value就可以动态从后台设置获取。
3. 第二种获取值的方法:EL表达式:${param}。不管是后台传来的值,还是其他前端页面传来的值,都可以通过${}获取到。后台传过来的属性值(也就是在后台通过setAttribute()方法设置的属性)也可以通过EL表达式取得。顺便提一下。在前端页面通过request.setAttribute()设置的属性值,在后台,以及跳转页面都获取不到(原理不熟,不过感觉不应该,但尝试下是这样的情况)。
4. 通过struts2标签获取:<s:property value=””/>。其中这里需要注意一点:value属性取值,什么时候要加“#”,什么时候不用加?
回答:如果取ValueStack中的值时,是不需要带#的,可以直接取。比如Action实例的属性值是存储在ValueStack中的,所以取Action中的属性是不需要带#号的。注意在使用<s:iteratorid="it" value="attrName">时,后使用it去取对象属性时,是需要加#号的。取Stack Context里面的值,都需要加#。
可能有读者不知道ValueStack和Stack Context分别存储什么。
这里在帮大家贴出网上别人给出的答案:(常见的)
valuestack:action所有成员变量,fieldErrors,actionErrors,actionMessage,exception以及你自定义的拦截器或action里自己写进去的变量
Stack Context:parameters、request、session、application、pageContext这些web容器内置对象,还有就是页面通过<s:set/><s:iterator/>等标签设置的临时变量.
最直接的查看的方法是在页面添加<s:debug></s:debug>.然后在浏览器中打开该页面就可以看到[Debug]这样的链接。点进去就可以看到这两个里面究竟存储了什么。非常方便。
使用<s:debug></s:debug>可以发现,在Stack Context里面有三个key:action、request、attr.
我们也可以通过这三个key,在web前端获取值。比如,在action里面有参数值param.在页面除了这样获取:
${param}、<s:property value="param"/>。
还可以这样:${action.param}, <s:property value=“#action.param”/>,<s:property value=“#request.param”/>
但是不可这样${ request.param}
对于属性值。可以这样获取:${attribute},但是不可以这样<s:property value=“attributeName”/>。还可以这样:${ attr.attrubiteName},但不可以这样:${request. attributeName }。还可以这样:<s:property value="#attr.attributeName "/>,<s:property value="#request. attributeName"/>。
特别注意:EL表达式不能在struts2标签中使用:<s:property value="${param} "/>是错误的:Accordingto TLD or attribute directive in tag file, attribute value does not accept anyexpressions。
5. 通过JSP输出表达式。
参数:
<%=request.getParameter(paramName)%>。
属性值:
<%=request.getAttribute("attributeName")%>