Struts配置文件主要元素
package:
属性
name:包的名称,必须写,而且唯一
extends:一般情况下需要继承struts-default包,但不是必须的。如果不继承,将无法使用struts2提供的核心功能,struts-default.xml中定义着struts-default这个包,struts-default.xml是在struts.xml加载之前加载
abstract:把包声明为抽象包,是用来继承的,只要是没有<action>元素的包,就可以声明为抽象包
namespace:名称空间。访问路径=名称空间+动作名称
namespace详解
namespace的默认取值是一个"",默认值不是/,写自定义的namespace时需要加/

访问路径为http://localhost:8080/Struts2Day1/user/hello.action
如果访问http://localhost:8080/Struts2Day1/a/b/user/hello.action是访问不了的
但是访问http://localhost:8080/Struts2Day1/user/a/b/hello.action是可以访问的
namespace查找规则

action详解
作用是配置动作,处理请求路径
属性
name:动作名称
class:动作类全名
method:动作类中的方法名称。默认是public String execute(){}
方法要求:必须是public,返回值类型必须是String,没有参数
动作类第一种写法
直接在写个Action类,不需要继承任何类,然后在struts.xml中配置


动作类第二种写法
写个Action类实现Action接口,然后实现excute方法


Action接口中,有一些静态常量


动作类第三种写法
写个Action类继承ActionSuport类,ActionSupport是实现Action接口的类


默认动作类


修改默认动作类
自定义一个默认动作类

在struts.xml中配置默认动作类引用

动作访问之通配符
案例:用户的增删改查



访问路径是
http://localhost:8080/Struts2Day2/user/add
http://localhost:8080/Struts2Day2/user/delete
http://localhost:8080/Struts2Day2/user/find
http://localhost:8080/Struts2Day2/user/update
*号通配符优化struts.xml代码

多个*号通配符



访问路径
http://localhost:8080/Struts2Day2/student/add_Student
http://localhost:8080/Struts2Day2/student/delete_Student
优先级:绝对匹配优先,使用通配符的按照在配置文件中的先后顺序进行匹配的
动态方法的调用


访问路径
http://localhost:8080/Struts2Day2Demo1/student!addStudent
http://localhost:8080/Struts2Day2Demo1/student!deleteStudent
result元素
为动作指定结果视图
属性
name:逻辑视图的名称,对应着动作方法的返回值。默认值是success
type:结果类型,指的就是用什么方式转到定义的页面。默认是dispatcher转发
result中type的取值有四种类型

redirect重定向


访问路径http://localhost:8080/Struts2Day2Demo1/n1/demo1
访问成功显示路径

chain 转发到同一个名称空间不同的动作



访问路径http://localhost:8080/Struts2Day2Demo1/n1/demo1
浏览器显示demo2动作转发的内容,地址不变

redirectAction 重定向到同一命名空间的不同动作

访问路径http://localhost:8080/Struts2Day2Demo1/n1/demo1
浏览器显示demo2动作转发的内容,地址改变

chain 转发到不同命名空间的动作



访问路径http://localhost:8080/Struts2Day2Demo1/n1/demo1
浏览器显示demo3动作内容,地址栏不变

redirectAction转发到不同命名空间的动作

访问路径http://localhost:8080/Struts2Day2Demo1/n1/demo1
浏览器显示demo3动作内容,地址栏改变

result元素中param子元素
在转发或者重定向到不同包下的动作时,都用到了result元素的子元素param。param元素体现依赖注入(Dependence Injection)思想。通过struts-default.xml中的resultTypes元素中配置可以看出,每个结果类型视图其实都是靠一个类来实现的,而param元素就是将配置的参数注入到该类中,调用的是对应类的setter方法进行注入的。
自定义结果类型
其实结果类型就是一个类,这些类都实现com.opensymphony.xwork2.Result接口,或者继承自该接口的实现类org.apache.struts2.dispatcher.StrutsResultSupport,这些类都有一个doExecute方法,用于执行结果视图,struts内部实现就是Servlet
案例:输出CAPTCHA(验证码)图像的结果类型
定义验证码结果类型处理类

struts.xml配置结果类型和一个默认的action

访问路径http://localhost:8080/Struts2Day2Demo2/n1/checkcode
显示结果

优化自定义结果类型
更加灵活的设置验证码的宽度和高度
给结果类添加width和height的属性和get/set方法

修改struts.xml文件,通过param元素注入结果类型属性值

结果显示

全局视图和局部视图
前面的自定义结果类型的写法是局部视图,其它包是不能访问的
全局视图的配置
写一个包,名为myDefault,里面写全局的配置
其它包继承myDefault包

定义全局结果视图,继承的包可以使用结果视图

动作类中的servlet api访问
通过ServletActionContext获取

通过注入方式:先让Action实现两个接口ServletRequestAware,ServletResponseAware,在Action类中声明HttpServletRequest和HttpServletResponse两个属性

多个struts配置文件
多个struts配置文件的用途是为了模块开发和减少开发中的冲突


Action接收请求参数的方式
通过Servlet方式获取


通过Action的属性的set方法注入
在Action类声明属性,添加set方法

通过Action的属性的set模型的形式注入
User.java模型:提供属性的get/set方法

把参数封装到一个User模型中,然后Action提供模型的get/set方法

表单传入参数名称需要是Action对象名称+"."+对象属性

运行项目,打印结果输出

打印顺序原因,Struts首先调用getUser获取user对象,发现只是声明没有创建,则会创建user对象,调用setUser注入,然后调用getUser对象获取user对象为user对象相应属性注入
通Action模型驱动封装参数


参数注入的原理
参数自动注入是因为有两个拦截器在工作,查看struts.xml源码发现有两个拦截器
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
静态参数注入
struts可以通过在action中静态注入参数,然后在Action提交属性注入,这种是静态流入,参数写死

254

被折叠的 条评论
为什么被折叠?



