struts2快速入门_day02



一:结果页面配置
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;
	}
	
}

最后:其实这些东西都很简单,本来懒得做笔记,但是既然学了,就顺便做一下笔记 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章