首先推荐一本书,虽然我还没看过,但是我以后肯定会看的,《Struts+技术内幕》提取密码:kg6w 。现在只是停留在会使用struts2的层次,自己也想继续深入研究,但是感觉自己的知识面还没那么广,那就等以后工作之后,在回过头来将那几个框架研究一下,写点有深度的文章,而此系列的文章,只是个人的学习记录,将一些重点的东西记录下来,以便以后的复习。谢谢

                          ---WH

一、Struts2的介绍

    讲Struts2框架之前,我们需要知道框架是什么呢?估计大多数初学者都只知道其名却不知其意,框架就是一个半成品,别人将一些功能已经写好了,我们只需要拿来用即可,像我们之前使用的dbutils框架,操作数据,只需要两行代码,不用像一开始一样,老老实实的写一大堆代码,这就是开发框架的意义所在。简化开发(个人对框架认识的理解,其他还有在框架上加自己的代码这些就不说了,肯定还有别的很多功能,这只是我最好理解的一种方式)。

    而Struts2就是一个web层框架,并且是使用MVC设计模式实现的的一个框架,之前使用的是Serlvet+JSP来开发web项目,现在用Struts2框架来替代他,那Struts2到底有哪些优点呢?那就需要我们自己来研究它了。

          请求    -----------  Servlet      --------------  JSP    serlvet+JSP

          请求    -----------      Action   --------------  JSP    Struts

  

二、Struts2的架构图分析

    首先了解前,必须先要知道Struts2的架构图,知道是如何工作的,做了哪些事情,可以不必那么详细的知道每一块具体的细节,先让我们自己有个大概的了解,这样我们就更容易去接受它,使用它。

             

        第一步:请求action,那么就会经过StrutsPrepareAndExecuteFilter,这里会做两件事情,就是下面的两步

        第二步:通过ActionMapping将请求中的各种数据封装起来,拿到请求中的各种参数数据,比如我们的action的名称DemoAction

        第三步:给自己找一个代理对象ActionProxy,来帮助我们处理事情。注意,这个ActionProxy实际上不做任何实事的,而是指挥别人做。

        第四步:ActionProxy叫ConfigManager获取struts.xml中的各种配置信息,其中struts.xml就有action的类全限定类名等信息,这样就可以通过action的名字找到其位置了。

        第五步:有了actionMapping获取的请求数据和ConfigManager获取的struts.xml中的数据,就叫ActionInvacation来查找对应的action了

        第六步:在找到action之前会经过一系列的拦截器,struts内部默认实现的。找到action后,就相当于我们的servlet,在其中执行一些业务代码,然后跳转到目标页面,响应回去。struts的整个过程即结束了。

    就是这么简单,struts2的整个执行过程就这样,而现在我们要写一个struts2的hello world的话,根据struts2的架构图,我们需要配置2个东西,第一个最关键的,在web.xml中配置strutsPrepareAndExecuteFilter即过滤器,配置了该过滤器,请求才会走struts2框架,第二个,struts.xml文件,其中应该有的内容是通过action的名字就能够找到其位置在哪里,稍微会详细讲解。

三、struts2的hello world!

    只需要五步,即可完成。

    3.1、导入jar包

    3.2、在web.xml中配置过滤器

    3.3、核心Action类。

    3.4、配置struts.xml

    3.5、测试

    第一步:非常简单,jar包肯定是记不住的,但是我们要会找。在下载的Struts的jar包中,我使用的是struts-2.3.15.1版本,其中的目录结构需要了解。

              

    这里注意一点,lib下面有100多个jar包,并不需要导入这么多,我们在apps(案例)中找jar包即可,apps-blank.war是最简单的案例,我们把其后缀名改为zip,然后解压,找到其中的lib目录下的jar包复制就行了

              

    第二步:配置过滤器,这个也简单,我们学过过滤器了,配置就跟配置servlet一样。

            

    <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>
    <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>

    第三步:编写核心Action类

          Action类可以有三种不同的类型

             1、普通类,POJO,什么接口也不实现,什么类也不继承

             2、实现Action接口

             3、继承ActionSupport类。

          这里我们使用普通类即可,后面两个在下面会讲解到,最终我们会选择使用继承ActionSupport类,具体原因看下面。

            

    第四步:编写struts.xml

          写的时候忘记了格式,也没关系,找模版。从图中也可以看出,struts.xml文件就放在src下即可

                

          struts.xml的配置详解

                

          注意:action.class可以不写,有默认值,为ActionSuppport类的全县定名,下面会有讲到,action.method也可以不写,默认值为execute,result.name也可以不写,默认值为success。

  核心代码 

