一、struts原理
一个请求在Struts2框架中的处理大概分为以下几个步骤
1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6 ActionProxy创建一个ActionInvocation的实例。
7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者
FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。
二、Struts2优缺点:
1.对框架API和ServletAPI的依赖减少,可扩展性提高。
1.Struts2基于MVC架构,框架结构清晰,开发流程一目了然,开发人员可以很好的掌控开发的过程
2.使用OGNL进行参数传递,大大简化了开发人员在获取这些数据时的代码量。
3.强大的拦截器,实现的的一Web项目中,就是使用Struts2的拦截器来完成了系统中的权限验证功能。
4.Struts2的Action都是简单的POJO,这样可以方便的对Struts2的Action编写测试用例,大大方便了Java Web项目的测试
5.易于扩展的插件机制
6.模块化 Struts2已经把模块化作为了体系架构中的基本思想,可以通过三种方法来将应用程序模块化: 将配置信息拆分成多个文件 把自包含的应用模块创建为插件
创建新的框架特性,即将与特定应用无关的新功能组织成插件,以添加到多个应用中去
7.全局结果与声明式异常
三、搭建Struts2的开发环境
1、找到所需的jar包:发行包的lib目录中(不同版本需要的最小jar包是不同的,参见不同版本的文档。2.1.7)
struts2-core.jar 核心jar包
xwork-2.jar xwork核心jar包

ognl.jar ognl表达式

freemarker.jar FreeMarker模板

commons-logging.jar 日志
commons-fileupload.jar 文件上传

commons-io.jar 文件上传依赖的包

2、在应用的WEB-INF/classes目录下建立一个名称为struts.xml的配置文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

</struts>
3、配置核心控制器,就是一个过滤器
<filter>
<filter-name>struts2</filter-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-mapping>
4、如果TOmcat启动成功,没有报错,证明环境搭建成功!

四、开发第一个Struts2案例
1、编写struts.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts><!--这是Struts2配置文件的根元素-->
<package name="itcast" namespace="/test" extends="struts-default">
<!--
pageckage:方便管理动作元素
name:必须有。包的名称,配置文件中必须保证唯一。
namespace:该包的名称空间,一般是以"/"开头
extends:集成的父包的名称。struts-default名称的包是struts2框架已经命名好的一个包。(在struts2-core.jar中有一个struts-default.xml中)
abstract:是否是抽象包。没有任何action元素的包就是抽象包(java类)

-->
<action name="helloworld" class="cn.itcast.action.HelloWorldAction" method="sayHello">
<!--
action:代表一个请求动作
name:同包中必须唯一。动作的名称
class:负责处理的JavaBean的类全名
method:JavaBean中的对应处理方法。(动作方法:特点是,public String 方法名(){})
-->
<result name="success">/1.jsp</result>
<!--
result:结果类型
name:动作方法返回的字符串
主体内容:View的具体地址。
-->
</action>
</package>
</struts>
2、根据配置文件,创建需要的javabean和对应的动作方法, 在动作方法中完成你的逻辑调用。

package cn.itcast.action;

public class HelloWorldAction implements Serializable {
private String message;

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}
public String sayHello(){
message = "helloworld by struts2";
return "success";
}
}
3、编写View,显示结果
${message}

4、访问helloworld动作的方式:http://localhost:8080/struts2day01/test/helloworld 应用名称/包的名称空间/动作的名称
默认情况下:访问动作名helloworld,可以直接helloworld,或者helloworld.action

http://localhost:8080/struts2day01/test/a/b/c/helloworld
/test/a/b/c:名称空间
helloworld:动作名称

搜索顺序:名称空间
/test/a/b/c 没有helloworld
/test/a/b 没有helloworld
/test/a 没有helloworld
/test 有了,调用执行

五、Struts2配置文件的详解
1、struts.xml配置文件编写是没有提示的问题?
方法一:上网即可
方法二:
1、拷贝http://struts.apache.org/dtds/struts-2.1.7.dtd地址
2、Eclipse的window、preferences,搜索XML Catelog
3、点击add按钮
Location:dtd文件的路径
Key Type:URI
Key:http://struts.apache.org/dtds/struts-2.1.7.dtd
2、Struts配置文件中的各种默认值。
action:
class:默认值是com.opensymphony.xwork2.ActionSupport
常量: SUCCESS success
NONE none
ERROR error
INPUT input
LOGIN login
method:默认值是public String execute(){}

实际开发中:自己编写的动作类一般情况下继承com.opensymphony.xwork2.ActionSupport
result:
type:转到目的地的方式。默认值是转发,名称是dispatcher
(注:type的取值是定义好的,不是瞎写的。在struts-default.xml中的package中有定义)

<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />

dispatcher:普通的转发到某个页面
chain:普通的抓发到某个动作名称
redirect:重定向到一个页面
redirectAction:重定向到一个动作名称
plainText:以纯文本的形式输出JSP内容
result元素的写法:
方式一:
<result type="chain" name="success">a2</result>
方式二:
<result type="chain" name="success">
<param name="actionName">a2</param><!--name对应的chain的处理器中的setActionName()方法-->
</result>

注意:如果要转向的是在另外一个名称空间的动作,那么只能使用方式二
<package name="p1" namespace="/namespace1" extends="struts-default">
<action name="a2">
<result type="dispatcher" name="success">/3.jsp</result>
</action>
</package>
<package name="p2" namespace="/namespace2" extends="struts-default">
<action name="a1">
<result type="chain" name="success">
<param name="namespace">/namespace1</param>
<param name="actionName">a2</param>
</result>
</action>
</package>

