进入新公司两个月了,在新公司主要做的是web开发,java后台开发还是比较少的。最近一直在努力学习java-web中。bootstrap、js、jquery,struts2,感觉任重而道远。加油,BOY!
下面让我们进入到这篇博客的正题中。
一、前台给后台传值
(1)属性驱动
属性驱动是指在Aciton类中定义和HTML页面名称一样的字段,同时设置get和set方法。适合简单传值,我司代码中几乎没有使用!
HTML页面的写法:
<form action="login" method="post">
<label>username:</label>
<input type="text" name="username">
<label>password:</label>
<input type="text" name="username">
</form>
java后台Action类的写法:
1: public LoginAction extends ActionSupport{
2: private String username; //对应表单中input属性name=username
3: private String password; //对应表单中input属性name=password
4:
5: /*-- getter and setter --*/
6: public void setUsername(String username){
7: this.username = username;
8: }
9: public String getUsername(){
10: return this.username;
11: }
12: public void setPassword(String password){
13: this.password = password;
14: }
15: public String getPassword(){
16: return this.password;
17: }
18: public String execute(){
19: return SUCCESS;
20: }
21: }
Struts.xml中的配置:
1: <action name="login" class="com.bigdata.action.LoginAction">
2: <result name="success">success.jsp</result>
3: </action>
在success.jsp页面中使用{username}来访问username属性。
(2)对象驱动
Action中包含一个对象,这个对象的属性和JSP页面上的名称一一映射。
Action代码的写法:
public LoginAction extends ActionSupport{
2: private User user;
3:
4: /*-- getter and setter --*/
5: public void setUser(User user){
6: this.user = user;
7: }
8: public User getUser(){
9: return this.user;
10: }
11: public String execute(){
12: return SUCCESS;
13: }
14: }
对应的User类的写法:
1: public Class User{
2: private String username;
3: private String password;
4:
5: public String getPassword() {
6: return password;
7: }
8: public void setPassword(String password) {
9: this.password = password;
10: }
11:
12: public String getUsername(){
13: return username;
14: }
15: public void setUsername(String username){
16: this.username = username;
17: }
18: }
前台的HTMl代码的写法:
1: <form action="login" method="post">
2: <label>username:</label>
3: <input type="text" name="user.username">
4: <label>password:</label>
5: <input type="text" name="user.password">
6: </form>
表单域的name由对象名和属性名组成,中间用.连接,Action对象被创建后,通过setter进行赋值。Action result页面则通过${user.username}来访问。
(3)对象驱动改良版本——我司采用这种方法实现前后台传值
利用ModelDriven机制,让UserAction实现一个ModelDriven接口,同时实现接口中的方法:getModel()。如下所示:
public class UserAction implements ModelDriven{
private User user;
@Override
public Object getModel() {
if(user == null){
user = new User();
}
return user;
}
public String add(){
new UserManager().addUser(user);
return "success";
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
可见,这种做法是比较好的,Action和JSP写起来都比较简单。
二、后台给前台传值
(1)使用strtus2标签
Action类中的写法:
public Class CollectAction extends ActionSupport{
2: private String [] arryStr;
3: //遍历list
4: private List<User> list;
5: private Map<String,String> map;
6: private Map<Integer,User> userMap;
7: private Map<String,List<User>> userListMap;
8:
9: public void setArryStr(String[] arryStr){
10: this.arryStr = arryStr;
11: }
12: public String[] getArryStr(){
13: return arryStr;
14: }
15:
16: //省略其他的getter与setter
17: public String execute(){
18:
19: arryStr[] = new String[]{"wbl","sdfsdf","gfg"};
20:
21: list.add(new User("wbl","123"));
22: list.add(new User("avd","ggg"));
23: list.add(new User("eee","iii"));
24:
25: map.put("key1","value1");
26: map.put("key2","value2");
27: map.put("key3","value3");
28:
29: userMap.put(1,new User("wbl","123"));
30: userMap.put(2,new User("avd","ggg"));
31:
32: userListMap.put("user",list);
33: }
34: }
对应的JSP页面的写法:我司也很少看到嵌套如此多的结构。
<div id="userlistMap">
41: <!-- iterator遍历Map中的List集合 -->
42: <s:iterator value="userListMap" id="column">
43: <s:set var="total" name="total" value="#column.value.size"/>
44: <s:iterator value="#column.value" id="col" status="st">
45: <tr>
46: <td><s:property value="username"/></td>
47: <td><s:property value="password"/></td>
48: </tr>
49: </s:iterator>
50: </s:iterator>
51: </div>
(2)ajax
ajax方式可以实现异步更新数据,这里我采用json格式传输数据。
首先,建立一个action:
public class ajaxAction extends ActionSupport{
2: private JSONObject dataObj; //向前台传递的JSON数据
3:
4: public JSONObject getDataObj() {
5: return dataObj;
6: }
7:
8: public void setDataObj(JSONObject dataObj) {
9: this.dataObj = dataObj;
10: }
11:
12: public String execute(){
13: dataObj = new JSONObject();
14: dataObj.put("key","value");
15: dataObj.put("result","SUCCESS");
16: return SUCCESS;
17: }
18: }
struts.xml中的配置:
<action name="ajax" class="com.bigdata.action.ajaxAction">
2: <result type="json">
3: <param name="root">dataObj</param>
4: <param name="callbackParameter">jsoncallback</param>
5: </result>
6: </action>
如果为某个action指定了一个类型为json的Result,则该Result无须映射到任何视图资源,因为json插件会负责将Action里的状态信息序列化成JSON格式的字符串,并将该字符串返回给客户端浏览器。
json类型的Result允许指定的参数
root:设置该参数将不再把整个Action对象序列化成JSON字符串,而只是将该参数所指定的Action的属性序列化成JSON字符串返给客户端,本例中将会把dataObj进行序列化。
callbackParameter: 配置该参数之后,才能进行JSON的跨域传输。
前端利用jQuery完成AJAX交互
1: <div id="ajaxTest">
2: <input type="button" value="test" id="show">
3: </div>
4: </body>
5: <script type="text/javascript" src="js/jquery.js"></script>
1:
2: <script>
3: $(function(){
4: $("show").click(function(){
5: $.getJSON(
6: /*访问Action的URL地址*/
7: "http://localhost:8080/bigData/ajax?jsoncallback=?",
8: /*得到服务器响应之后的操作*/
9: function(respose){
10: if(respose.result == "SUCCESS")
11: $("#ajaxTest").append("<span>SUCCESS</span>");
12: })
13: })
14: })
</script>
6: </html>
function中的参数response对应Action中的dataObj,此时就可以获得由后端传入的值。
三、和Servlet API耦合的访问方式
1、 采用Request (HttpServletRequest)对象来传递数据
(1)在Action类文件中
(A) 导入ServletActionContext类:
import org.apache.struts2.ServletActionContext;
(B) 获得request对象,具体的方法如下:
HttpServletRequest request = ServletActionContext.getRequest ();
(C)通过setAttribute()方法把需要传递的数据对象放入request对象中:
request.setAttribute("key",Object);
(2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:
(A) request.getAttribute("key")获得被传递的数据对象。
(B) <s:iterator value="#request.key"> 获得被传递的数据对象。
2、采用application (ServletContext) 对象来传递数据
(1)在Action类文件中
(A) 导入ServletActionContext类:
import org.apache.struts2.ServletActionContext;
(B) 获得application对象,具体的方法如下:
ServletContext application = ServletActionContext.getServletContext ();
(C)通过setAttribute()方法把需要传递的数据对象放入application对象中:
application.setAttribute("key",Object);
(2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:
(A) application.getAttribute("key")获得被传递的数据对象。
(B)<s:iterator value="#application.key"> 获得被传递的数据对象。
3、采用session (HttpSession) 对象来传递数据
(1)在Action类文件中
(A) 导入ServletActionContext类:
import org.apache.struts2.ServletActionContext;
(B) 获得session对象,具体的方法如下:
HttpSession session = ServletActionContext.getRequest ().getSession();
(C) 通过setAttribute()方法把需要传递的数据对象放入session对象中:
session.setAttribute("key",Object);
(2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:
(A) session.getAttribute("key")获得被传递的数据对象。
(B) <s:iterator value="#session.key"> 获得被传递的数据对象。
四、和Servlet API解耦的访问方式
1、 采用Request (HttpServletRequest对应的Map对象)对象来传递数据
(1)在Action类文件中
(A) 导入ActionContext类:
import com.opensymphony.xwork2.ActionContext;
(B) 获得request对象,具体的方法如下:
ActionContext context= ActionContext.getContext();
Map request = (Map)context.get("request");
(C)通过put()方法把需要传递的数据对象放入request对象中:
request.put("key",Object);
(2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:
(A) request.getAttribute("key")获得被传递的数据对象。
(B) request.get("key")获得被传递的数据对象。
(C) <s:iterator value="#request.key"> 获得被传递的数据对象。
(D) requestScope.key 获得被传递的数据对象。
2、采用application (ServletContext对应的Map对象) 对象来传递数据
(1)在Action类文件中
(A) 导入ActionContext类:
import com.opensymphony.xwork2.ActionContext;
(B) 获得application对象,具体的方法如下:
ActionContext context= ActionContext.getContext();
Map application = (Map)context.getApplication();
(C)通过put()方法把需要传递的数据对象放入application对象中:
application.put("key",Object);
(2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:
(A) application.getAttribute("key")获得被传递的数据对象。
(B) application.get("key")获得被传递的数据对象。
(C) <s:iterator value="#application.key"> 获得被传递的数据对象。
(D) applicationScope.key 获得被传递的数据对象。
3、采用session (HttpSession对应的Map对象) 对象来传递数据
(1)在Action类文件中
(A) 导入ActionContext类:
import com.opensymphony.xwork2.ActionContext;
(B) 获得session对象,具体的方法如下:
ActionContext context= ActionContext.getContext();
Map session = (Map)context.getSession();
(C)通过put()方法把需要传递的数据对象放入session对象中:
session.put("key",Object);
(2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:
(A) session.getAttribute("key")获得被传递的数据对象。
(B) session.get("key")获得被传递的数据对象。
(C) <s:iterator value="#session.key"> 获得被传递的数据对象。
(D) sessionScope.key 获得被传递的数据对象。