<struts>

    <package name="default" namespace="/" extends="struts-default">

        <action name="Demo01Action" class="com.wuhao.struts2.test.Demo01Action" method="execute">
<result name="success">
/index.jsp
</result>
</action>
</package> </struts>
<struts>

    <package name="default" namespace="/" extends="struts-default">

        <action name="Demo01Action" class="com.wuhao.struts2.test.Demo01Action" method="execute">
<result name="success">
/index.jsp
</result>
</action>
</package> </struts>

     第五步:测试

          http://localhost:8080/struts2-hello/Demo01Action 其中用红色标记的就是我们在struts.xml中设置的package的namespace+action中的name。通过/Demo01Action到struts.xml中就能找到在default包下的名为Demo01Action的action,然后通过class找到该action的所在位置,通过method找到需要执行的方法,通过方法的返回值找到result中是否有对应的值,找到了则进行跳转。

          根据这个例子,在回过头去看看struts2的架构图,然后在加以分析,

四、两个重要的配置文件

    注意:这里解释一下struts.xml中的package继承问题。上面继承了一个struts-default的包,想要查看它中的内容很简单,在我们加入的struts2-core-2.3.15.1.jar包找到struts-default.xml,在该配置文件中就有package为struts-default的内容。

                          

      第一个需要知道的配置文件:struts-default.xml

          从名字上看,就应该知道该是struts的一个默认的配置文件,而我们前面编写的一个startus.xml中应该会使用该默认配置文件中的内容,其中的格式跟我们写的struts.xml是一样的。

          分两大部分,

                第一部分 全是bean开头的配置,暂时不管他是干嘛用的,后面会学习,而我们的重点是第二部分

                第二部分 看到了熟悉的内容,package,并且该package的名字为struts-default。这就是我们需要查找的包,其中的内容包括了三个部分

1、<result-types></result-types>看到这里我们就明白为什么我们的结果中跳转页面的方式默认是dispatcher(转发),因为在继承的struts-default包中将其设置成了默认的,还有很多其他的type可选择,比如其中的redirect,就是重定向,比如redirectAction,从一个action跳到另一个action中执行。比如stream,文件上传时用的,等等这些等后面会详细讲到。有个大概映像即可

                      

2、<interceptors></interceptors>,这里是一系列的过滤器,就是我们讲的架构图中的那一系列拦截器,就是在这里给配置的。这里具体不讲解,后面会有章节进行讲解,有映像即可

3、最后一个是两个零碎的配置

                      

                      321行:配置说默认的一个拦截器为defaultStack,这是一个拦截器栈,其内容在第二部分中,

                      323行,这里说的class为在我们action中的class,如果不写则为com.opensymphony.xwork2.ActionSupport。ActionSupport这个类就我们下面要讲解的action继承它来当action,那时候再与普通类当action有什么区别。

      

            总结:struts-default.xml的功能就是将一些已经有的功能加入到配置文件中,然后让我们编写的struts.xml继承其中的包,那么我们就具备了这些功能,不用自己手动编写了,如果想在上面添加功能,在编写即可。到这里为止应该就解决了为什么要继承struts-default这个包了把。

      第二个配置文件:default.properties,这是一个常量的配置文件。其中放的都市常量。  

            

        比如:

           struts.i18n.encoding=UTF-8  设置请求乱码和响应乱码的常量

           struts.objectFactory = spring  这种带spring的都市和spring整合时需要用到的。现在不用管

           struts.multipart.saveDir=    文件上传时所存放的临时路径

           struts.action.extension=action,,  访问action时的后缀名可以为action,也可以什么都不写,就是通过这个常量设置

           struts.enable.DynamicMethodInvocation = true  是否采用动态方法,比如Demo01Action!add  通过!add来动态确定执行的哪个方法,在配置文件中就不用写method属性了

           struts.devMode = false    开发者模式,如果改为true,则修改了struts等配置文件,不用重启服务器即可生效,并且错误提示信息更多

           struts.ui.theme=xhtml     struts自带控件的一些布局,但是一般使用simple,页面的美化由美工处理。

          以上说的都是一些常见的常量,其他的等遇到了在说,重点了解设置编码和开发者模式和布局。其中这些常量的值可以在struts.xml通过<constant name="" value="">来配置。

