访问struts2的Action的方法有超链接(<a href="first.action">请求struts2</a>),表单提交等多种形式
struts2的struts.xml中package的namespace是逻辑地址,与webcontent下存放jsp的文件名无关
一. Struts2的配置:
-web.xml中声明Struts提供的过滤器
-在源码文件夹(如eclipse的src)下创建struts.xml,其中定义Struts2的Action对象
<struts>
<package name="user" extends="struts-default" (namespace=) (abstrace=)>
<action name="userAction" class="com.wgh.action.UserAction"(method="save") >
<result name="success" (type=) >success.jsp</result>
</action>
</package>
</struts>
包的配置:
配置名称空间: 使⽤用namespace来区分业务模块(如admin和user) 不同模块中同名⽅方法的调⽤
extends可以定义父包。一般是extends="struts-default" ,但是还可以继承自定义包,从而提高配置文件的重用性,如:
<package name="default" namespace="/" extends="struts-default">
<global-results>
<result name="ok">login_success.jsp</result>
<result name="error">login_failure.jsp</result>
<result name="add">usrLogin.jsp</result>
</global-results>
</package>
<package name="user" namespace="/" extends="default">
<action name="user_*" class="com.zhj.action.userAction4" method="user{1}" />
</package>
Action的相关配置:
在struts.xml⽂件中, action标签的class属性可以不写, struts2默认启⽤ActionSupport类。这样,result的name属性也可以不写(默认为success),因为ActionSupport类的execute()返回success。如:课本P176(3)
<struts>
<package name="user" extends="struts-default">
<action name="userAction" >
<result>success.jsp</result>
</action>
</package>
</struts>
当<result>元素未指定name属性时,默认值为success。
type属性用于设置返回结果的类型,如请求转发(type="dispatcher")和重定向等。
二.、Action对象
public class UserAction extends ActionSupport {
// ⽤户名属性
private String username;
// 为username提供setter⽅法
public void setUsername(String username) {
this.username = username;
}
// 为username提供getter⽅法
public String getUsername() {
return username;
}
public String execute() {
return SUCCESS;
}
}
通常情况下,创建Action对象都要直接或间接地实现Action接口(该接口定义了execute方法,和五个静态常量)。间接一般是指继承ActionSupport类(该类实现了Action接口,并且其execute()返回的是success),定义的Action类可以重写或者直接继承ActionSupport类的execute()。
但实际上,定义的Action类可以和Action接口无关,即不直接也不间接地实现Action接口。定义的Action类可以写或不写execute()。
调用一个Action对象,默认执行的是execute()方法。而在我们用了下面4后,就不用再管execute()了
实际上,后面我们会提到,由于业务逻辑复杂,我们基本上不会再用execute(),而是action中写多个处理业务逻辑的方法。
请求参数的注入原理:在Struts2框架之中,表单提交的数据会⾃动注⼊到与Action对象中相对应的属性。 要求:
(1). 表单中的参数名与action对象中的属性名相同
(2). Action中定义属性的setter⽅法
三、struts2的Action的工作流程:
jsp或html的表单提交——>
web.xml中配置的struts2过滤器根据表单action的内容进行过滤——>
先根据struts.xml中的action的name和class找到对应的actioin类——>
在action类中进行业务功能,并返回相应的值——>
struts.xml根据相应的值和处理结果——>
跳转到相应的jsp页面
四、 一个action中不同业务逻辑处理方法的调用:
(execute一般是用于单一业务逻辑,就算写成多个逻辑也很麻烦)
方法1.动态action正常的形式
action类中写不同业务逻辑的处理方法,jsp的表单中action="actionname!方法"
方法2.在struts.xml中配置action的method属性
action中内容为<action name="name1 " class="classname" method="方法1">
........
</action>
<action name="name2" class="classname" method="方法2">
........
</action>
..................
jsp的表单中action="action"(不需再写方法,因为struts.xml中规定访问这个action时直接调用这个action的某个方法)
方法3.使⽤用通配符
五、Struts2的标签库
可在jsp页面使用,在jsp顶部添加:<%@taglib prefix="s" uri="/struts-tags" %>
其中包括可代替html标签的表单标签
六、Action接收来自表单的数据的方法(都是IOC注入):(推荐使用ModelDriven,最方便)
方法1.表单提交的数据自动注⼊入action的相应属性(提供getter/setter⽅方法)
方法2.使⽤用DomainModel接收表单提交的数据
action的属性类型是实体类型
注意:表单中收集数据input的name=对象.属性名(user.username)
方法3.使⽤用ModelDriven来接收表单数据
要求:该action类实现ModelDriven接口,并需要实例化属性(user对象)。
四、 在实际应用中,为了实现不同业务模块的划分通常使用namespace(webcontent中的jsp也是按模块划分),不写默认是根目录/。
struts.xml中<package name=" " namespace="/或者/user等" extends="struts-default">
..........(中可写多个action)
</package>
jsp的表单中action="user/check.action>
或超链接中<a href="admin/check.action>admin</a>
七、action中访问web对象 ———request/session/application
可在jsp中使用request/session/application展示信息
方法1.使用Map对象
在action类中 添加构造函数并在其中给request/session/application赋值,在execute()或业务处理方法中给request/session/application添加键值对
在jsp中使用request/session/application展示信息
方法2.实现RequestAware,SessionAware,ApplicationAware接口
八、Struts2的拦截器
九、数据验证机制