login.jsp中

<form action="Login"...

该页面提交后,

web.xml中设置的过滤器会起作用

    <filter>

        <filter-name>struts2</filter-name>

        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

    </filter>

调用用户开发的action来处理用户请求,事先在struts.xml中设置:

(struts.xml文件是Struts框架的核心文件,主要负责管理Struts2框架的业务控制器Action)

<struts>

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

        <action name="Login" class="lee.LoginAction">

            <result name="error">/error.jsp</result>

            <result name="success">/welcome.jsp</result>       

        </action>

    </package>

</struts>

     name为Login的action会调用对用lee.LoginAction类来处理,LoginAction类中

    execute()方法会返回SUCCESS或者ERROR的final String,这些字符串常量在Action接口中被事先定义,

(上面的LoginAction类没继承Action)

<result name="success">/welcome.jsp</result>

即execute()方法返回字串为success时,struts会把welcome.jsp发送给客户,

Struts2的Action是一个POJO

public String execute() throws Exception

 {

  String user = (String)ActionContext.getContext().getSession().get("user");

  if (user != null && user.equals("scott"))

  {

   BookService bs = new BookService();

   setBooks(bs.getLeeBooks());

   return SUCCESS;

   //在实际项目中,不会在控制器中直接创建业务组件,而是通过工厂模式管理业务逻辑组件实例

   //Spring中使用依赖注入

  }

<%@ taglib prefix="s" uri="/struts-tags"%>@taglib表明引用标签。类似java中的import语句prefix="s" 引用的名称在页面可以使用,

就像java中生成的一个对象名,以后调用的时候直接使用<s:xxx/>就可以了,uri="/struts-tags"%表示标签库的路径。相当于import一个具体的类~

public class LoginAction extends ActionSupport

{

    private String username;

    private String password;  

       。。。

 public String execute() throws Exception

public void validate()

 {

  if (getUsername() == null || getUsername().trim().equals(""))

  {

   addFieldError("username", getText("user.required"));

  }

  if (getPassword() == null || getPassword().trim().equals(""))

  {

   addFieldError("password", getText("pass.required"));

  }

 }}

ActionSupport类是一个工具类,它实现了Action接口,它还实现了Validatable接口,提供了数据校验功能。

通过继承ActionSupport类,可以简化Action的开发,validate()方法会在execute()方法之前被执行,

若validate()执行之后,FieldError不为空,则请求会被转发给input逻辑视图,

其他地方都没有改动,而能够在返回给用户的html页面提示出错信息,这是因为struts2的<s:form..>和表单控件已经提供了输出校验错误的能力

大量的validate()方法比较烦人,struts2提供了定义配置文件的方法来完成数据校验,

struts2的业务逻辑控制器 不会对用户请求做任何实际处理,用户请求最终由 模型组件处理,业务控制器只是中间负责调度的调度器

核心过滤器StrutsPrepareAndExecuteFilter加载struts2框架(负责拦截所有用户的请求)

->转发请求给Action->调用模型组件

Struts2的工作原理

  (1)客户端向Servlet容器(如Jetty、Resin或tomcat等)发送请求。

  (2)该请求首先经过一个标准的过滤器链,过滤器链包括可选的ActionContextCleanUp过滤器等。

  (3)核心过滤器StrutsPrepareAndExecuteFilter(FilterDispatcher)被调用,该过滤器依次查找ActionMapper来决定这个请求是否调用用户请求的action。

  (4)如果ActionMapper决定调用Action,StrutsPrepareAndExecuteFilter(FilterDispatcher)把请求的处理控制器交给ActionProxy。

  (5)ActionProxy向ConfigurationManager询问框架的配置文件struts.xml找到要调用的Action类。

  (6)ActionProxy创建ActionInvocation实例,负责命令模式的实现。

  (7)在调用Action之前调用拦截器。

  (8)在Action执行后,ActionInvocation负责根据Action的返回结果在struts.xml配置文件中找对应的视图资源。

  (9)执行返回的结果,返回的结果通常是JSP或者FreeMarker模版,也可能是Action。模版可以使用框架提供的Struts2标签。

  (10)拦截器再次被执行(顺序和Action被调用之前的执行顺序是相反的)。

  (11)响应通过web.xml文件中配置的过滤器(Struts2核心控制器)返回

最新文章

  1. ListView用法总结
  2. [SAP ABAP开发技术总结]SD销售订单定价过程
  3. POJ 3660 Cow Contest (闭包传递)
  4. ubuntu获取硬盘的uuid。
  5. ZOJ 3471 Most Powerful(DP + 状态压缩)
  6. codeforces 510E. Fox And Dinner 网络流
  7. 。net MVC 序列化 反序列化
  8. swap与dd命令使用详解
  9. java将map拼接成“参数=值&amp;参数=值”
  10. django[post与get测试]
  11. python字典作为统计记录工具
  12. 深入理解Java中的不可变对象
  13. 博客搬家 https://hanwang945.github.io/
  14. python操作Excel-写/改/读
  15. 模板引擎之-jade
  16. &lt;花荣《至尊狐狸》中国股市精英最优套利战术&gt;读书笔记
  17. 升级优化关于日志生成logging封装TimedRotatingFileHandler
  18. VMware 三种网络模式的区别
  19. 【计算机基础】当你在浏览器中输入Google.com并且按下回车之后发生了什么?
  20. Python函数式编程——map()、reduce()

热门文章

  1. java性能监控工具:jmap命令详解
  2. iOS 给tableView设置contentInset不生效?
  3. 《Netty in action》目录修复版本分享
  4. android动画效果(转载)
  5. JQ 报表插件 jquery.jqplot 使用
  6. Jetty修改默认端口
  7. 当您尝试再次安装 SQL Server 时,SQL Server 2008年安装将会失败
  8. shell学习三十八天----运行顺序和eval
  9. Deep Networks for Image Super-Resolution with Sparse Prior
  10. 【ASK】git使用中出现Permission denied (publickey).