五、action访问的两种方式

     前面几个部分介绍了什么是struts2?Struts2的helloworld,并且知道了struts2的架构流程图。知道了struts2的两个比较重要的配置文件的内容,现在来说说对于action访问的方式,在struts1中访问action,一般是带有后缀名为.do,而现在是为.action,为什么能这样写的原因在上面说明了,default-properties文件中就有这样一个常量来说明使用什么后缀访问。可以为.action也可以不写。所以在访问action时,一般为:http://localhost:8080/xxx/xxxAction.action

     但是写了几次helloworld之后,会发现一个缺点,一个action中有多少个方法,那么就需要在struts.xml中配置多少个个action,并且每个action就method的值改变了,其他都不变,所以为了改变这种状态,有三种方法可以解决。

     动态方法的调用

         在struts.xml中开启动态方法的使用。struts.enable.DynamicMethodInvocation = true

               

         那么就可以直接使用http://localhost:8080/xxx/xxxAction!add  直接调用xxxAction中的add方法了,并且在struts.xml中的action配置中,就不需要配置method属性的值了。这样做就解决了写死method值的问题

     通配符的使用

        这个比较重要,使用的比较多,即,<action name="userAction"> , action.name可以使用通配符星号(*),在action.class、aciton.method、result.name 处可以使用{n}方式匹配星号,举个例子就明白了

        案例一:<action name="userAction_*"> 在action.class、action.method、result.name三个地方可以使用{1}来获取第一个星号所匹配的内容

            请求路径:..../userAction_add   <action name="userAction_* class="..." method="{1}"/>    那么{1}拿到的内容则是add,将执行add方法

        案例二:<action name="userAction_*_*">  {1}匹配第一个*  {2}匹配第二个*    

            请求路径 :.../userAction_add_success   <action name="userAction_*_*" method="{1}"><result name="{2}">    

                  {1}匹配add方法,{2}匹配返回值的名称success   

        案例三:使用*_*_*,通过{1}{2}{3}获得,可以自己尝试。

     注意:package.namaspace的特点,当namespace为"/a"时,正常通过/a/xxxAction就能访问到,但是如果/a/b/c/xxxAction是否能访问到呢?答案是YES,因为会一层一层往下找,什么意思呢?

     http://localhost:8080/xxx/a/b/c/xxxAction 找不到,往下一层找

     http://localhost:8080/xxx/a/b/xxxAction 找,也找不到,继续往下

     http://localhost:8080/xxx/a/xxxAction 我们这里配置的namespace为"/a",所以就找到了,如果我们namespace="/",那么/a/b/c/xxxAction就访问不到了,只有/xxxAction能访问到。但是如果namespace="",那就找得到,什么都不写的意思是不管什么路径都能匹配到。

六、action类实现的三种方式

    6.1、普通类,上面写helloworld就是使用的普通类

    6.2、实现Action接口,重写excute方法,接口中就声明这一个方法。

    6.3、继承ActionSupport类,可以不必重写execute方法,只需要写自己想要的方法即可,一般开发中就使用这种方法,为什么呢?因为方便,ActionSupport类提供了一些我们所需要的常量,比如success字符串常量,内部还实现了execute方法,我们就不必自己写了。那么很多人就问,这不是多此一举吗?继承它跟不继承它的区别不大呀?哈哈,这样举个例子吧,你想追一个女孩子,有一天哪个女孩子哭了,擦泪的纸巾在女孩子的旁边,那个女孩子完全可以自己拿纸巾,但是你为了追她,体现自己好的一面,肯定是自己去拿纸巾出来递给她,虽然可能你拿比她自己拿更麻烦一点,但是这样让她对你更有好感呀, 那么这个继承actionSupport提供的一些常量等,也就是这个道理。并且它还不止止这点功能,它自己内部帮我实现了很多接口,后面会有讲解到,现在就晓得,以后写的话就通过这种方式去写action类。

    

七、总结

    这一节并没有什么特点难懂的东西,知道下面几点即可

        1、struts2的架构图,并且知道一个请求过来都做了些什么东西,是如何找到action的。

        2、struts2的两个重要的配置文件,一个default-properties,一个struts-default.xml。知道这两个配置文件在哪里,知道其中的一些大概的内容

        3、struts.xml的编写,和其中各种配置的含义

        4、会编写一个简单的helloworld。