3、开发中配置文件的更改,在访问时让框架自动重新加载:
struts.devMode = false(default.properties)
利用strutx.xml中的constant元素来覆盖掉default.properties默认行为
<struts>
<constant name="struts.devMode" value="true"></constant>
</struts>

4.浏览器访问后缀设置:

<constant name="struts.action.extension" value="action,,do"></constant>

转载于:https://www.cnblogs.com/zszitman/p/4510439.html

sturst2的原理及环境搭建相关推荐

  1. SQL手工注入原理(含环境搭建) ─=≡Σ(((つ•̀ω•́)つ 知己知彼百战百胜 web安全

    文章目录 SQL测试环境环境搭建 下载与安装环境 开启与使用环境 sqli-labs环境部署 dvwa环境部署 SQL手动注入 SQL注入原理 SQL注入分类 SQL注入手段 寻找注点 利用注点 ge ...

  2. Appium - 自动化测试框架 - 工作原理、环境搭建

    前言 Appium是移动端的UI自动化测试框架,基于C/S模式,特点是支持跨平台(安卓,ios),支持多语言(对java,python都有支持的API).本文系博主对于该框架的部分学习记录. 一.什么 ...

  3. 在线引流工具Tcpcopy原理、环境搭建、使用、采坑

    Tcpcopy 0. 手把手教你做中间件.高性能服务器.分布式存储技术交流群 手把手教你做中间件.高性能服务器.分布式存储等(redis.memcache.nginx.大容量redis pika.ro ...

  4. Soul源码学习(一)——soul原理及环境搭建

    概述 Soul 是基于 WebFlux实现的响应式的 API 网关,具有异步.高性能.跨语言等特点. 作者:我希望能够有一样东西像灵魂一样,保护您的微服务.在参考了 Kong.Spring Cloud ...

  5. Dubbo 专题(基础篇):Dubbo 介绍、环境搭建与实践

    前几天复习了 Dubbo 相关的技术点,趁热打铁记录一下,本篇博客属于 Dubbo 的入门基础篇,内容主要包括 Dubbo 概念,Dubbo 特点,Dubbo 基本工作原理,Dubbo 环境搭建,Du ...

  6. SpringBoot热部署环境搭建和原理分析

    SpringBoot热部署环境搭建 插件会监控 classpath的资源变化 对类加载采用了两种类加载器(只重启开发人员编写的代码部分) 一. 现象 开发项目过程中,修改了某些代码后需要本地验证时,需 ...

  7. Struts2→MCV、环境搭建第一个样例、工作原理、核心文件、XML中常用元素、通配符、action后缀、action接收参数、result、标签

    官网 https://struts.apache.org/ 历史包 https://people.apache.org/builds/struts/ MVC 环境搭建第一个样例 工作原理 核心文件 配 ...

  8. 编译原理第三版王生原pdf_CS143:编译原理 | 环境搭建HelloWorld

    本文使用 Zhihu On VSCode 创作并发布 本文是本人新开的坑的第一篇博客,另一个坑请看MIT 6.828 实现操作系统.从另一个坑的第一篇复制两段话: 写成博客的目的是防止自己走马观花,花 ...

  9. APP自动化原理+环境搭建

    3.1 APP原理 1.客户端运行脚本的时候,调用任何的appiumAPI,都会向Appium Server端post一条HTTP请求 2.当开启appium服务器的同时就开启了监听端口,Appium ...

最新文章

  1. 生命或可在星际间传播
  2. 不用加减乘除符号计算两数之和
  3. 欢迎来到“现实”世界,bilibili!
  4. 新功能抢先看!Windows 11 2022 版全新 ISO 镜像来了+下载
  5. sqoop sqoop2_在Sqoop中管理密码的关键提示
  6. 异步方法的编写与使用
  7. 算法导论2-4习题解答(合并排序算法)
  8. java判断运算符_java运算符,判断符(了解)
  9. 安卓车载中控竖屏分三屏
  10. 网络安全----身份认证
  11. 算法-经典趣题-爱因斯坦阶梯问题
  12. java 8 dsl_java – Spring – QueryDsl支持的高级比较器
  13. MobileNext:打破常规,依图逆向改造inverted residual block | ECCV 2020
  14. 钉钉机器人关键词应答_Gmail 邮件推送到钉钉群机器人(详细)教程|国内接收 Gmail 邮件...
  15. Java生成“年月日“+流水号
  16. QT各种压缩包下载地址
  17. AdGuard 无与伦比的广告拦截
  18. 游戏手柄按键遥杆值检测
  19. cpua55和a53哪个好_哪种双核a73和四核a53智能电视更好?电视的64位CPU和双核
  20. python使用pandas拆分excel表并导出(2)

热门文章

  1. Android获取手机内部存储和外部存储
  2. 8 个你必须要掌握的 GitHub 实用技巧!
  3. Spring Boot 整合 Netty(附源码)
  4. 一个jstack/jmap等不能用的case
  5. nginx:模块讲解
  6. map:erase删除元素之后迭代器失效的问题!(iterator not incrementable)
  7. 青少年蓝桥杯_2020_steam考试_中级组_第三题
  8. Android --- GridLayoutManager 设置了 item 均匀分布,但是无效
  9. Android --- SharedPreferences的详细介绍
  10. zabbix mysql主从延迟_zabbix监控mysql主从同步和延迟