一:结果页面配置
1.1:全局结果页面
假如多个Action最终返回的页面是一样的,我们是这样写的,
无论访问http://localhost:8080/项目名/JapanAction或者ChinaAction.action,最终都是访问earth.jsp这个页面
但是<result name="success">/earth.jsp</result>部分就重复了
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="resultPageConfig" extends="struts-default" namespace="/">
<action name="ChinaAction" class="cn.itcast.结果页面配置.GlobalResultPageAction" method="method1">
<result name="success">/earth.jsp</result>
</action>
<action name="JapanAction" class="cn.itcast.结果页面配置.GlobalResultPageAction" method="method2">
<result name="success">/earth.jsp</result>
</action>
</package>
</struts>
使用全局结果页面后:
<struts>
<package name="resultPageConfig" extends="struts-default" namespace="/">
<global-results>
<!--只能在此package下有效 -->
<result name="success">/earth.jsp</result>
</global-results>
<action name="ChinaAction" class="cn.itcast.结果页面配置.GlobalResultPageAction" method="method1">
<!-- <result name="success">/earth.jsp</result> -->
</action>
<action name="JapanAction" class="cn.itcast.结果页面配置.GlobalResultPageAction" method="method2">
<!-- <result name="success">/earth.jsp</result> -->
</action>
</package>
</struts>
1.2:局部结果页面:就是类似这种
<action name="ChinaAction" class="cn.itcast.结果页面配置.GlobalResultPageAction" method="method1">
<result name="success">/earth.jsp</result>
</action>
1.3:result标签的type属性
针对jsp的转发和重定向:dispatcher, redirect
针对Action的转发和重定向, chain(一般不用,有缓存),redirectAction
<package name="resultTypeAttrbute" extends="struts-default" namespace="/">
<action name="JspAction" class="cn.itcast.结果页面配置.JspAction" method="method3">
<!--针对页面:type属性值默认是转发dispatcher,我这里设置重定向操作: 奇怪的是它这里重定向/也是相对于项目下,可能做了封装 -->
<result name="success" type="redirect">/index.jsp</result>
</action>
<action name="FirstAction" class="cn.itcast.结果页面配置.FirstAction" method="method4">
<!--针对Action类,type属性值等于chain是转发操作,等于redirectAction是重定向操作,内容写另一个Action标签的name属性值就行 -->
<result name="success" type="redirectAction">TwoAction</result>
</action>
<!--让它没有返回值,Action类中可以return 一个Action.NONE就行 -->
<action name="TwoAction" class="cn.itcast.结果页面配置.TwoAction" method="method5">
</action>
</package>
二:在action类中获取表单提交数据(三种方式)
其实感觉跟原生的Servlet区别不是很大,换汤不换药
2.1:使用ActionContext
ActionContext.getContext().getParameters(); //跟Servlet中request.getParameters()差不多
2.2:使用ServletActionContext
ServletActionContext.getRequest().getParameter("xxx");//这个和原生的Servlet获取表单的值,我看不出有什么区别???
2.3:使用接口注入:我感觉比原生的Servlet还麻烦,没什么卵用
注:这里和Servlet我感觉没什么区别,甚至感觉还麻烦些!
三:struts2提供获取表单数据方式
3.1:属性封装: 直接把表单提交属性封装到action的属性里面(会用)
实现步骤
(1)在action成员变量位置定义变量
- 变量名称和表单输入项的name属性值一样
(2)生成变量的set方法(把set和get方法都写出来)
(3)使用属性封装获取表单数据到属性里面,不能把数据直接封装到实体类对象里面
public class AttributeAction extends ActionSupport{
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
//可以获取到
System.out.println(username+":"+password);
return Action.NONE;
}
}
注:个人感觉不怎么样!!
3.2:模型驱动封装:可以直接把表单数据封装到实体类对象里面(掌握)
(1)实现ModelDriven<T>接口,T里面的属性必须和表单name属性值保持一致
(2)在action类的成员位置,创建一个T对象,在getModel的方法中返回就行
/**
* 模型驱动封装
* @author wzj
*
*/
public class ModelDriverAction extends ActionSupport implements ModelDriven<User>{
//创建对象
private User user = new User();
@Override
public String execute() throws Exception {
System.out.println(user);
return Action.NONE;
}
@Override
public User getModel() {
return user;
}
}
注:它可以根据User中的属性类型,自动帮你转换,然后封装到User对象中,跟我在Servlet时期使用BeanUtils工具差不多!
3.3:表达式封装(会用)
(1)在Action类中声明对应的实体类,并给出get/set方法
(2)在表单输入项的name属性值里面写表达式形式
public class ExpressionAction extends ActionSupport{
//1.声明实体类
private User user;
//2.get/set方法
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
return Action.NONE;
}
}
注:模型驱动和表达式封装的区别!
使用模型驱动只能把数据封装到一个实体类中
使用表达式封装可以把数据封装到不同实体类中
四:表单数据封装到集合里面:
4.1:封装数据到List集合
步骤:在Action类中声明List,并提供get/set方法
在表单输入项中填表达式
public class ListAction extends ActionSupport{
//1.声明一个List集合
private List<User> list;
public List<User> getList() {
return list;
}
public void setList(List<User> list) {
this.list = list;
}
@Override
public String execute() throws Exception {
System.out.println(list);
return Action.NONE;
}
}
最后:其实这些东西都很简单,本来懒得做笔记,但是既然学了,就顺便做一下笔记