Struts2简单开发流程

struts2简单开发流程 阅读详情
  1. Struts1的执行流程是什么;
  2. Struts2的执行流程是什么;
  3. 我们的Action如何编写;
  4. Action的配置问题;
  5. Action中操作Servlet Api;

1. Struts1的执行流程

大致思路如下:
当web客户端的浏览器发出http请求,然后到达tomcat的web应用服务器,将http请求头封装成HttpServletRequest和HttpServletResponse对象,然后doPost(req,resp)或者doGet(req,resp)到Tomcat的Servlet容器的前端控制Servlet, 也就是ActionServlet; 然后在其service中会调用RequestProcessor的process()方法,在这个主要的方法中,
1;会通过方法 String path = processPath(request, response) 截取出URL,也就是struts-config.xml的action的path部分;
2;processLocale(request, response) 处理国际化用到的Local相关信息;
3;ActionMapping mapping = processMapping(request, response, path); 根据path从ModuleConfig中取出Action的东西封装成ActionMapping;
4;ActionForm form = processActionForm(request, response, mapping); 根据ActionMapping 中的name属性查找ActionForm, 如果要是配置了ActionForm,那么就到request或者session中查找,如果在这两个中都没有找到,那么就根据ActionForm的路径采用反射来创建出ActionForm,并根据scope值将其放入到request或者session中;
5;processPopulate(request, response, form, mapping); 主要是将表单的数据收集转型到ActionForm中,在这个过程中会用到一个一个第三方组件BeanUtils将Map的值(将表单中的数据放入map中了)根据ActionForm中的字段类型转好,再调用setter方法将其放入到ActionForm上;
6; Action action = processActionCreate(request, response, mapping); 根据Action的完整类名称(type)到一个Map中去找,如果没有找到,就用反射创建一个,再将创建好的Action的放到Map中,所以Struts1的Action是单例的存在线程安全问题;
7; ActionForward forward = processActionPerform(request, response, action, form, mapping); 执行我们自定义的Action的execute方法,并将ActionForward返回;
8;processForwardConfig(request, response, forward); 根据上面的ActionForm完成相应的转发和转向;


3. Struts2的大致执行流程

这里写图片描述

Struts2的中央控制器是StrutsPreparedAndExecuteFilter这个类就类似Struts1中的ActionServlet; 这个中央控制器会创建一个Action的代理对象,这个ActionProxy会做一系列的工作,然后再调用真正的Action上去;这个类中有一个主要方法:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

1; ActionMapping mapping = prepare.findActionMapping(request, response, true); 取得ActionMapping;
2; 执行ExecuteOperators.execute.executeAction(request, response, mapping);
3; 在executeAction中会调用Dispatcher的serviceAction;execute.executeAction(request, response, mapping); 会调用一个很关键的方法:

 ActionProxy proxy = getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
                    namespace, name, method, extraContext, true, false);

这个ActionProxy是生产的StrutsActionProxy的父类;同时;
在生成ActionProxy代理的方法中会创建一个关键类:DefaultActionInvocation

public ActionProxy createActionProxy(ActionInvocation inv, String namespace, String actionName, String methodName, boolean executeResult, boolean cleanupContext) {

        DefaultActionProxy proxy = new DefaultActionProxy(inv, namespace, actionName, methodName, executeResult, cleanupContext);
        container.inject(proxy);
        proxy.prepare();
        return proxy;
    }

同时,会调用DefaultActionProxy类的prepare()方法;在这个方法中会调用ActionInvocation invocation的init()方法;
在init()方法中有两个关键步骤:
createAction(contextMap);
List interceptorList = new ArrayList(proxy.getConfig().getInterceptors());
interceptors = interceptorList.iterator();
先说第一个createAction(contextMap);
会调用ObjectFactory的buildAction方法
action = objectFactory.buildAction(proxy.getActionName(), proxy.getNamespace(), proxy.getConfig(), contextMap);
会采用反射机制创建出Action,并且把Action赋值给ActionInvocttion成员变量中
其次第二个关键步骤:拿到18个拦截器;也放到ActionInvocation的成员变量interceptors中

