介绍:
strus2缘起于Apache Struts的WebWork框架,旨在提供相对于Struts框架的增强和改进,同时保留与Struts框架类似的结构。2005年12月,WebWork宣布WebWork 2.2以Apache Struts 2的名义合并至Struts。2007年2月第一个全发布(full release)版本释出。
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开。
环境搭建
1,首先第一步,当然是下载strus2的jar包,然后在项目的pom.xml里配置好,不知如何配置的朋友请参考我 Maven环境搭建和创建Maven项目 这篇博客里的环境搭建。
,2,第二步,配置文件,就和mvc.xml文件一样,strus2也是需要配置文件的,
他的核心源码jar包是
在这里我根据自己的意愿,划分了3个xml,参照的是这个jar包里的
第一个xml是struts_vase.xml,里面相当于basedao文件,作用于所有模块的,
第二个是struts_sy.xml,类似mvc.xml等配置文件,在里面配置action来控制请求。
第三个是总配置文件,用来调用使用xml,这样如果是团队项目的话,可以很清晰的找到问题所在。
3,第三步是配置拦截器,上文讲到的Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求。
这样环境已经搭建完成了。
动态方法调用
首先写一个action
package com.zlk.web;
import java.util.Map;
import com.zlk.entity.Cal;
public class HelloAction {
private Cal cal1 = new Cal();
private Cal cal2;
private String sex;
public Cal getCal2() {
return cal2;
}
public void setCal2(Cal cal2) {
this.cal2 = cal2;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String add() {
System.out.println("调用add()方法");
return "rs";
}
public String del() {
System.out.println("调用del()方法");
return "rs";
}
}
然后在struts-sy-xml里面配置,
在package里的 extends属性是调用struts-base.xml里的,
action里的name属性中的号就像占位符一样,可以用数字来代替,1代表第一个号,
接下来写好操作页面和接受结果页面,
在操作页面中,要如下方写好调用的action
然后当我点击时,如果能在控制台输出。那就说明成功了。
传参数
一般在调用方法时,都得传参数过去,struts2和struts不同,他是采用拦截器的,所以他是不能使用在参数中传req过去,
但struts也有自己独特的传参方式,
当页面传参数过来时,这里介绍三种接受方式
1,,Action中定义属性,并提供get/set方法
userName, getUserName/setUserName
2, ModelDriven
返回实体,不能为null,不需要提供get/set方法
3, ModelDriven
返回实体和Action中属性重名,ModelDriven中优先级更高
package com.zlk.web;
import java.util.Map;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ModelDriven;
import com.zlk.entity.Cal;
public class HelloAction implements ModelDriven<Cal> {
private HttpServletRequest req;
private Cal cal1 = new Cal();
private Cal cal2;
private String sex;
public Cal getCal2() {
return cal2;
}
public void setCal2(Cal cal2) {
this.cal2 = cal2;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String add() {
System.out.println("调用add()方法");
return "rs";
}
public String del() {
System.out.println("调用del()方法");
return "rs";
}
/**
* implements modelDrivern
* @return
*/
public String accept1() {
System.out.println(cal1);
return "rs";
}
/**
* 类实例.属性名
* @return
*/
public String accept2() {
System.out.println(cal2);
return "rs";
}
/**
* set/get
*/
public String accept3() {
System.out.println(sex);
return "rs";
}
@Override
public Cal getModel() {
return cal1;
}
}
然后在jsp页面调用一下,(页面报错是正常的,所以可以正常运行)
正常情况下,控制台都可以接受到的。
而当action传返回值的时候,这里有两种方式可以返回:
1,get/set方法
2,通过req,
get/set方法是比较简单的,运用上方的方法就可以传递到jsp页面,但其中的accpt1是不可以的因为他是通过implements modelDrivern,并没有set/get,
所以可以通过第二种方法来传递。
而获取req有四种方式:
分为两类:
1, 非注入
1.1 耦合
ServletActionContext
1.2 解耦(建立使用解耦模式)
ActionContext
2, 注入
2.1 耦合
2.2 解耦
注入也就是实现ServletRequestAware接口来获取request,然后他会提供下列方法,你只需在上方实例化一个req来接受他即可使用,
@Override
public void setServletRequest(HttpServletRequest req) {
this.req=req;
}
而非注入也就是不继承
,但他是通过ServletActionContext.getRequest();来获取request的。