Struts1.x
Apache项目的一个子项目
2001年出现Struts1,成为第一个MVC框架
2004年成为Apache软件基金会的顶级项目
Struts2.x
在Struts1.x和webwork的基础上进行合并
但是struts2和struts1的差异很大,却和webwork几乎相同,级就是说struts2是webwork的更新产品
创建一个struts2项目需要将一下jar文件添加到lib目录下

添加struts2核心过滤器的配置
<filter>
<filter-name>struts2</fiter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2<filter-name>
<url-pattern>/*</url-pattern>
</filter-mappping>
编写一个JSP页面
<body>
<form action="hellowworld.action" method="post">
<lable>姓名:</lable>
<input type="text" name="name" placeholder="请输入姓名">
<button type="submit">提交</button>
</form>
</body>
在写一个Action,且为其定义一个成员变量name,提供get 、set 方法以及execute方法
public class HelloWorldAction{
private String name;
public String execute(){
if(name!=null&&!name.isEmpty()){
return "success";
}
return "failtrue";
}
}
配置Action,在 src 目录中创建struts.xml中
<package name="helloworld" namespace="/helloworld" extends="struts-default">
<action name="helloworld" class="com.zhidisoft.action.HelloWorldAction">
<result>/success.jsp</result>
<result name="failtrue">/failtrue.jsp</result>
</action>
</package>
核心过滤器
在struts2.1.2之前的核心过滤器为:
org.apache.struts2.dispatcher.FilterDispatcher
在struts2.1.3之后核心过滤器被建议改为:
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
StrutsPrepareAndExecuteFilter功能解析
1.过滤用户请求
2.初始化请求处理环境
3.创建Action,调用Action的execute方法
4.根据execute方法返回结果,将请求发给相应的结果界面
业务逻辑控制器Action
Struts2中,StrutsPrepareAndExecuteFilter作为核心控制器,统一接受用户请求,对请求做预处理后调用相应的Action来完成具体的业务逻辑处理,所以Action也成为业务逻辑控制器。
在Struts2中。Action就是一个普通的类
1、该类定义了一些属性,并为属性提供了对应的setter和getter方法。
2、Action还提供了一个execute方法来处理用户请求。
3、Action没有耦合任何Servlet API所以无法处理请求但是struts2提供了一系列的拦截器将HttpServletRequest中的参数解析出来,交给Action尽心处理。
4、Struts2真正执行的业务逻辑控制器是Struts2生成的代理Action类,但是该代理Action是以用户定义的Action为代理目标的。
Action的实现方式
1、方式一:
自定义一个POJO(简单的java对象),不耦合任何的Struts2 API
2、方式二:
自定义的Action实现Struts2提供com.opens ymphony.xwork2.Action接口
3、方式三:
自定义的Action继承Struts2提供的com.opens ymphony.xwork2.ActionSupport类
这种方式是Struts2官方建议方式,因为ActionSupport中提供了丰富的功能实现,如数据校验、国际化支出等。
Action的实现方式
public class SupportLoginAction extends ActionSupport{
private String username;
public String execute(){
if("admin".equals(username)&&"admin".equals(password)){
return "success";
}
return "failture";
}
//提供username的get、set方法;
}
Action接收请求参数的方法
1、使用Action类的属性接收用户请求参数:当请求参数较少时,使用该方式进行参数的接收,在Action中为这些属性提供相应的getter和setter方法,,参数名要和getter/setter方法的名字相同

2、使用实体对象方式接收用户请求参数。


3、通过HttpServletRequest对象的getParameter()方法
4:、通过ActionContext对象的getParameters()方法
Action提高
如果每一个Action只能处理一种请求,那么在开发的时候就需要编写大量的Action类,难以提高开发效率,Struts2支持同一Action处理多种不同类型的请求以减少Action了类的数量,提高开发效率,同时也有利于项目的维护。例如:你在对一个对象做增删改查等操作时,将这些请求可以放到同一个Action中,那么只需要在该Action中定义多个类似于execute的方法就可以。这样做到后期维护时可以更方便。

到这个时候你就会发现问题来了,这么多用户请求想对应的方法在同一个类中,该怎么调用呢?
有三种方式可以解决这个问题
第一种,在struts.xml中配置多个<action>,通过action标签的method属性指定当前Action处理请求是调用的方法

其中name指定处理请求的Action名称,该名称本人建议为url的一部分;method指定处理本次请求所调用的那个方法 ;class指定处理请求的Action 的全部类名。
第二种:在struts.xml种只配置一个<action> ,利用struts2提供的动态方法调用功能,在请求的url中包含要处理本次请求的方法名。动态方法调用的url格式为:Action的name属性值_方法名.action,如发送添加用户请求是的URL为:user_add.action,其中user为struts,xml中Action的name属性值,add为处理本次请求的方法名

第三种:使用通配符*

其中*作为通配符放置在name属性值中,将method属性值指定为{1},{1}的含义为在请求处理时将第一个*的实际值作为方法名,如在请求时请求的URL为addUserAction.action,那么第一个*将被add代替,那么同样method属性值将会被设置为add,那么久调用add方法处理了用户请求。
Action中访问Servlet API
开发时,可能必须在Action中访问Servlet的API,那么可以通过一下2种方式进行
方式一:通过ActionContext访问ServletAPI
方式二:通过IOC(控制反转)方式访问ServletAPI
需要实现如下接口
RequestAware、SessionAware、ApplicationAware
以上2种方式访问的并不是真正的原生Servlet API .,ershi Struts抛出访问请求范围、会话范围和应用程序范围中存储属性值的Map类型对象一般情况下已经可以满足开发需要。
在某种特定的情况下,开发人员可能必须访问原生Servlet API如退出登录销毁Session等操作,Struts2页提供了开发人员直接访问Servlet原生API的方式。
通过ServletActionContext方法
通过IOC方式
ServletRequestAware
ServletContextAware
浙公网安备 33010602011771号