也就是,在创建这个ActionProxy的过程中干了两个比较重要的是,第一创建了一个ActionInvocation 并且将创建的Action和18个拦截器放入了ActionInvocation的成员变量中;
最后在Dispatcher中生成了ActionProxy;
4;在Dispatcher的serviceAction的方法中调用生成代理类(StrutsActionProxy)的execute()方法;在这个execute()方法中会执行一个关键的操作,ActionInvocation的invoke();
5;ActionInvocation的invoke(); 进而会执行ActionInvocation中已经装入成员变量的拦截器interceptors的intercept方法;invokeActionOnly()方法;在invokeActionOnly()方法中会调用invokeAction(getAction(), proxy.getConfig());调用Action方法,返回转向的字符串;然后还是在这个invoke()方法中进而执行executeResult(); 在executeResult()中最终又会通过Struts2的ObjectFactory objectFactory.buildResult(resultConfig, invocationContext.getContextMap()); 创建一个Result对象,然后在executeResult()中,执行Result的result.execute(this);转向或者重定向到相应的视图模块;


3、Struts2中的Action如何编写
在Struts1中,我们可以继承Action覆盖execute方法:

public class MyAction extends Action {

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
    }
}

在Struts2中,我们有三种方法来开发自己的Action;
第一种:就是一个POJO类无需继承,无需实现任何接口和类,但是需要在类中添加execute方法就可以

public String execute(){return "success";}

第二种:通常实现com.opensymphony.xwork2.Action接口,并且实现的其execute方法,

public class LoginAction implements Action {

    private LoginForm loginForm;
    private LoginDao loginDao;

    @Override
    public String execute() throws Exception{
        //以后使用Spring IOC实现;
        String result = loginDao.checkUser(loginForm);
        if(result!=null)
            return SUCCESS;
        return LOGIN;
    }
}

第三种:还有一种方式是继承com.opensymphony.xwork2下的ActionSupport类,并覆盖其execute方法;
ActionSupport已经实现了Action接口, 还实现了Validateable接口,提供了数据校验功能。通过继承该ActionSupport类,可以简化Struts 2的Action开发。
总结:
struts2不要求我们自己设计的action类继承任何的struts基类或struts接口, 但是我们为了方便实现我们自己的action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类里的public String execute() throws Exception方法。 因为此类中实现了很多的实用借口,提供了很多默认方法,这些默认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。在action中并非一定需要execute方法,也可以指定自己需要的方法,action编写完毕后,就需要在struts.xml文件中编写配置文件了;


4.Action类的配置问题;
4.1 Action类配置涉及到几个关键属性如下:

  • name : action的名字,用于匹配请求的url;
  • class : Action实现类的完整类名;
  • method : 调用Action实现类中指定的方法;

    4.2 Action配置通配符使用:
    首先对 method 属性进行说明:
    通常action的作用是完成一个功能点,但是例如CRUD这样的操作使用四个action类显然不划算,在struts 2中可以将这四个功能映射到一个action中进行处理,这里就需要使用method属性了。具体的做法是:在struts.xml配置文件中为一个action使用method属性和name属性指定不同别名,就可以实现CRUD映射到同一个action了。

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport{

    private static final long serialVersionUID = 1L;

    //查询
    public String listUser() throws Exception {
        return SUCCESS;
    }

    //修改
    public String updateUser(){
        return SUCCESS;
    }

    //删除
    public String deleteUser(){
        return SUCCESS;
    }

    //添加
    public String addUser(){
        return SUCCESS;
    }
}
<package name="user" namespace="/user" extends="struts-default">
        <!-- name class method 识别同一个Action中的不同方法-->
        <action name="list_User" class="action.UserAction" method="listUser">
            <result>/list_User.jsp</result>
        </action>
        <action name="add_User" class="action.UserAction" method="addUser">
            <result>/add_User.jsp</result>
        </action>
        <action name="delete_User" class="action.UserAction" method="deleteUser">
            <result>/delete_User.jsp</result>
        </action>
        <action name="update_User" class="action.UserAction" method="updateUser">
            <result>/update_User.jsp</result>
        </action>
