全部博文(2065)
分类: Java
2010-06-11 23:01:55
Action讲解
时间:
Action是Struts的核心内容。
接口 无须继承任何类型或实现任何接口
表单数据 表单数据包含在Action中,通过Getter和Setter获取。
实现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.jsp即dispatcher方法
这个就是提取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。不一定重定向forward到JSP页面的。还可以重定向到其他的模板的像
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中的一些对象,如request、response或session等,应该怎么做?
如何获取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 帮助类来实现获取标准的Servlets的API。
方法二:使用IOC的方式
要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点。
好好研究一下IOC的概念了。控制反转的概念!
示例如下我们分别使用非IOC与IOC实现
非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;
}}