Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26278054
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Java

2010-06-11 23:01:55

Action讲解

时间:2010-6-11

ActionStruts的核心内容。

接口                            无须继承任何类型或实现任何接口

表单数据                     表单数据包含在Action中,通过GetterSetter获取。

实现Action实现com.opensymphony.xwork2.ActionSupport类。重载里面的execute()

示例:

编写Action

package tutorial;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorld extends ActionSupport {

    private String name;

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    @Override

    public String execute() {

        name = "Hello!";

        return SUCCESS;

    }

}

要注意是继承ActionSupport类。覆盖方法execute

Step2.配置struts.xml文件

xml version="1.0" encoding="UTF-8"?>

DOCTYPE struts PUBLIC 

     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 

     ""> 

<struts>

    <include file="struts-default.xml"/>   

    <package name="ActionDemo" extends="struts-default">

    <action name="HelloWorld" class="tutorial.HelloWorld">

            <result>/home.jspresult>

        action>

    package>

struts>

这个表示了一个URL映射到了一个类Action上面。

Step3. 编写home.jspdispatcher方法


这个就是提取Action里面的值!

针对以上的示例我们可以进一步延伸。

1、   不用默认的execute方法写自定义的处理Action方法

修改配置文件

<action name="HelloWorld" class="tutorial.HelloWorld" method="aliasMethod">

            <result>/home.jspresult>

        action>

这里面我们定义了一个method了。

然后在Action里面我们写一个

public String aliasMethod () {

        name = "hi";

        return SUCCESS;

    }

再来看structs.xml文件里面的<result>/home.jspresult>

注意这里面的result。不一定重定向forwardJSP页面的。还可以重定向到其他的模板的像

FreeMaker模板、Velocity模板、JasperReports和使用XSL转换等。 渲染到这种模板的!

 

<action name="VMHelloWorld" class="tutorial.HelloWorld">
   
<result type="velocity">/HelloWorld.vmresult>
action>

看!指定一下这个UI层的类型就可以指定什么类型的页面了。是velocity类型的!

示例:一个简单的表单处理

1、  编写登录页面

<body>

    <s:form action="Logins.action" method="POST">

    <s:textfield name="name" label="User name"/>

    <s:password name="password" label="Password"/>

    <s:submit value="Submit"/>

    s:form>

  body>

html>

注意了!这里面的表单的名称与我们的BEAN里面的属性名称是一样的。就可以直接一、一匹配起来了!

2、   定义Maping

xml version="1.0" encoding="UTF-8"?>

DOCTYPE struts PUBLIC  

     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 

     ""> 

<struts>

    <include file="struts-default.xml"/>   

    <package name="ActionDemo" extends="struts-default">

    <action name="Logins" class="tutorial.HelloWorld">

            <result>/t.jspresult>

        action>

    package>

struts>

业务逻辑由Action处理。这个相当于是一个路由转发功能

3、   编写Action处理类

