struts2(一) struts2入门
首先推荐一本书,虽然我还没看过,但是我以后肯定会看的,《Struts+技术内幕》提取密码:kg6w 。现在只是停留在会使用struts2的层次,自己也想继续深入研究,但是感觉自己的知识面还没那么广,那就等以后工作之后,在回过头来将那几个框架研究一下,写点有深度的文章,而此系列的文章,只是个人的学习记录,将一些重点的东西记录下来,以便以后的复习。谢谢
---WZY
一、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>
第三步:编写核心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>
第五步:测试
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入门的更多相关文章
- Struts2的国际化入门
Struts2的国际化入门 Struts2国际化是建立在Java国际化的基础上的,一样是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle加载指定Locale对应的资源文件,再 ...
- 18.如何自我Struts2它Struts2标签和综合汇总文章有点早
18.如何自我Struts2它Struts2标签和综合汇总文章有点早[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了.仅仅好传到百度云上: h ...
- 13.怎样自学Struts2之Struts2本地化[视频]
13.怎样自学Struts2之Struts2本地化[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了,仅仅好传到百度云上: http://pan ...
- 16.怎样自学Struts2之Struts2异常处理[视频]
16.怎样自学Struts2之Struts2异常处理[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了,仅仅好传到百度云上: http://pa ...
- 14.怎样自学Struts2之Struts2类型转换[视频]
14.怎样自学Struts2之Struts2类型转换[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了.仅仅好传到百度云上: http://pa ...
- 11.怎样自学Struts2之Struts2验证[视频]
11.怎样自学Struts2之Struts2验证[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了.仅仅好传到百度云上: http://pan. ...
- Struts2的经典入门
一:Struts2的起源与背景 在了解Struts2之前我们先来聊聊Struts1,我们都知道在很长的一段时间内,所有的MVC框架中,Struts1他是处于一个超级大咖的地位,无论是从市场角度和使用的 ...
- Struts2第一个入门案例
一.如何获取Struts2,以及Struts2资源包的目录结构的了解 Struts的官方地址为http://struts.apache.org 在他的主页当中,我们可以通过左侧的Apache ...
- 1.struts2原理和入门程序
Struts2是一个MVC的Web应用框架,是在Struts1和WebWork发展起来的,以WebWork为核心,采取拦截器机制来处理用户请求. 原理图: 分析步骤: 1.用户发送一个请求 2.请求的 ...
随机推荐
- 网站运维工具使用iis日志分析工具分析iis日志(iis日志的配置)
我们只能通过各种系统日志来分析网站的运行状况,对于部署在IIS上的网站来说,IIS日志提供了最有价值的信息,我们可以通过它来分析网站的响应情况,来判断网站是否有性能问题,或者存在哪些需要改进的地方 对 ...
- JSP编译为Java类
JSP编译为Java类: 注意可以随便写import的内容:可以写类属性.方法.main函数.内部类:可以使用内部类: JSP: <%@ page language="java&quo ...
- SuperSocket入门(一)-Telnet服务器和客户端请求处理
本文的控制台项目是根据SuperSocket官方Telnet示例代码进行调试的,官方示例代码:Telnet示例. 开始我的第一个Telnet控制台项目之旅: 创建控制台项目:打开vs程序,文件=> ...
- github使用介绍
github是个比较火的分布式版本管理工具,适合多人协同工作,感觉比svn好.下面简单介绍一下github使用以及把本地代码和github同步的方法. 首先注册账号 https://github.co ...
- Nagios 系统监控基本安装配置过程详解
Nagios 是一款免费的开源 IT 基础设施监控系统,功能强大,灵活性强,能有效监控 Windows.Linux.VMware 和 Unix 主机状态,交换机.路由器等网络设置等.一旦主机或服务状态 ...
- jmeter线程组配置
线程组配置 线程组相当于有多个用户,同时去执行相同的一批次任务.每个线程之间都是隔离的,互不影响的.一个线程的执行过程中,操作的变量,不会影响其他线程的变量值. Delay Thread creati ...
- SDWebImage源码解读之干货大总结
这是我认为的一些重要的知识点进行的总结. 1.图片编码简介 大家都知道,数据在网络中是以二进制流的形式传播的,那么我们该如何把那些1和0解析成我们需要的数据格式呢? 说的简单一点就是,当文件都使用二进 ...
- ubuntu 笔记一
注:ubuntu14.04 64位 1.刚安装的ubuntu无法在终端使用su 原因:root没有默认密码,需要手动设定. 解决方法:以具有sudo权限的用户登录 给root用户设置密码:打开一个te ...
- asp.net权限认证:OWIN实现OAuth 2.0 之授权码模式(Authorization Code)
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
- 为什么Java可以跨平台,而其他语言不行
你好 我是大福 你现在看的是大福笔记 今天复习了Java语言的概述 内容包括Java 语言的历史.语言特点及平台版本 JRE和JDK的区别 这篇文章的主题是总结下对Java语言特点中的跨平台原理. 在 ...