1.
2.Struts2
2.1 Introduction
2.1.1 历史背景
Apache 旗下
Struts1 – apache 自己搞的 大部分废弃了。
Xwork mvc框架 非常好用
Struts2- 整合xwork的mvc框架
2.1.2 好处
• Strust2 核心功能:
• 允许POJO(Plain Old Java Objects)对象 作为Action
• Action的execute 方法不再与Servlet API耦合,更易测试
• 基于Spring AOP思想的拦截器机制,更易扩展
• 更强大、更易用输入校验功能
• 等等
2.1.3缺点
安全性 有待提高。
2.2 入门案例
访问一个url,通过struts2框架去处理请求,给到一个动作方法,login
并返回结果视图。Ok.jsp
2.2.1 jar包介绍
2.2.2 代码
• Step1 在web.xml里配置核心过滤器
• Step2 配置struts.xml
放在src 下即可
写什么
动作类(Action)
小结:
入门案例的书写步骤:
• 前提,环境配置OK
• 0 配置web.xml里的核心过滤器
• 1.写structs.xml里的配置
• 2.写对应的action类
• 3.写前端你想访问的url
• 4.写对应的action执行成功的结果视图
2.2.3 每次请求的执行流程
2.2.4 Struts2的架构
2.2.5 Struts2的配置文件
1. default.properties
struts.devMode = false 如果是开发的话,设置为true
<constant name="struts.devMode" value="true" />
我们的struts2框架默认只处理两种url,
一种是url后面没有任何后缀的,
还有一种是有 .action结尾的这些url
struts.action.extension=action,,
2. struts-default.xml
2 | struts-default.xml | struts2-core-2.3.15.3.jar | 不能修改 |
定义了一个父包,让我们去继承
定了很多的拦截器。
3.strtuts-plugin.xml
当我们引入了一些struts2额外支持的功能。
就需要引入struts-xxx-plugin.jar
这些jar包的根目录下都会有 这种plugin的配置文件,这些文件通常会增加一些额外的配置。
4.struts.xml
我们自己使用struts2框架的时候,需要在这里配置我们的东西
5.web.xml
可以覆盖掉之前的配置
2.3 Struts.xml配置详解
2.3.1 Constant
可以用来修改struts的default.properties默认配置
2.3.2 package
包
可以把动作划分不同的包 去管理
可以给不同的包设置不同的namespace
2.3.3 name(pakeage中的name)
定义这个包的名字,不能跟其他包一样。
2.3.4 extends
表示我这个包里继承的父包是谁
2.3.5 abstract
如果一个包声明为抽象的,里面不能定义任何的action
通常用于给子包去继承。
2.3.6 namespace
给这个包里的动作增加一个前缀
必须以“/”开始, 不以 ”/”结尾 可以写多级
能不能为“” 可以
能不能为“/”可以
Namespace对于我们访问的url
能不能不写? 可以 不写相当于 “”
不同的namespace 对于我们访问路径的映射规则
(先找精确匹配,没有再找上一级匹配,再上一级....如果全都不匹配,会再找 namespace=”/”是否有,如果 / 也没有,就会匹配什么都没有的情况 namespace=”” ——localhost/ + action的name)
默认包:namespace没有写或者namespace="”
2.4 Action
2.4.1 Name
表示动作的名称,他应该与我们url里的动作名称匹配
不能加/开始 ,不能写多级,否有歧义。
也不要加后缀,语义会变化。
如下案例,给action的name增加后缀,hello.do
匹配的是
http://localhost/a/hello.do.do
而不能匹配
2.4.2 Class
• 指定的响应该url请求的动作类 (每次请求实例化一个)
2.4.3 Method
具体要执行的动作方法 写方法名即可。
没有指定method里的名字的话,就执行execute方法
当一个类实现了Action接口,里面有个需要覆盖的方法String execute();这个就是execute方法,如果action节点没有指定method方法,就会默认执行这个execute方法。
2.5 Struts2的动作类(Controller)的写法
2.5.1 第一种写法:
2.5.2 第二种写法:实现一个Action接口。重写他的方法。
这里面需要强制去实现一个execute方法。这方法的作用是:
当你的action里没有指定当前的url去执行的方法的时候,就执行默认的execute方法
2.5.3 第三种。看看Action 接口有无实现类。 有 继承ActionSupport类
有默认的execute方法
Action接口:
2.6 Result
2.6.1 Name
跟动作方法的返回值对应,表示该返回值去显示拿个页面
如果没有配置name,name的默认值是 success
2.6.2 页面地址
2.6.2.1 以/开头的绝对地址
可以写以”/”开始的地址,表示相对于web根目录的绝对地址(推荐使用的)
2.6.2.2 不以/开头的相对路径
也可以不以/ 开始,表示一个相对于当前的请求路径的相对地址
http://localhost/user/test/bbb/hello.wangdao
如果结果地址是
<result name="error">error.jsp</result>
返回的路径就是:
/user/test/bbb/error.jsp
2.6.3 Type
1.type="dispatcher"
内部转到另一个结果视图 转发到jsp
2. type="redirect"
重定向资源
3. chain —— Action转发
同一个包的转发
不同包转发
4. redirectAction —— Action重定向。
同一个包的动作的重定向
不同包的动作的重定向
2.7 其他补充
2.7.1.配置默认Action
我们可以给一个package里设置一个默认的动作类。
当这个package里的所有的动作名都不匹配的话,会直接执行这个默认动作类的动作。
2.7.2 配置Action 默认类
在我们的父包里定义了一个默认的动作类
如果一个action里没有指定的class,就使用上面定义的默认类。
所以看到如下这种case,这个动作类就是使用的是default-class-ref
2.7.3 局部结果
• 将<result>作为<action>子元素配置
2.7.4 全局结果(包的全局结果,只针对当前包)
如果发现这个包下的很多局部结果视图一模一样,就可以提出去
如果既有局部结果视图,又有全局结果视图,而且两个的名字一样,就近原则。
先使用局部的。
2.7.5 Struts配置文件分开写
自配置文件里根节点也是
2.7.6 动作方法里引用ServletAPI
1. 方法1(在动作类的方法中,推荐使用)
2. 方法2(实现一个接口ServletRequestAware/ServletResponseAware)