</package>

使用通配符映射的方式可以大大减少action的数量,所谓通配符就是使用,用于匹配0个或多个字符。在action的配置中,可以为name属性使用来匹配任意的字符。比如下面的配置:

<action name="*_*" class="action.{1}Action" method="{1}User">
     <result>/{1}_{2}.jsp</result>
</action>

5. Action中操作Servlet Api

方法一: Struts2提供了一个ActionContext类,Struts2的Action可以通过该类来访问Servlet API。类中常用方法如下:

  • Object get(Object
    key):相当于HttpServletRequest的getAttribute(Stringname)方法。
  • Map getApplication():返回一个Map对象,该对象模拟了该应用的ServletContext实例。
  • static ActionContext getContext():静态方法,获取系统的ActionContext实例。
  • Map getParameters():获取所有请求参数。类似于HttpServletRequest的getParameterMap().
  • Map getSession():返回一个Map对象,该Map对象模拟了HttpSession实例。
  • void setApplication(Map
    application):传入一个Map的key-value,转换成application的属性名、属性值。
  • void setSession(Map session):传入一个Map的key-value,转换成session的属性名、属性值。

方法二: Struts2提供如下几个接口(需要implements并实现方法):

  • ServletContextAware:实现该接口的Action可以直接访问Web应用的ServletContext实例。
  • ServletRequestAware:实现该接口的Action可以直接访问用户请求的HttpServletRequest实例。
  • ServletResponseAware:实现该接口的Action可以直接访问服务器响应的HttpServletResponse实例。

    方法三: 使用ServletActionContext(工具类)访问Servlet API:

  • static PageContext getPageContext():取得Web应用的PageContext对象。

  • Static HttpServletRequest getRequest():取得Web应用的HttpServletRequest对象。

  • Static HttpServletResponse getResponse
    ():取得Web应用的HttpServletResponse对象。

  • Static ServletContext getServletContext():取得Web应用的ServletContext对象。

struts2开发流程简图 struts2 开发流程 简图 struts2 开发流程 简图 struts2 开发流程 简图 struts2 开发流程 简图 立即下载

相关推荐

Struts2的工作流程及配置文件

Struts2的工作流程及配置文件

struts开发流程及详细

一:Struts开发步骤:    1. web项目,引入struts - jar包    2. web.xml中,引入struts的核心功能         配置过滤器    3. 开发action    4. 配置action        src/struts.xml 二:详细配置    1.引入8个jar文件       commons-file

Doraemon 633

Struts开发指南之工作流程

Struts开发指南之工作流程下图是Struts的工作流程,前边我们提到,所有的请求都提交给ActionServlet来处理。  ActionServlet是一个FrontController,它是一个标准的Servlet,它将request转发给RequestProcessor来处理,  ActionMapping是ActionConfig的子类,实质上是对struts-config.xml的一个映射,从中可以取得所有的配置信息RequestProcessor根据提交过来的url,如*.do,从ActionMapping中得到相应的ActionForn和Action。然后将request的参

## Struts2第一天 ##

## Struts2第一天 ## ---------- **Struts2的学习路线** 1. Struts2的入门:主要是学习Struts2的开发流程(Struts2的开发流程、常见的配置、Action类的编写) 2. Struts2的Servlet的API、参数封装和拦截器 3. Struts2的值栈和OGNL表达式 ---------- ### 今天的课程内

weixin_38026731的博客 391

RK3568—基于GM8775C的MIPI转双通道LVDS屏幕调试

Rockchip RK3568 原生显示接口不支持双通道LVDS屏幕的数据输出,因此需要借助显示转换芯片才能实现双通道LVDS屏幕的驱动。本文介绍使用GM8775C芯片方案,在 RK3568 平台实现单路 MIPI DSI 信号输出来驱动双通道LVDS显示屏。 关于GM8775C GM8775C 型 DSI 转双通道 LVDS 发送器产品主要实现将 MIPI DSI 转单/双通道 LVDS功能,MIPI 支持 1/2/3/4 通道可选,每通道最高支持 1Gbps 速率,最大支持 4Gbps 速率。LV.

