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核心控制器)返回

struts2的HelloWorld的基本过程的更多相关文章

  1. Struts2 拦截器具体配置过程

    拦截器差点儿遍布每个程序中,所以贴出拦截器配置的具体过程,希望可以帮到大家. Struts2 拦截器具体配置过程 <interceptors> <!-- 先定义拦截器 --> ...

  2. 使用maven+eclipse搭建最简单的struts2的helloworld

    使用maven+eclipse搭建最简单的struts2的helloworld 一.web分层结构简介 1.web[细]粒度分层结构: 按细粒度分层可以分为以下6种: 1).表现层:html/css/ ...

  3. 转载 - Struts2 拦截器详细配置过程

    出处:http://www.blogjava.net/zzzlyr/archive/2009/10/12/297998.html Struts2 拦截器详细配置过程 1:所有拦截器的超级接口Inter ...

  4. Struts2拦截器的执行过程浅析

    在学习Struts2的过程中对拦截器和动作类的执行过程一度陷入误区,特别读了一下Struts2的源码,将自己的收获分享给正在困惑的童鞋... 开始先上图: 从Struts2的图可以看出当浏览器发出请求 ...

  5. Struts2之HelloWorld

    首先既然是开发Struts程序的话,那么自然需要用到Struts2开发包,Struts2是apache旗下的开源框架,所有的开发包和源代码都可以在Apache官网下载. 那么,就来开始编写第一个Str ...

  6. 创建一个struts2的HelloWorld

    1.下载struts2的jar包 http://struts.apache.org/download.cgi#struts255 下载一个稳定版本Struts 2.3.31 里面提供了maven ja ...

  7. Struts2 的 helloworld

    配置步骤: 1.在你的strut2目录下找到例子项目,把它的 lib 下的jar拷贝到你的项目.例如我的:struts-2.3.24\apps\struts2-blank 2.struts-2.3.2 ...

  8. 使用MyEclipse 9.0 创建 struts2 的HelloWorld 工程

    作为眼高手低的典范,必须痛改前非,好好动手多做开发! 本文是struts2的入门指导,权当笔记! 在MyEclipse中,配置Apache tomcat 7.x 服务器 创建新的Web project ...

  9. 2.第一个Struts2程序-HelloWorld程序

    1.新建Web Project项目:Study_Struts2 2.新建HelloWordAction.java类 3.复制struts.xml文件到src目录下,配置struts.xml文件内容如下 ...

随机推荐

  1. 【批量加入】-拼接sql字符串

    如今做的一个项目须要用到批量加入,可是封装的底层没有这种方法,所以自食其力,自己来写.我们用的是拼接sql字符串的方法来实现功能. 详细实现流程:首先将须要的数据存储到实体的list中,然后将这个li ...

  2. [Win10应用开发] 如何使用Windows通知

    消息通知,是一个应用中必不可少的组成部分.Win10下提供了多种消息通知机制,Toast通知只是其中一种.这篇博文和大家分享一下,如何使用Toast通知. 上图是一个基本的Toast通知,那我们该如何 ...

  3. Installing scipy on redhat with error “no lapack/blas resources found”

    这是更新scipy出现的结果,需要新版本的scipy,而机器上只装了0.7的版本,更新的时候报错,找到了一个解决方法: wget http://mirror.centos.org/centos/6/o ...

  4. 移动端上下滑动事件之--坑爹的touch.js

    原文   http://blog.csdn.net/minidrupal/article/details/39611605 移动端页面的盛行,微信的便利的页面推广等等,让越来越多的css3效果和htm ...

  5. 第6步:检查grid安装环境

    6.1 检查系统包 grid 身份下校验安装环境(检测crs安装环境(sgdb1)) [root@node1 soft]#su – grid [grid@node1 ~]$ cd /soft/grid ...

  6. 自己动手写ORM(02):Sql生成器实现

    上一节中鄙人通过解析表达式树生成Sql碎片,其中我也把解析表达式类代码贴了出来,文章发布之后我对ExpressionAnalyzer类做了些改动,下面我还会将代码贴出来,废话不多说,直接进入今天的主题 ...

  7. 维纳滤波和编码曝光PSF去除运动模糊【matlab】

    编码曝光知识 - ostartech - 博客园 https://www.cnblogs.com/wxl845235800/p/8276362.html %%%%%%%%%%%%%%%%%%%%%%% ...

  8. session和cookie的联系与区别

    区别: 1.cookie是存放在浏览器上的,session是存放在服务器上的: 2.cookie不安全,别人可以通过分析本地的cookie并进行cookie欺骗,session比cookie安全: 3 ...

  9. JZOJ.5246【NOIP2017模拟8.8】Trip

    Description        多年之后,worldwideD厌倦竞争,隐居山林.       他的家乡开始发展起了旅游业,在一条很长的主干道上,有N个旅游景点,按顺序编号为1到N.根据游客们网 ...

  10. angualar入门学习-- 自定义指令 认识属性

    个AngularJS指令在HTML代码中可以有四种表现形式: 1.作为一个新的HTML元素来使用 2.作为一个元素的属性来使用 3.作为一个元素的类来使用 4.作为注释来使用 一.创建指令 angul ...