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提交属性注入,这种是静态流入,参数写死