Industio_优快云的博客 1万+

Uniapp-APP后台保活插件(安卓后台保活)

Uniapp-APP后台保活插件(安卓后台保活)亲测有效!

weixin_57844432的博客 1万+

Struts2——开发Action

文章目录一、Action开发的三种方式1.1 继承ActionSupport类1.2 实现Action接口1.3 不继承任何类、不实现任何接口二、请求数据的封装2.1 提出问题2.2 解决问题2.2.1 向后端传递数据2.2.2 后端接收数据 一、Action开发的三种方式 参考:https://mp.weixin.qq.com/s/6YLd8CwsieXOht8cf_R-LQ 1.1 继承Act...

且行且珍惜 1016

ERA5获取的风场数据转换为.dfs2文件

ERA5获取风场数据的具体步骤可以参考下面的文章下载好后应该是.nc格式的文件,想要读取或者转换成其他格式的文件可以安装下面步骤,本文介绍如何转换为.dfs2文件。

我的博客 1459

Struts2的运行流程及其工作原理

Struts2核心组件介绍 ActionMapper:通过method参数将请求转发到具体的action   ActionProxy代理:是Action的一个代理类,也就是说Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方法,而该方法又调用了ActionInvocation.invoke()方法。归根到底,最后调用的是...

qq_36976949的博客 306

PLC编程标准之争:IEC61131与IEC61499核心区别与选型指南

在工业自动化领域,PLC编程长期依赖IEC61131标准,它定义了梯形图、结构化文本等语言,通过周期扫描机制保证确定性执行。然而,随着工业4.0和分布式控制场景的兴起,IEC61499以事件驱动模型打破传统范式,让功能块能跨设备协同,实现更灵活的柔性产线和模块化系统。理解两者在程序结构、数据交互、部署方式和实时性上的差异,是选型与工程落地的关键。本文从基础概念出发,剖析执行模型与架构演进,结合一线调试经验,帮助工程师在传统PLC与下一代标准之间做出理性决策。

weixin_27014595的博客 267

RT-DETR改进有效系列目录 | 包含卷积、主干、RepC3、注意力机制、Neck上百种创新机制

Hello,各位读者们好Hello,各位读者,距离第一天发RT-DETR的博客已经过去了接近两个月,这段时间里我深入的研究了一下RT-DETR在ultralytics仓库的使用,旨在为大家解决为什么用v8的仓库训练的时候模型不收敛,精度差的离谱的问题,我也是成功的找到了解决方案,对于ultralytics仓库进行多处改进从而让其还原RT-DETR官方的实验环境从而达到一比一的效果。同时本人一些讲解视频和包含我所有创新的RT-DETR文档。

Snu77的博客 3万+

Struts2快速入门,超简单详细的快速入门教程

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。

2401_84002482的博客 2399

【机器人技术基础】MATLAB Robotics Toolbox PUMA560 运动学正逆解

机器人技术基础实验2报告 1. 实验目的和要求 2. 实验手段 2.1 实验原理 2.2 函数详解 3. 实验主要内容 4. 实验结果和分析 4.1 正运动学求解 例1 例2 4.2 逆运动学求解 例1 例2 1. 实验目的和要求 掌握常见形式的机器人的D-H坐标系建立方法、运动学建模; 正逆运动学分析与求解; 使用Robotics Toolbox对直角坐标机器人、圆柱坐标机器人、球坐标机器人、PUMA560其中之一建立运动学模型,正逆求解和仿真。 2. 实验手段 2.1

【人工智障 | 计算鸡视觉 | 机器孩】 1万+

用Idea 开发一个简单的Struts2+Maven+Hibernate 项目的流程

