前后端数值传递主要分为两个方向,第一个方向是从前端传递数值到后端 ,第二个方向是从后端传递数值到前端。
我先说第一个方向,从前端传递数值到后端:jsp页面如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE >
<html>
<head>
<meta charset=UTF-8/>
<title>用户增加页面</title>
</head>
<body>
<form action ="myuser/User_add!add" method="post">
账号:<input type="text" name="user.username"/>
密码:<input type="password" name="user.password" />
<input type="submit" value="提交">
</form>
</body>
</html>
form 里面 action="myuser/User_add!add" myuser是struts.xml 里面的namepace User_add表示传递的action名称,!add 表示里面的add方法。这里name="user.**"是因为在后台里面传入的是User user参数,如果直接写name ="name" name="passwprd"会有空指针的问题。
在后端model,action 里面定义username 和password 并get set方法,这样就能顺利把前端数据传递到后端了。
随后讨论如何从前端获取后台的数据:
首先action必须访问servlet API ,通常是通过HttpSession HttpServletRequest SerlvetContext 分别对应jsp的内置对象:session request application ,Struts2提供了ActionContext类来进行servlet API的访问。具体方式有如下几种:
1如果变量是Action里面的全局变量,并且定义了setter方法,此时不需要其他操作,数值只要存在就可以在前端取得,具体有如下几种:
1用<%=request.getParameter("username")%>,或者<%=request.getAttribute("username"); %>
2使用EL 表达式:${username}
3采用struts2标签:<s:property value="username" />
4OGNL表达式:<s:property value="#request.username"/>
建议采用第二第三种方式。
2如果是方法体里面的局部变量,可以放在request或者session里面,一般选择request传递
a利用ActionContext().put方法
Action部分代码如下:
ActionContext ac = ActionContext.getContext();
ac.put("box",username);
在前端页面做如下接受
1:使用java代码 :<%=request.getAttribute("box"); %>不推荐
2:EL表达式:${box}
3:Struts标签:<s:property value="box">
如果参数比较多,是以类似集合形式传过来,可以用<s:iterator>进行输出代码如下:
<s:iterator value="box" id="li">
用户名:<s:property value="#li.username" />
密码:<s:property value="#li.password" />
</s:iterator>
3:OGNL表达式:<s:property value="#request.box"/>
b利用ActionContext的get方法.
Action 页面如下设置:
Map request = (Map)ActionContext.getContext().get("request")
request.put("box",username);
取值方式如a所描述
c利用HttpServletRequest 进行setAttribute传递
Action部分代码如下;
public String list(){
userList = userService.list(user ,user.getId());
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("userList", userList);
return "list";
}
在前端页面进行接收:
1利用java代码 getAttribute,参考代码如下:
List<User > list = (List<User>)request.getAttribute("userList");
out.print(list.get(0).getUsername());
out.print(list.get(0).getPassword());
这里jsp注意导入包,
<%@ page import= "java.util.*"
import = "com.model.User" %>
2使用EL表达式,
比如:<c:forEach />里面输出:
<c:forEach var="user" items="${userList }">
用户名:${user.username }
<br/>
密码:${user.password }
</c:forEach>
在使用前,要注意引入包standard.jar和jstl.jar。还有页面的导入信息:
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
如果报According to TLD or attribute directive in tag file, attribute value does not accept any expressions 这个错误,就把第一个uri 改成:
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
3OGNL表达式:<s:property value="#request.user.username "/>
Session部分利用 ActionContext.getContext().getSession();接下来与上面类似,不在重复。