Struts2学习(一)————Struts2入门的更多相关文章

  1. Struts2学习一----------Struts2的工作原理及HelloWorld简单实现

    © 版权声明:本文为博主原创文章,转载请注明出处 Struts2工作原理 一个请求在Struts2框架中的处理步骤: 1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2.这个请求 ...

  2. Struts2学习笔记--Struts2的体系结构

    1. Struts2体系结构 Struts是以前端控制器框架为主体的框架,用户的请求会通过控制器选择不同的Action类来执行具体的操作,在Action类中所有的Servlet对象(request.r ...

  3. Struts2学习笔记——Struts2与Spring整合

      Struts2与Spring整合后,可以使用Spring的配置文件applicationContext.xml来描述依赖关系,在Struts2的配置文件struts.xml来使用Spring创建的 ...

  4. struts2学习(2)struts2核心知识

    一.Struts2 get/set 自动获取/设置数据 根据上一章.中的源码继续. HelloWorldAction.java中private String name,自动获取/设置name: pac ...

  5. struts2学习(1)struts2 helloWorld

    一.struts2简介: 二.helloWorld: 1)工程结构: HelloWorldAction.java: package com.cy.action; import com.opensymp ...

  6. struts2学习(15)struts2防重复提交

    一.重复提交的例子: 模拟一种情况,存在延时啊,系统比较繁忙啊啥的. 模拟延迟5s钟,用户点了一次提交,又点了一次提交,例子中模拟这种情况: 这样会造成重复提交:   com.cy.action.St ...

  7. struts2学习(14)struts2文件上传和下载(4)多个文件上传和下载

    四.多个文件上传: 五.struts2文件下载: 多个文件上传action com.cy.action.FilesUploadAction.java: package com.cy.action; i ...

  8. struts2学习(13)struts2文件上传和下载(1)

    一.Struts2文件上传: 二.配置文件的大小以及允许上传的文件类型: 三.大文件上传: 如果不配置上传文件的大小,struts2默认允许上传文件最大为2M: 2097152Byte:   例子实现 ...

  9. struts2学习(12)struts2验证框架2.自定义验证

    一.例子需求: 对敏感词进行验证: 将struts包中的validators.xml文件拷贝一份到src目录下,在最后面添加自己的验证器: com.cy.validators.SensitiveWor ...

  10. struts2学习(11)struts2验证框架1.验证简介、内置验证

    一.Struts2验证简介: 二.struts2内置验证: 下面例子,需求是:为用户注册进行验证: com.cy.model.User.java: package com.cy.model; publ ...

随机推荐

  1. 重读<<大话设计模式>>读书笔记一

    面向对象编程几大原则: 1.简单工厂模式 解读:根据不同条件,动态创建合适的对象. 目的: 解决对象创建问题 举例: 计算器根据不同情况,创建适合的对象来处理数据. 2.策略模式 解读:也是根据不同的 ...

  2. assetBundle 中的prefeb资源图片显示粉色方框

    assetBundle打包的资源是有平台属性的,当移动端iOS或者Android AssetBundle资源 在editor 加载的时候,比如TextMeshPro中的字体就不能正确加载 pc端调试, ...

  3. [C#]GetFloat提示"指定的转换无效"

    数据库中没有double型,float就表示double值.sql server数据库字段类型与.net的数据类型的对应关系: real(数据库)<--> float(.NET)float ...

  4. Reading | 《TensorFlow:实战Google深度学习框架》

    目录 三.TensorFlow入门 1. TensorFlow计算模型--计算图 I. 计算图的概念 II. 计算图的使用 2.TensorFlow数据类型--张量 I. 张量的概念 II. 张量的使 ...

  5. django扩展User认证系统

    第一种方法proxy 如果你对Django提供的字段,以及验证的方法都比较满意,没有什么需要改的.但是只是需要在他原有的基础之上增加一些操作的方法.那么建议使用这种方式.示例代码如下: #在model ...

  6. Django Admin 专题

    Django admin Django强大的功能之一就是提供了Admin后台管理界面,简单配置就可以对数据库内容做管理 创建ModelAdmin并注册 from django.contrib impo ...

  7. Solutions and Summay for Linked List Naive and Easy Questions

    1.Remove Linked List Elements package linkedlist; /* * Question: Remove all elements from a linked l ...

  8. 用 Docker 构建、运行、发布来一个 Spring Boot 应用

    本文演示了如何用 Docker 构建.运行.发布来一个 Spring Boot 应用. Docker 简介 Docker 是一个 Linux 容器管理工具包,具备“社交”方面,允许用户发布容器的 im ...

  9. flask源码解析之上下文

    引入 对于flask而言,其请求过程与django有着截然不同的流程.在django中是将请求一步步封装最终传入视图函数的参数中,但是在flask中,视图函数中并没有请求参数,而是将请求通过上下文机制 ...

  10. Java实现大数相加、相乘(不使用BigInteger)

    大数相加: package algorithm; //使用BigInteger类验证 import java.math.BigInteger; public class BigAdd { public ...