`

struts2 action

阅读更多
1、使用领域对象来接收用户输入
【工程1:sx_ch0301】:

User对象中包含两个字段:username和password,在Action中有一个User对象user,则在jsp中:

Jsp代码
<input type="text" name="user.username">  
<input type="password" name="user.password"> 

<input type="text" name="user.username">
<input type="password" name="user.password"> 来进行数据绑定。

当Struts2尝试设置user对象的username属性时,将依次调用以下的方法:

Java代码
action.getUser();  
action.setUser(new User());  
action.getUser().setUserName(); 

action.getUser();
action.setUser(new User());
action.getUser().setUserName();Struts2首先尝试获得User对象的引用,当它发现User对象为null时,它将使用User类的默认构造方法创建一个User实例,并调用action的setUser()方法设置这个实例。这样,Struts2就可以设置Usser对象的username字段了。



在Struts2中,自动实例化对象的特性对于任意层次的对象包含关系都是适用的。



例如, user.address.street这样的表达式会调用:

Java代码
getUser().getAdderss().setStreet(...); 

getUser().getAdderss().setStreet(...); Struts2会先创建User对象,接着创建Address对象,然后设置Address对象的street属性。



2、使用ModelDriver action
【工程2:sx_ch0302】:
LoginAction 类实现了 ModelDriven 接口:(注意要实例化 User 对象,否则在 getModel() 时会取不到对象。)

Java代码
public class LoginAction implements Action, ModelDriven<User> {  
      
    private User user = new User();  
 
    @Override 
    public User getModel() {  
         return user;  
    }  
 


public class LoginAction implements Action, ModelDriven<User> {
   
    private User user = new User();

    @Override
    public User getModel() {
         return user;
    }

}在login.jsp页面中,表单字段就不需要再使用“user.”前缀了:

Jsp代码
<input type="text" name="username">  
<input type="password" name="password"> 

<input type="text" name="username">
<input type="password" name="password">在sucess.jsp页面中,表单字段也不需要再使用“user.”前缀了:

Jsp代码
<s:property value="username" /> 

<s:property value="username" />3、使用action的属性接收用户输入
【工程3:sx_ch0303】:
在 Struts2 中,可以直接使用 action 的属性来接收用户的输入。为LoginAction添加 username 和 password 属性,同时实现这两个属性的getter和setter方法(这样可以直接删除 User 类 ):



Java代码
public class LoginAction implements Action {  
 
      private String username;  
 
    private String password;  
 
    public String execute() throws Exception {  
               // 这里直接和属性比对  
        if ("zhangsan".equals(username) && "1234".equals(password)) {  
            return SUCCESS;  
        } else {  
            return ERROR;  
        }  
    }  
 
    public String getUsername() {  
        return username;  
    }  
 
    public void setUsername(String username) {  
        this.username = username;  
    }  
 
    public String getPassword() {  
        return password;  
    }  
 
    public void setPassword(String password) {  
        this.password = password;  
    }  
}     

public class LoginAction implements Action {

      private String username;

private String password;

public String execute() throws Exception {
               // 这里直接和属性比对
if ("zhangsan".equals(username) && "1234".equals(password)) {
return SUCCESS;
} else {
return ERROR;
}
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}    4、访问request、session和application对象
4.1 与 Servlet API 解耦的访问方式

【工程4:sx_ch0304】:
Java代码
// 获得action的执行上下文  
ActionContext context = ActionContext.getContext();  
 
// 得到三个对象  
Map request = (Map)context.get("request");  
Map session = context.getSession();  
Map application = context.getApplication();  
 
// 使用三个对象  
// 在请求中放置欢迎信息  
request.put("greeting", "欢迎光临");  
 
// 在Session中保存 User 对象  
session.put("user", user);  
 
// 统计用户访问量,在 application 中保存用户访问量数据  
Integer count = (Integer) application.get("counter");  
if (null == count) {  
    count = 1;  
} else {  
    count++;  
}  
application.put("counter", count); 

// 获得action的执行上下文
ActionContext context = ActionContext.getContext();

// 得到三个对象
Map request = (Map)context.get("request");
Map session = context.getSession();
Map application = context.getApplication();

// 使用三个对象
// 在请求中放置欢迎信息
request.put("greeting", "欢迎光临");

// 在Session中保存 User 对象
session.put("user", user);

// 统计用户访问量,在 application 中保存用户访问量数据
Integer count = (Integer) application.get("counter");
if (null == count) {
count = 1;
} else {
count++;
}
application.put("counter", count);使用JSP内置的表达式语言来访问request、session和application范围的数据:

Jsp代码
${seesionScope.user.username},${requestScope.greeting}  
${applicationScope.counter} 

${seesionScope.user.username},${requestScope.greeting}
${applicationScope.counter}【工程5:sx_ch0305】:
利用请求对象来传递数据还有一种方式,直接使用 ActionContext 类的put()方法将数据保存到 ActionContext 中:

Jsp代码
ActionContext.getContext().put("greeting", "欢迎光临"); 

ActionContext.getContext().put("greeting", "欢迎光临");
然后在页面中,从请求对象中取出 greeting 属性:

Jsp代码
${requestScope.greeting} 

${requestScope.greeting}或者:

Jsp代码
<%=request.getAttribute("greeting")%> 

<%=request.getAttribute("greeting")%>【工程6:sx_ch0306】:
通过接口注入来获取request、session和application对象,

request:实现 RequestAware 接口,实现setRequset(Map request)方法
session:实现 SessionAware 接口,实现setSession(Map session)方法
application:实现 ApplicationAware 接口,实现setApplication(Map application)方法
Java代码
public class LoginAction implements Action, RequestAware, SessionAware,  
        ApplicationAware {  
 
    private User user = new User();  
 
    private Map request;  
 
    private Map session;  
 
    private Map application;  
 
    public void setRequest(Map request) {  
        this.request = request;  
    }  
 
    public void setSession(Map session) {  
        this.session = session;  
    }  
 
    public void setApplication(Map application) {  
        this.application = application;  
    }  
 
    @SuppressWarnings("unchecked")  
    public String execute() throws Exception {  
        if ("zhangsan".equals(user.getUsername())  
                && "1234".equals(user.getPassword())) {  
 
            // 在请求中放置欢迎信息  
            request.put("greeting", "欢迎光临");  
 
            // 在Session中保存 User 对象  
            session.put("user", user);  
 
            // 统计用户访问量,在 application 中保存用户访问量数据  
            Integer count = (Integer) application.get("counter");  
            if (null == count) {  
                count = 1;  
            } else {  
                count++;  
            }  
            application.put("counter", count);  
 
            return SUCCESS;  
        } else {  
            return ERROR;  
        }  
    }  
 
    public User getUser() {  
        return user;  
    }  
 
    public void setUser(User user) {  
        this.user = user;  
    }  


public class LoginAction implements Action, RequestAware, SessionAware,
ApplicationAware {

private User user = new User();

private Map request;

private Map session;

private Map application;

public void setRequest(Map request) {
this.request = request;
}

public void setSession(Map session) {
this.session = session;
}

public void setApplication(Map application) {
this.application = application;
}

@SuppressWarnings("unchecked")
public String execute() throws Exception {
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword())) {

// 在请求中放置欢迎信息
request.put("greeting", "欢迎光临");

// 在Session中保存 User 对象
session.put("user", user);

// 统计用户访问量,在 application 中保存用户访问量数据
Integer count = (Integer) application.get("counter");
if (null == count) {
count = 1;
} else {
count++;
}
application.put("counter", count);

return SUCCESS;
} else {
return ERROR;
}
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}

4.2 与 Servlet API 耦合的访问方式

【工程7:sx_ch0307】:
通过ServletActionContext 类来获取HttpServletRequest和ServletContext对象

HttpServletRequest:public static HttpServletRequest getRequest()
ServletContext:public static ServletContext getServletContext()
注:ServletActionContext 类并没有提供直接得到 HttpSession 对象的方法,此对象可通过 HttpServletRequest 对象的 getSession() 方法来得到。

Java代码
import javax.servlet.ServletContext;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpSession;  
 
import org.apache.struts2.ServletActionContext;  
 
import com.coderdream.model.User;  
import com.opensymphony.xwork2.Action;  
 
public class LoginAction implements Action {  
    private User user = new User();  
 
    @SuppressWarnings("unchecked")  
    public String execute() throws Exception {  
        if ("zhangsan".equals(user.getUsername())  
                && "1234".equals(user.getPassword())) {  
 
            HttpServletRequest request = ServletActionContext.getRequest();  
            HttpSession session = request.getSession();  
            ServletContext context = ServletActionContext.getServletContext();  
 
            // 在请求中放置欢迎信息  
            request.setAttribute("greeting", "欢迎光临");  
 
            // 在Session中保存 User 对象  
            session.setAttribute("user", user);  
 
            // 统计用户访问量,在 application 中保存用户访问量数据  
            Integer count = (Integer) context.getAttribute("counter");  
            if (null == count) {  
                count = 1;  
            } else {  
                count++;  
            }  
            context.setAttribute("counter", count);  
 
            return SUCCESS;  
        } else {  
            return ERROR;  
        }  
    }  
 
    public User getUser() {  
        return user;  
    }  
 
    public void setUser(User user) {  
        this.user = user;  
    }  


import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.coderdream.model.User;
import com.opensymphony.xwork2.Action;

public class LoginAction implements Action {
private User user = new User();

@SuppressWarnings("unchecked")
public String execute() throws Exception {
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword())) {

HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext context = ServletActionContext.getServletContext();

// 在请求中放置欢迎信息
request.setAttribute("greeting", "欢迎光临");

// 在Session中保存 User 对象
session.setAttribute("user", user);

// 统计用户访问量,在 application 中保存用户访问量数据
Integer count = (Integer) context.getAttribute("counter");
if (null == count) {
count = 1;
} else {
count++;
}
context.setAttribute("counter", count);

return SUCCESS;
} else {
return ERROR;
}
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}【工程8:sx_ch0308】:
还可以通过 ActionContext 类的 get() 方法,传递 ServletActionContext.HTTP_REQUEST 和 ServletActionContext.SERVLET_CONTEXT 键值来获取HttpServletRequest和ServletContext对象,同样,通过 ServletActionContext.HTTP_RESPONSE 键值来得到 HttpServletResponse 对象



Java代码
import javax.servlet.ServletContext;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpSession;  
 
import org.apache.struts2.ServletActionContext;  
 
import com.coderdream.model.User;  
import com.opensymphony.xwork2.Action;  
import com.opensymphony.xwork2.ActionContext;  
 
public class LoginAction implements Action {  
    private User user = new User();  
 
    @SuppressWarnings("unchecked")  
    public String execute() throws Exception {  
        if ("zhangsan".equals(user.getUsername())  
                && "1234".equals(user.getPassword())) {  
            ActionContext ctx = ActionContext.getContext();  
                       // 通过键值获得对象  
            HttpServletRequest request = (HttpServletRequest) ctx  
                    .get(ServletActionContext.HTTP_REQUEST);  
            HttpSession session = request.getSession();  
            ServletContext context = (ServletContext) ctx  
                    .get(ServletActionContext.SERVLET_CONTEXT);  
 
            // 在请求中放置欢迎信息  
            request.setAttribute("greeting", "欢迎光临");  
 
            // 在Session中保存 User 对象  
            session.setAttribute("user", user);  
 
            // 统计用户访问量,在 application 中保存用户访问量数据  
            Integer count = (Integer) context.getAttribute("counter");  
            if (null == count) {  
                count = 1;  
            } else {  
                count++;  
            }  
            context.setAttribute("counter", count);  
 
            return SUCCESS;  
        } else {  
            return ERROR;  
        }  
    }  
 
    public User getUser() {  
        return user;  
    }  
 
    public void setUser(User user) {  
        this.user = user;  
    }  


import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.coderdream.model.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;

public class LoginAction implements Action {
private User user = new User();

@SuppressWarnings("unchecked")
public String execute() throws Exception {
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword())) {
ActionContext ctx = ActionContext.getContext();
                       // 通过键值获得对象
HttpServletRequest request = (HttpServletRequest) ctx
.get(ServletActionContext.HTTP_REQUEST);
HttpSession session = request.getSession();
ServletContext context = (ServletContext) ctx
.get(ServletActionContext.SERVLET_CONTEXT);

// 在请求中放置欢迎信息
request.setAttribute("greeting", "欢迎光临");

// 在Session中保存 User 对象
session.setAttribute("user", user);

// 统计用户访问量,在 application 中保存用户访问量数据
Integer count = (Integer) context.getAttribute("counter");
if (null == count) {
count = 1;
} else {
count++;
}
context.setAttribute("counter", count);

return SUCCESS;
} else {
return ERROR;
}
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}【工程9:sx_ch0309】:
最后,还可以通过 Action 类实现 ServletRequestAware 和 ServletContextAware 接口,由 Struts2 框架向 Action 实例注入 HttpServletRequest 和 ServletContext 对象:



Java代码
import javax.servlet.ServletContext;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpSession;  
 
import org.apache.struts2.interceptor.ServletRequestAware;  
import org.apache.struts2.util.ServletContextAware;  
 
import com.coderdream.model.User;  
import com.opensymphony.xwork2.Action;  
 
public class LoginAction implements Action, ServletRequestAware,  
        ServletContextAware {  
    private User user = new User();  
 
    private HttpServletRequest request;  
 
    private ServletContext context;  
 
    @SuppressWarnings("unchecked")  
    public String execute() throws Exception {  
        if ("zhangsan".equals(user.getUsername())  
                && "1234".equals(user.getPassword())) {  
            HttpSession session = request.getSession();  
 
            // 在请求中放置欢迎信息  
            request.setAttribute("greeting", "欢迎光临");  
 
            // 在Session中保存 User 对象  
            session.setAttribute("user", user);  
 
            // 统计用户访问量,在 application 中保存用户访问量数据  
            Integer count = (Integer) context.getAttribute("counter");  
            if (null == count) {  
                count = 1;  
            } else {  
                count++;  
            }  
            context.setAttribute("counter", count);  
 
            return SUCCESS;  
        } else {  
            return ERROR;  
        }  
    }  
 
    public User getUser() {  
        return user;  
    }  
 
    public void setUser(User user) {  
        this.user = user;  
    }  
 
    public void setServletRequest(HttpServletRequest request) {  
        this.request = request;  
    }  
 
    public void setServletContext(ServletContext context) {  
        this.context = context;  
    }  


import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;

import com.coderdream.model.User;
import com.opensymphony.xwork2.Action;

public class LoginAction implements Action, ServletRequestAware,
ServletContextAware {
private User user = new User();

private HttpServletRequest request;

private ServletContext context;

@SuppressWarnings("unchecked")
public String execute() throws Exception {
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword())) {
HttpSession session = request.getSession();

// 在请求中放置欢迎信息
request.setAttribute("greeting", "欢迎光临");

// 在Session中保存 User 对象
session.setAttribute("user", user);

// 统计用户访问量,在 application 中保存用户访问量数据
Integer count = (Integer) context.getAttribute("counter");
if (null == count) {
count = 1;
} else {
count++;
}
context.setAttribute("counter", count);

return SUCCESS;
} else {
return ERROR;
}
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

public void setServletRequest(HttpServletRequest request) {
this.request = request;
}

public void setServletContext(ServletContext context) {
this.context = context;
}
}

输出结果:

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics