最近在学习框架,很多人建议我直接学SSM,SSM看了一段时间后发现很多东西虽然可以用了,但是并不是很了解,所以我打算重新来过.从SSH开始学习,前面已经大致的学习了Hibernate,对于Hibernate有了更深刻的认识,下面开始做Struts2的梳理.

什么是Struts2?

Struts2是非常优秀的MVC框架.是油传统Struts1和Xwork两个框架发展出来的.

Struts2和Struts1最大的不同点是什么?

Struts1严重依赖struts1 API,有侵入性,Struts1写写action 和FormBean的时候必须实现Struts的Action类, 而Struts2之所以以WebWork的设计思想为其核心,不需要集成action类,任何一个javabean类都可以作为业务处理类.

Struts1是使用ActionServlet做为其中心处理器,Struts2则使用一个拦截器(FilterDispatcher)做为其中心处理器,这样做的一个好处就是将Action类和Servlet API进行了分离

Struts2的简单处理流程是什么?

  1. 浏览器发送请求
  2. 中心处理器根据struts.xml文件查找对应的action类
  3. WebWork的拦截器链自动对请求应用通用功能,例如:WorkFlow、Validation等功能
  4. 如果Struts.xml中配置了Method参数,则寻找对应的参数,如果没有则调用默认的execute()方法来处理用户请求
  5. 将Action类中的对应方法返回的结果响应给浏览器

Strtus2与Struts1进行对比

  1. Action类的实现方式   Struts1必须扩展Action类或者Action的子类,Struts2的Action类实现的时候可以不用实现任何类和接口,虽然Struts2中提供一个ActionSupport类,但是,不是必须的。
  2. Struts1的Action类是单例模式,必须设计成线程安全的,Struts2则为每一个请求产生一个实例
  3. Struts1的Action类依赖与Servlet API,从其execute的方法签名可看出,execute方法有两个Servlet的参数HttpServletRequest和HttpServletResponse,Struts2则不依赖于Servlet API
  4. Struts1依赖于Servlet API这些Web元素,因此对Struts1的Action进行测试的时候是很困难的,需要借助与其他的测试工具,Struts2的Action可以象测试其他的一些Model层的Service类一样进行测试
  5. Struts1的Action与View通过ActionForm或者其子类进行数据传递,虽然也有LazyValidationForm这样的ActionForm的出现,但是,还是不能象其他层面那样通过一个简单的POJO进行数据传递,而Struts2将这样的奢望变成了现实
  6. Struts1绑定了JSTL,为页面的编写带来方便,Struts2整合了ONGL,也可以使用JSTL,因此,Struts2下的表达式语言更加强大

Struts2的必须jar包分析

  • struts2-core-2.3.1.1.jar:Struts2框架的核心类库
  • xwork-core-2.3.1.1.jar:Command模式框架,WebWork和Struts2都基于xeork
  • ognl-3.0.3.jar: 对象图导航语言(Object Graph Navigation Language),struts2框架通过其读写对象的属性
  • freemarker-2.3.18.jar:Struts 2的UI标签的模板使用FreeMarker编写
  • commons-logging-1.1.x.jar:ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。
  • commons-fileupload-1.2.2.jar:文件上传组件,2.1.6版本后需要加入此文件
  • commons-io-2.0.1.jar:传文件依赖的jar包
  • commons-lang-2.5.jar:对java.lang包的增强

一个Struts项目,需要我们写那些东西?

  1. 首先我们要写前台界面jsp    这里需要知道Struts2框架默认接受.action的请求
  2. struts2的核心控制器拦截器,所以要在在web.xml配置filter,指定filter-class为org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  3. 及时过滤器配置/* , 但是struts2 默认处理.action结尾请求,分发到相应Action类
  4. 在scr下配置struts.xml
  5. 需要写action类业务逻辑处理
  6. 需要写结果视图

在一个SSH项目中,最为关键的也是最特色的就是struts.xml和hibernate.xml的配置 ,下面我们学习下struts.xml如何配置,此处很关键.

Struts2框架加载struts2配置的顺序(先后顺序)

  1. default.properties 该文件保存在 struts2-core-2.3.7.jar 中 org.apache.struts2包里面
  2. struts-default.xml 该文件保存在 struts2-core-2.3.7.jar  内含大量拦截器和结果集
  3. struts-plugin.xml  该文件保存在struts-Xxx-2.3.7.jar
  4. struts.xml 该文件是web应用默认的struts配置文件
  5. struts.properties 该文件是Struts的默认配置文件
  6. web.xml 该文件是Web应用的配置文件
  • 如果多个文件配置了同一个struts2 常量,则后一个文件中配置的常量值会覆盖前面文件配置的常量值

Struts2框架Action相关配置

  • struts2所有aciton都是通过package管理
  • struts-default是struts-dafault.xml定义的一个package,内涵大量拦截器和结果集
  • 每个package,都可以定义一个namespace,默认是""   package是用来区分不同包中相同action的 且有namespace的包会被先搜索.
  • Action的访问路径就 = 包名称空间 namespace+Action name属性
  • 如果namespace配置为/demo1, 客户端访问路径 ${pageContext.request.contextPath}/demo1/hello

Action的搜索顺序

举例:访问路径为:

http://localhost:8080/struts2Demo/path1/path2/path3/LoginAction.action

第一步:判断当前路径下包是否存在,如:path1/path2/path3/

第二步:①存在:则去访问相应的Action;如果这个package中不存在对应的LoginAction的action则会直接去默认的namespace包下面找,存在则执行,不存在直接报错.②不存在去path1/path2下寻找对应package

第三步:循环第二步 知道path1下仍没有package,则去默认namespace的包寻找action.

Struts2框架Action配置默认值

  • 可在<package>中定义<default-class-ref> 修改Action默认处理类

Struts2常量配置

  • default.properties定义了struts2 框架的大量常量,开发者可以通过改变这些常量来满足应用的需求
  • 修改struts2 的配置常量,可以通过以下三种方式配置
  • 1. 配置src/struts.xml            <constant name="struts.devMode" value="true" />
  • 2.配置src/struts.properties   struts.devMode = false
  • 3.配置web.xml

Struts2常用的常量介绍

指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker 、velocity的输出
<constant name="struts.i18n.encoding" value="UTF-8"/>
该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开
<constant name="struts.action.extension" value="action"/>
设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
<constant name="struts.serve.static.browserCache" value="false"/>
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
<constant name="struts.configuration.xml.reload" value="true"/>
开发模式下使用,这样可以打印出更详细的错误信息
<constant name="struts.devMode" value="true" />
默认的视图主题
<constant name="struts.ui.theme" value="simple" />
与spring集成时,指定由spring负责action对象的创建
<constant name="struts.objectFactory" value="spring" />
该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性
为 false
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
上传文件的大小限制
<constant name="struts.multipart.maxSize" value=“10701096"/>

指定多个struts配置文件

在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。下面的struts.xml通过<include>元素指定多个配置文件:

<struts>

<include file="struts-part1.xml"/>

<include file="struts-part2.xml"/>

</struts>

通过这种方式,我们就可以将Struts 2的Action按模块添加在多个配置文件中。

Struts2学习笔记整理(一)的更多相关文章

  1. Struts2学习笔记整理(三)

    Struts2的输入校验 之前对请求参数的输入校验一般分为两部分:1.客户端校验,也就是我们写js代码去对客户的误操作进行过滤  2.服务端校验, 这是整个应用组织非法数据的最后防线. Struts2 ...

  2. Struts2学习笔记整理(二)

    这里是重点. Action接口 struts2 的Action可以是POJO 为了让用户开发的Action更加规范struts2提供了一个Action接口 ActionSupport基类 Struts ...

  3. Struts2学习笔记整理(四)

    Struts2上传下载 文件上传 如果想使用HTML表单上传文件(一个或多个),那么必须把HTML表单的enctype属性设置成multipart/form-data,且method=post, 且使 ...

  4. python学习笔记整理——字典

    python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...

  5. Deep Learning(深度学习)学习笔记整理系列之(五)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  6. Deep Learning(深度学习)学习笔记整理系列之(八)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  7. Deep Learning(深度学习)学习笔记整理系列之(七)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  8. Deep Learning(深度学习)学习笔记整理系列之(六)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  9. Deep Learning(深度学习)学习笔记整理系列之(四)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

随机推荐

  1. SeaJS之shim插件:解决非cmd规范的插件与sea的区别

    SeaJS 中的模块默认都遵守 CMD 规范,但现实中已存在大量普通 JavaScript 类库,比如 jQuery.Underscore 等.使用 shim 插件,可以将这些普通 JS 文件转换成 ...

  2. visual filters 滤镜 ie

    滤镜ie9开始就废弃了,用来对ie4-8实现一些多媒体动画之类的效果.可以添加到标准的HTML控件上,例如text,图片   包含:1.界面滤镜  (Procedural Surfaces)2.静态滤 ...

  3. 关于jQuery.click()函数

    最近接手了前同事的项目,关于使用线程控制实现代码热插拔功能! 在线程中,使用了ChatWebSocketHandler,与前台进行实时交互,今天我拿到需求是这样的,结合chatWebSocketHan ...

  4. ⑿bootstrap组件 缩略图 警告框 进度条 基础案例

      <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...

  5. 安装MongoDB启动时报错‘发生系统错误2’的解决办法

    安装数据库mongodb启动时报"发生系统错误2". 这个问题是如果你之前已经装过一次,并且两次安装目录不同,就绝对会碰到的,因为你之前安装的路径已经在注册表中生成了,并没有随着你 ...

  6. vue-cli 前端开发,后台接口跨域代理调试问题

    使用 webpack的方式开发的时候,前台开发过程中需要调用很多后台的数据接口,但是通常前后台分离的开发方式,后台的接口数据很可能是不方便或者是不能在前端同学的电脑上运行的,也就出现了所谓的跨域问题. ...

  7. Linux常用配置讲解

    本文主要讲解Linux的用户设置.主机名设置.网络配置.防火墙配置 用户传输包的命令lrzsz的安装以及SSH服务配置等基本操作. 1. 用户名设置 服务肯定是为了用户,而用户可能对于Linux并不了 ...

  8. 关于如何获取移动端 touchmove 事件中真正触摸点下方的元素

    移动端的touchstart, touchmove, touchend三个事件,点击元素并拖动时,获取到了touchmove事件, 但是event.touches[0].target所指向的元素却是t ...

  9. Win32API起始处的mov edi, edi与用户空间InlineHook

    在x86平台上,无论是在调试器中跟到系统DLL中时,还是反汇编某个系统DLL时,经常会发现很多API的第一条汇编指令都是mov edi, edi.根据经验来讲,C函数的汇编形式,应该是首先push e ...

  10. DocsBuilderGUI 工具使用介绍