Chinaunix首页 | 论坛 | 博客
  • 博客访问: 413225
  • 博文数量: 112
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 905
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-05 21:14
文章分类

全部博文(112)

文章存档

2009年(3)

2008年(24)

2007年(55)

2006年(30)

我的朋友

分类: Java

2008-02-21 11:16:14

Struts 2.0更厉害的是支持更高级的POJO访问,如user.getPassword()。我们可以用另一写法实现例4。首先,将name和password从Login类中分离出来,到新建类User中。这样对我们开发多层系统尤其有用。它可以使系统结构更清晰。

例5 classes/tutorial/LoginX.java
package tutorial;

import com.opensymphony.xwork2.ActionSupport;

publicclass LoginX extends ActionSupport {
    private User user;
    private String message;
   
    publicvoid setUser(User user) {
        this.user = user;
    }
   
    public User getUser() {
        return user;
    }
   
    public String getMessage() {
        return message;
    }
   
    @Override
    public String execute() {       
        if("max".equals(user.getName()) &&"secret".equals(user.getPassword())) {
            message ="Welcome, "+ user.getName();
        }else{
            message ="Invalid user or password";
        }
        return SUCCESS;
    }
}

例5 LoginX.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>


    Login



   
   
   


例5 classes/struts.xml中的LoginX Action配置 
<
action name="LoginX" class="tutorial.LoginX">
   
<result>/HelloWorld.jspresult>
action>

  很多时候我的同事会问我:“如果我要取得Servlet API中的一些对象,如request、response或session等,应该怎么做?这里的execute不像Struts 1.x的那样在参数中引入。”开发Web应用程序当然免不了跟这些对象打交道。在Strutx 2.0你可以有两种方式获得这些对象:非IoC(控制反转Inversion of Control)方式和IoC方式。

非IoC方式

  要获得上述对象,关键Struts 2.0中com.opensymphony.xwork2.ActionContext类。我们可以通过它的静态方法getContext()获取当前Action的上下文对象。 另外,org.apache.struts2.ServletActionContext作为辅助类(Helper Class),可以帮助您快捷地获得这几个对象。

HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();

  如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session范围(Scoped)的对象。

IoC方式

  要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点。具体实现,请参考例6 IocServlet.java。

例6 classes/tutorial/NonIoCServlet.java
package tutorial;

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

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

publicclass NonIoCServlet extends ActionSupport {
    private String message;
   
    public String getMessage() {
        return message;       
    }
   
    @Override
    public String execute() {   
        ActionContext.getContext().getSession().put("msg", "Hello World from Session!");
       
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();       
        HttpSession session = request.getSession();
       
        StringBuffer sb =new StringBuffer("Message from request: ");
        sb.append(request.getParameter("msg"));
        sb.append("
Response Buffer Size: ");
        sb.append(response.getBufferSize());
        sb.append("
Session ID: ");
        sb.append(session.getId());
       
        message = sb.toString();
        return SUCCESS;
    }
}

例6 classes/tutorial/IoCServlet.java
package tutorial;

import java.util.Map;

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

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

publicclass IoCServlet extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {
    private String message;
    private Map att;
    private HttpServletRequest request;
    private HttpServletResponse response;   
   
    public String getMessage() {
        return message;       
    }
   
    publicvoid setSession(Map att) {
        this.att = att;
    }
   
    publicvoid setServletRequest(HttpServletRequest request) {
        this.request = request;
    }
   
    publicvoid setServletResponse(HttpServletResponse response) {
        this.response = response;
    }
   
    @Override
    public String execute() {       
        att.put("msg", "Hello World from Session!");
       
        HttpSession session = request.getSession();
       
        StringBuffer sb =new StringBuffer("Message from request: ");
        sb.append(request.getParameter("msg"));
        sb.append("
Response Buffer Size: ");
        sb.append(response.getBufferSize());
        sb.append("
Session ID: ");
        sb.append(session.getId());
       
        message = sb.toString();
        return SUCCESS;
    }
}

例6 Servlet.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>


    Hello World!


   


       
       
Message from session:
   



例6 classes/struts.xml中NonIocServlet和IoCServlet Action的配置
<
action name="NonIoCServlet" class="tutorial.NonIoCServlet">
   
<result>/Servlet.jspresult>
action>
<action name="IoCServlet" class="tutorial.IoCServlet">
   
<result>/Servlet.jspresult>
action>

  运行Tomcat,在浏览器地址栏中键入! 或!,出现如图7所示页面。

图7 Servlet.jsp的输出页面

  在Servlet.jsp中,我用了两次property标志,第一次将escape设为false为了在JSP中输出
转行,第二次的value中的OGNL为“#session.msg”,它的作用与session.getAttribute("msg")等同。

(转自 MaxOnJava, 感谢原作者)

阅读(1594) | 评论(0) | 转发(0) |
0

上一篇:Struts2.0之Action详解(一)

下一篇:Log4j配置

给主人留下些什么吧!~~