本文整理了用Idea Intellij 开发一个综合运用Strut 2, Maven 和Hibernate 项目的流程,并在步骤中对比了此项目技术相对于Servlet、手动添加Jar 和JDBC 的优势,还记录了一些可能出现问题的坑,最后总结项目收到请求后的执行过程。源码地址 (优快云 下载需要积分,欢迎支...

龚道松 849

MicroCap声学仿真介绍(六)-入耳式耳机仿真

从上图可以看出,后腔开了泄声孔后,振膜的最大位移从4.8um提升到了10um,振膜位移增加了一倍。在实际应用中,一般耳机的前腔和后腔都需要开泄声孔,开孔的大小和调音网布的阻尼需要根据客户的要求以及仿真的结果进行权衡选择。接着在主界面放置电阻、电感、电容,电阻值为Rms,电感值为Mms,电容值为Cms,如下图。假设后腔泄声孔的直径为1.2mm,宽度为0.3mm,对应调音网的阻抗为5.5e8欧姆。假设前腔泄声孔的直径为1.2mm,宽度为0.3mm,对应调音网的阻抗为5.5e8欧姆。

山无忧的博客 1797

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Struts2 开发流程

一、确定Struts在开发中的地位    Struts其实就是一个Servlet; 根据传统MVC开发模式,如图所示:       Servlet担任了Controller的职责, 而Struts框架加入后,Struts其实就是担当了Servlet的职责,即任何一个处理请求都会经过Struts框架,并由他进行分发;     二、Stru

过天的专栏 1110

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

struts2的搭建

首先是搭建Struts2环境。 第一步 下载Struts2 去Struts官网 http://struts.apache.org/ 下载Struts2组件。 截至目前,struts2最新版本为2.3.1.3,下载struts-2.3.16.3-all.zip,解压,放着。 第二步 新建Web Project并导入jar包 在MyEclispe中新建Web Project,然后找到解压

z_ycao的博客 649

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

二、Struts2开发流程

一、确定Struts在开发中的地位 Struts其实就是一个Servlet; 根据传统MVC开发模式,如图所示: Servlet担任了Controller的职责,而Struts框架加入后,Struts其实就是担当了Servlet的职责,即任何一个处理请求都会经过Struts框架,并由他进行分发; 二、Struts2开...

mmdev 240

Struts2简单实例开发

##Struts2简单实例开发 1.下载struts2 2.建立项目,导入struts2的jar包 3.配置web.xml &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/...

1号帅比的博客 495

简单的Struts2登录功能流程

开发环境 eclipse、jdk1.7.0_55、tomcat7.0.54、struts2.3.16 下载struts2全jar包 进入下载地址:http://struts.apache.org/download.cgi 如果需要其他的版本则下拉页面到Prior releases 下载后解压得到 一般只需要下载下来的jar包中lib文件夹中的commons-fileuploed-1.3jar、freemarker-2.3.19、ognl-3.0.6.jar、str.

xxyuan_csdn的博客 1013

Struts2工作流程理解

Struts2的工作流程的理解: 1. 客户端浏览器向servlet容器(Tomcat)发出请求。 2. Web.xml配置的过滤器StrutsPrepareAndExecuteFilter起作用,设定的请求转发给Struts。 3. StrutsPrepareAndExecuteFilter过滤器到ActionMapper中查找Action。 4. 如果找到了Action,那么控制权

巩庆奎 1467

Struts基本开发搭建步骤-总结

原来Struts2和srtuts1完全是两码事,两个几乎就不是一个东西,与其还不如说struts2是webwork的,相比struts1,确实有难度,但是从技术的层面上讲,struts2的技术明显比struts1的技术含量高,而且,在代码维护方面做的更开优秀,我这里不再说理论,只讲过程,因为综合以往的对于框架的学习,其学习的方法就是学学会使用,然后再去试着理解。 下面简单的说一下Struts最为

MyCodeDream的专栏 622

Struts2——简单登录处理

下面为Strut2Demo应用增加一个简单的登录处理流程: loginForm.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-

在此立一个IT职业上的flag:https://github.com/Zeb-D/my-review 1万+
上一篇: Spring+Hibernate : 声明式事务
下一篇: Spring和Struts2集成
Coder-Qian
博客等级 码龄11年 63粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值