struts2学习之何为action以及Action 类,如何访问WEB资源
1. 搭建struts2 的步骤: 3个步骤
2. action VS Action
- action: 代表一个Struts2 的请求.
- Action 类: 能够处理Struts2 请求的类. 先前写的Product 类就是这样一个类
- 属性的名字必须遵守与JavaBeans (就是一个java类,格式是含有属性,以及get,set方法的类)属性名相同的命名规则,属性的类型可以是任意类型。从字符串到非字符串(基本数据类型)数据类型转换可以自动发生. 下面例子中的函数方法名 setProductName 必须和JSP 页面中productName 的名字一致( 途中标红色的地方,其值必须一致):
package strutshelloworld;
public class Product {
private Integer productId;
private String productName;
private String productDesc;
private double productPrice;
public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
}
public double getProductPrice() {
return productPrice;
}
public void setProductPrice(double productPrice) {
this.productPrice = productPrice;
}
@Override
public String toString() {
return "Product [productId=" + productId + ", productName=" + productName + ", productDesc=" + productDesc
+ ", productPrice=" + productPrice + "]";
}
public String save(){
System.out.println("save: " + this);
return "details";
}
}
<form action="product-save.action" method="post">
productName: <input type="text" name="productName"/>
<br><br>
productDesc: <input type="text" name="productDesc"/>
<br><br>
productPrice: <input type="text" name="productPrice"/>
<br><br>
<input type="submit" name="Submit"/>
<br><br>
</form>
-
- 必须要有一个无参的构造器:通过反射的方式创建实例。从下面的配置文件中可以发现,我们只是传入了一个类的名字,所以它是通过反射的方式创建的类对象。
<action name="product-input" class="com.opensymphony.xwork2.ActionSupport" method="execute"> <result name="success" type="dispatcher">/WEB-INF/pages/input.jsp</result> </action>
-
- 至少有一个供struts 在执行这个action 时调用的方法 如Product 中的save() 方法
- 同一个Action 类可以包含多个action 方法,Struts2 会为每一个HTTP 请求创建一个新的Action实例,即Action 不是单例的,不存在线程安全的问题
3. 在Action 中访问WEB 资源:
- 什么是WEB 资源?
- HttpServletRequest, HttpSession, ServletContext 等原生的Servlet API
- 为什么访问WEB 资源?
- B\S 应用的Controller 中必然要访问WEB 资源: 向域对象中读写属性,读写Cookie, 获取realPath...
- 如何访问WEB 资源?
- 和Servlet API解耦的方式:只能访问有限的Servlet API对象,且只能访问有限的方法(读取请求参数,读写域对象的属性, 使session 失效)
- 使用ActionContext
- 实现XxxAware 接口
- 和Servlet API 耦合的方式:可以访问更多的Servlet API对象,且可以调用其原生的方法
- 使用ServletActionContext
- 实现ServletXxxAware 接口
- 和Servlet API解耦的方式:只能访问有限的Servlet API对象,且只能访问有限的方法(读取请求参数,读写域对象的属性, 使session 失效)
5. result:
- result 是action 节点的子节点
- result 代表action 方法执行后,可能去的目的地
- 一个action 节点可以配置多个result 子节点
- result 的name 属性值对应的action 方法可能有的一个返回值
- result 一共有2个属性,还有一个是type: 表示结果的响应类型
- result 的type属性值在struts-default 包的result-types 节点的name属性中定义:常用的有:
- dispatcher(默认的):转发,同servlet 中的转发一样
- redirect: 重定向
- redirectAction: 重定向到一个Action
- chain: 转发到一个action