package tutorial;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorld extends ActionSupport {

    private String name;

    private String password;

    private String message;

    public String getPassword() {

        return password;

    }

    public void setPassword(String password) {

        this.password = password;

    }

 

    public String getMessage() {

        return message;

    }

 

    public void setMessage(String message) {

        this.message = message;

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

    @Override

    public String execute() {

        if ("Max".equals(name) &&  "123".equals(password)) {

            message = "sucess";

        } else {

            message = "error";

        }

        return SUCCESS;

    }

}

4、   编写t.jsp

<body>

    This is my JSP page.hello

    <s:property value="message" />

     <br>

  body>

 

渲染dispatcher之后的页面!

 

笔记:依据它内置的表单标签处理起来就非常地方便了!

 

更进一步:我们还可以将User单独出来成一个类。恩有点像目前JSP里面的那样

Action{

    Private User user;      这样来处理它可以负责接收参数、设置参数处理

}

 

 

完整代码

1、   表单

<body>

    <s:form action="Logins.action" method="POST">

    <s:textfield name="user.name" label="User name"/>

    <s:password name="user.password" label="Password"/>

    <s:submit value="Submit"/>

    s:form>

  body>

看到没有可以这样写的POJO强!

2、   编写Action

public class HelloWorld extends ActionSupport {

    private User user;

    private String message;

    public String getMessage() {

        return message;

    }

    public void setMessage(String message) {

        this.message = message;

    }

    @Override

    public String execute() {

        if ("Max".equals(user.getName()) &&  "123".equals(user.getPassword())) {

            message = "sucess";

        } else {

            message = "error";

        }

        return SUCCESS;

    }

    public User getUser() {

        return user;

    }

    public void setUser(User user) {

        this.user = user;

    }

}

package tutorial;

 

public class User {

    private String name;

    private String password;

    public String getPassword() {

        return password;

    }

    public void setPassword(String password) {

        this.password = password;

    }

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

}

 

 

我们可以将User单独拿出来处理。

其实的代码不变!

 

 

 

下一个问题/////////////////////?????????????

如果我要取得Servlet API中的一些对象,如requestresponsesession等,应该怎么做?

如何获取Servlet中的一些API对象!

有两种方法来获取到这些对象。

 

 

方法一:非IOC[控制反转Inversion of Control]方式

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

o        HttpServletRequest request = ServletActionContext.getRequest();

o        HttpServletResponse response = ServletActionContext.getResponse();

o        HttpSession session = request.getSession();

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

可以使用ServletActionContext 帮助类来实现获取标准的ServletsAPI

 

方法二:使用IOC的方式

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

好好研究一下IOC的概念了。控制反转的概念!

示例如下我们分别使用非IOCIOC实现

IOC实现的

第一步:编写非IOC实现的Action

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;

 

public class NonIoCServlet extends ActionSupport {

    private String message;

    private String getMessage() {

        return message;

    }

    @Override

    public String execute() {

        ActionContext.getContext().getSession().put("msg", "hello world from sessin");

        HttpServletRequest request = ServletActionContext.getRequest();

        HttpServletResponse response = ServletActionContext.getResponse();

        HttpSession session = request.getSession();

        StringBuffer sb = new StringBuffer("Message from request");

        sb.append("
Response Buffer size:"
);

        sb.append(response.getBufferSize());

        sb.append("session id:");

        sb.append(session.getId());

        message = sb.toString();

        return SUCCESS;

    }

}

 

看到没有是不是用帮助类实现的。是的!

 

第二步:编写路由配置

<package name="IOCDemo" extends="struts-default">

    <action name="NonIoCServlet" class="tutorial.NonIoCServlet">

            <result>/Servlet.jspresult>

        action>

    package>

第三步:编写视图层代码

<s:property value="message" escape="false"/>

   <br>Message from session: <s:property value="#session.msg"/>

 

看到没有如何提取内置变量session里面的数据的 #session 这样来提取的哦!

 

 

第二种方法是采用IOC的方式处理

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.ActionSupport;

 

public class IoCServlet extends ActionSupport implements SessionAware,ServletRequestAware,ServletResponseAware {

    private String message;

    private Map attr;

    private HttpServletRequest request;

    private HttpServletResponse response;

   

   

    public void setSession(Map arg0) {

        // TODO Auto-generated method stub

        this.attr = arg0;

    }

 

    public void setServletRequest(HttpServletRequest arg0) {

        // TODO Auto-generated method stub

        this.request = arg0;

    }

 

    public String getMessage() {

        return message;

    }

 

    public void setMessage(String message) {

        this.message = message;

    }

 

    public void setResponse(HttpServletResponse response) {

        this.response = response;

    }

    @Override

    public String execute() {       

        attr.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;

    }

 

    public void setServletResponse(HttpServletResponse arg0) {

        this.response = arg0;      

    }}

阅读(699) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~